Деактивация товаров при обмене - что происходит с исчезнувшими позициями
Разбираемся, почему снятые с продажи позиции остаются на витрине, и убираем то, чего в учётной системе больше нет.
Решение
Смотрим, когда товары обновлялись в последний раз:
$res = CIBlockElement::GetList(['TIMESTAMP_X' => 'ASC'], [ 'IBLOCK_ID' => 5, 'ACTIVE' => 'Y', '<TIMESTAMP_X' => date('d.m.Y', strtotime('-7 days')),], false, ['nTopCount' => 20], ['ID', 'NAME', 'TIMESTAMP_X', 'XML_ID']);while ($row = $res->GetNext()) { printf("%-30s обновлён=%s код=%s\n", mb_substr($row['NAME'], 0, 30), $row['TIMESTAMP_X'], $row['XML_ID']);}Товары, не обновлявшиеся дольше периода обмена, - главные кандидаты в исчезнувшие. Обмен трогает каждую приехавшую позицию, и дата изменения у неё обновляется даже без правки данных.
Проверяем режим выгрузки на стороне учётной системы:
# в файле каталога видно, полная это выгрузка или только измененияgrep -o 'СодержитТолькоИзменения>[^<]*' \ /home/bitrix/www/upload/1c_catalog/import*.xml | head -3При выгрузке только изменений сайт получает часть каталога и не имеет права решать, что делать с остальными позициями. Деактивация исчезнувших товаров работает только при полной выгрузке.
Включаем деактивацию в настройках приёма:
// поведение с товарами, которых нет в очередной полной выгрузкеCOption::SetOptionString('catalog', '1C_TRANSLIT_ON_ADD', 'Y');COption::SetOptionString('catalog', '1C_DEACTIVATE', 'Y'); // снимать с публикацииCOption::SetOptionString('catalog', '1C_DELETE', 'N'); // не удалять насовсемДеактивация снимает товар с витрины, оставляя его в базе. Удаление разрывает связи с заказами и историей продаж, поэтому его включают только осознанно и на свежих каталогах.
Снимаем с публикации остатки прошлого каталога:
$res = CIBlockElement::GetList([], ['IBLOCK_ID' => 5, 'ACTIVE' => 'Y', '<TIMESTAMP_X' => $lastExchangeDate], false, false, ['ID']);$el = new CIBlockElement();while ($row = $res->Fetch()) { $el->Update($row['ID'], ['ACTIVE' => 'N']); // разово, после сверки списка}Разовая чистка нужна там, где деактивация была выключена месяцами. Список перед запуском обязательно просматривают: одна ошибка в дате отправляет в архив половину живого каталога.
Товары, заведённые на сайте руками, при полной выгрузке тоже попадают под деактивацию: у них нет внешнего кода, и обмен считает их лишними. Такие позиции держат в отдельном инфоблоке или заводят им внешние коды, которых нет в учётной системе.
Перед первой полной выгрузкой с включённой деактивацией стоит сделать резервную копию. Ошибка в настройке отбора на стороне учётной системы обходится в архив половины каталога, а откат из копии занимает минуты.
Удаление товара из учётной системы и снятие с продажи - разные события. Первое приводит к исчезновению позиции из выгрузки, второе может приезжать признаком в свойствах. Второй путь надёжнее: сайт узнаёт о решении явно, а не по отсутствию записи.
Типичные проблемы
Снятые с продажи товары остаются на витрине.
Обмен идёт в режиме только изменений. В нём сайт не знает, какие позиции исчезли из каталога.
После обмена деактивировался почти весь каталог.
Полная выгрузка пришла неполной - оборвалась на середине. Признак деактивации применился к тому, что не успело приехать.
Товары, заведённые вручную, пропали с сайта.
У них нет внешнего кода, и полная выгрузка сочла их лишними. Такие позиции держат отдельно от выгружаемого каталога.
Удалённые товары ломают старые заказы.
Включено удаление вместо деактивации. Позиции заказов ссылаются на элементы каталога, и связь теряется.
Товар деактивирован, но виден в поиске.
Поисковый индекс не переиндексирован. Он хранит своё состояние и обновляется отдельно от каталога.
Частые вопросы
Чем полная выгрузка отличается от выгрузки изменений?
Полная передаёт весь каталог целиком, и сайт может судить об исчезнувших позициях. Выгрузка изменений быстрее, но такого права не даёт.
Как часто делать полную выгрузку?
Обычно раз в сутки или в неделю, ночью: она тяжелее обычного обмена. Между полными выгрузками идут выгрузки изменений.
Что выбрать - деактивацию или удаление?
Деактивацию почти всегда: она обратима и не рвёт связи с заказами. Удаление оправдано только на каталоге без истории продаж.
Как вернуть ошибочно деактивированные товары?
Массовым включением по дате изменения: она у них общая, раз деактивация прошла одним проходом. Поэтому перед чисткой и записывают дату.
Смежное
-
Обмен: выгрузка товаров - оглавление подтемы
-
Выгрузка товаров из 1С на сайт - как приезжает каталог
-
Не выгружаются товары из 1С - когда позиции не приезжают вовсе
-
Обмен с 1С и HTTP - устройство обмена целиком
-
Частичный обмен: выгрузка только изменений и её последствия - почему исчезнувшие позиции остаются активными
-
Импорт каталога изнутри: файлы, сопоставление, перезапись - откуда берётся массовая деактивация