Как удалить товар на сайте Bitrix при обмене с 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Одной из наиболее распространенных проблем при интеграции 1С:Предприятие и 1С-Битрикс является ситуация, когда товары, исключенные из выгрузки в учетной системе, продолжают «висеть» на сайте. Многие пользователи ошибочно полагают, что достаточно просто снять галочку «Выгружать на сайт» в карточке номенклатуры или установить фильтр в настройках обмена. Однако в режиме выгрузки изменений (инкрементальный обмен) 1С просто перестает отправлять информацию о таком товаре, а Bitrix, не получив новых данных, оставляет старую карточку нетронутой.

В этой статье мы подробно разберем механизмы работы обмена, выясним причину такого поведения систем и рассмотрим несколько эффективных способов решения задачи: от штатных настроек до доработки программного кода.

Почему товар не удаляется автоматически при частичной выгрузке?

Проанализируем логику обмена данными — поможет инструмент отладки и анализа HTTP-запросов интеграции. Когда мы используем режим «Выгружать только изменения», 1С формирует файл offers.xml или import.xml, в который попадают только те объекты, которые были изменены с момента последнего обмена. Если мы исключаем товар из отбора (например, с помощью фильтра по свойству), 1С просто игнорирует этот объект. В результате в XML-файле информация о товаре отсутствует вовсе.

Для системы 1С-Битрикс отсутствие товара в файле изменений не является сигналом к его удалению. Сайт «думает», что с этим товаром просто ничего не происходило. Чтобы товар был удален или деактивирован, он обязательно должен попасть в файл выгрузки, но со специальным признаком статуса.

Способ 1: Использование стандартных настроек модуля интеграции в Bitrix

Прежде чем приступать к программированию, рассмотрим штатные возможности административной панели Bitrix. Перейдем в раздел Магазин -> Настройки -> Интеграция с 1С. На вкладке «Каталог» найдем параметр «Действие над товарами, отсутствующими в файле импорта».

Здесь доступны три варианта:

  1. Ничего не делать — стандартное поведение, при котором лишние товары остаются на сайте.
  2. Деактивировать — товар остается в базе данных, но его флаг Активность снимается, и он пропадает из публичной части сайта. Это наиболее безопасный вариант.
  3. Удалить — карточка товара полностью стирается из базы сайта.

Важное ограничение: Эти настройки корректно работают только при полной выгрузке данных. Если вы используете обмен изменениями, Bitrix не может знать, отсутствует ли товар в файле потому, что он удален, или потому, что он просто не менялся. Поэтому для очистки сайта от «мусора» рекомендуется периодически (например, раз в неделю ночью) запускать полную выгрузку всех товаров.

Способ 2: Деактивация через пометку удаления в 1С

Разберем, как работает стандартный механизм передачи статуса. Если в 1С пометить объект номенклатуры на удаление (установить стандартный признак ПометкаУдаления), модуль обмена зарегистрирует это изменение — решается через обработка управления регистрацией объектов в планах обмена. При следующей выгрузке в XML-файле для данного товара появится атрибут Статус="Удален" (или соответствующее значение в теге StatusXmlId).

Bitrix, видя этот статус, автоматически деактивирует товар на сайте. Это «чистый» способ, не требующий написания кода, но он обязывает вас помечать товар на удаление в самой 1С, что не всегда удобно, если вы просто хотите скрыть позицию из продажи, но оставить её в учете.

Способ 3: Создание пользовательского свойства «Выводить на сайт»

Если нам нужно скрыть товар, не помечая его на удаление в 1С, мы можем реализовать собственную логику. Рассмотрим алгоритм действий:

  1. В 1С добавим дополнительное свойство для номенклатуры с типом Булево, назовем его «Показывать на сайте» — для этого подойдёт инструмент для массового изменения свойств номенклатуры.
  2. Настроим выгрузку этого свойства в Bitrix в настройках обмена.
  3. На стороне Bitrix создадим обработчик события, который будет анализировать это свойство при импорте.

Если пользователь в 1С снимает галочку, информация об изменении свойства попадает в файл обмена. Bitrix обновляет значение свойства в своей базе. Чтобы товар при этом деактивировался, можно использовать следующий код в файле /bitrix/php_interface/init.php:


AddEventHandler("catalog", "OnSuccessCatalogImport1C", "CustomDeactivateProducts");

function CustomDeactivateProducts($arParams, $arFields)
{
    // Логика: находим товары, у которых наше свойство "Показывать на сайте" равно Ложь
    // и устанавливаем им параметр ACTIVE = "N"
    $propertyCode = "SHOW_ON_SITE"; // Символьный код свойства в Bitrix
    
    $res = CIBlockElement::GetList([], ["IBLOCK_ID" => $arParams["IBLOCK_ID"], "PROPERTY_".$propertyCode."_VALUE" => "Нет"], false, false, ["ID"]);
    while($ob = $res->Fetch())
    {
        $el = new CIBlockElement;
        $el->Update($ob["ID"], ["ACTIVE" => "N"]);
    }
}

Способ 4: Доработка логики на стороне 1С (Формирование XML)

Проанализируем ситуацию, когда мы хотим, чтобы 1С сама сообщала сайту об удалении товара, даже если он не помечен на удаление физически. Для этого потребуется вмешательство в модуль обмена (через расширение) — поможет расширение для двусторонней синхронизации 1С и Bitrix.

Нам нужно перехватить момент формирования XML и для товаров, которые не проходят по нашим критериям выгрузки, принудительно добавить тег Статус со значением Удален. Рассмотрим схематичный пример того, как это может выглядеть в коде 1С при формировании структуры выгрузки:


// В процедуре заполнения данных для выгрузки номенклатуры
Если Не ТоварДолженБытьНаСайте(ТекущаяНоменклатура) Тогда
    // Если товар не должен быть на сайте, мы все равно включаем его в выгрузку,
    // но явно указываем статус удаления
    ДанныеОбъекта.Вставить("Статус", "Удален");
    ДанныеОбъекта.Вставить("Активность", Ложь);
КонецЕсли;

В этом случае, даже при выгрузке изменений, товар попадет в файл, и Bitrix, считав статус, выполнит деактивацию карточки. Это самый надежный программный метод, так как он не требует периодических полных выгрузок.

Способ 5: Скрытие товаров с нулевым остатком

Выясним еще одну простую причину, по которой товары могут мешать на сайте: они просто закончились — есть готовая автоматическая пометка на удаление товаров с нулевыми остатками. Вместо удаления товара, его можно автоматически скрывать, когда остаток становится равным нулю. Это настраивается полностью на стороне Bitrix и не требует вмешательства в 1С.

Выполним следующие шаги в админ-панели сайта:

  1. Перейдем в Настройки -> Настройки продукта -> Настройки модулей -> Торговый каталог.
  2. Найдем опцию «Разрешить покупку при отсутствии товара» и убедимся, что она выключена.
  3. В настройках компонентов списка товаров (catalog.section) на страницах сайта включите опцию «Не показывать товары, которых нет на складах».

Таким образом, если в 1С обнулится остаток и эта информация уйдет на сайт, товар автоматически перестанет отображаться для покупателей, хотя физически карточка останется активной в базе данных.

Резюме и рекомендации

Подводя итоги, выделим основные правила управления актуальностью каталога:

Помните, что удаление товара — процесс необратимый (теряются SEO-метатеги, комментарии, история продаж), поэтому в большинстве случаев деактивация предпочтительнее полного удаления карточки с сайта.

← На главную