Одной из наиболее распространенных проблем при интеграции 1С:Предприятие и 1С-Битрикс является ситуация, когда товары, исключенные из выгрузки в учетной системе, продолжают «висеть» на сайте. Многие пользователи ошибочно полагают, что достаточно просто снять галочку «Выгружать на сайт» в карточке номенклатуры или установить фильтр в настройках обмена. Однако в режиме выгрузки изменений (инкрементальный обмен) 1С просто перестает отправлять информацию о таком товаре, а Bitrix, не получив новых данных, оставляет старую карточку нетронутой.
В этой статье мы подробно разберем механизмы работы обмена, выясним причину такого поведения систем и рассмотрим несколько эффективных способов решения задачи: от штатных настроек до доработки программного кода.
Проанализируем логику обмена данными — поможет инструмент отладки и анализа HTTP-запросов интеграции. Когда мы используем режим «Выгружать только изменения», 1С формирует файл offers.xml или import.xml, в который попадают только те объекты, которые были изменены с момента последнего обмена. Если мы исключаем товар из отбора (например, с помощью фильтра по свойству), 1С просто игнорирует этот объект. В результате в XML-файле информация о товаре отсутствует вовсе.
Для системы 1С-Битрикс отсутствие товара в файле изменений не является сигналом к его удалению. Сайт «думает», что с этим товаром просто ничего не происходило. Чтобы товар был удален или деактивирован, он обязательно должен попасть в файл выгрузки, но со специальным признаком статуса.
Прежде чем приступать к программированию, рассмотрим штатные возможности административной панели Bitrix. Перейдем в раздел Магазин -> Настройки -> Интеграция с 1С. На вкладке «Каталог» найдем параметр «Действие над товарами, отсутствующими в файле импорта».
Здесь доступны три варианта:
Активность снимается, и он пропадает из публичной части сайта. Это наиболее безопасный вариант.Важное ограничение: Эти настройки корректно работают только при полной выгрузке данных. Если вы используете обмен изменениями, Bitrix не может знать, отсутствует ли товар в файле потому, что он удален, или потому, что он просто не менялся. Поэтому для очистки сайта от «мусора» рекомендуется периодически (например, раз в неделю ночью) запускать полную выгрузку всех товаров.
Разберем, как работает стандартный механизм передачи статуса. Если в 1С пометить объект номенклатуры на удаление (установить стандартный признак ПометкаУдаления), модуль обмена зарегистрирует это изменение — решается через обработка управления регистрацией объектов в планах обмена. При следующей выгрузке в XML-файле для данного товара появится атрибут Статус="Удален" (или соответствующее значение в теге StatusXmlId).
Bitrix, видя этот статус, автоматически деактивирует товар на сайте. Это «чистый» способ, не требующий написания кода, но он обязывает вас помечать товар на удаление в самой 1С, что не всегда удобно, если вы просто хотите скрыть позицию из продажи, но оставить её в учете.
Если нам нужно скрыть товар, не помечая его на удаление в 1С, мы можем реализовать собственную логику. Рассмотрим алгоритм действий:
Булево, назовем его «Показывать на сайте» — для этого подойдёт инструмент для массового изменения свойств номенклатуры.Если пользователь в 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"]);
}
}
Проанализируем ситуацию, когда мы хотим, чтобы 1С сама сообщала сайту об удалении товара, даже если он не помечен на удаление физически. Для этого потребуется вмешательство в модуль обмена (через расширение) — поможет расширение для двусторонней синхронизации 1С и Bitrix.
Нам нужно перехватить момент формирования XML и для товаров, которые не проходят по нашим критериям выгрузки, принудительно добавить тег Статус со значением Удален. Рассмотрим схематичный пример того, как это может выглядеть в коде 1С при формировании структуры выгрузки:
// В процедуре заполнения данных для выгрузки номенклатуры
Если Не ТоварДолженБытьНаСайте(ТекущаяНоменклатура) Тогда
// Если товар не должен быть на сайте, мы все равно включаем его в выгрузку,
// но явно указываем статус удаления
ДанныеОбъекта.Вставить("Статус", "Удален");
ДанныеОбъекта.Вставить("Активность", Ложь);
КонецЕсли;
В этом случае, даже при выгрузке изменений, товар попадет в файл, и Bitrix, считав статус, выполнит деактивацию карточки. Это самый надежный программный метод, так как он не требует периодических полных выгрузок.
Выясним еще одну простую причину, по которой товары могут мешать на сайте: они просто закончились — есть готовая автоматическая пометка на удаление товаров с нулевыми остатками. Вместо удаления товара, его можно автоматически скрывать, когда остаток становится равным нулю. Это настраивается полностью на стороне Bitrix и не требует вмешательства в 1С.
Выполним следующие шаги в админ-панели сайта:
catalog.section) на страницах сайта включите опцию «Не показывать товары, которых нет на складах».Таким образом, если в 1С обнулится остаток и эта информация уйдет на сайт, товар автоматически перестанет отображаться для покупателей, хотя физически карточка останется активной в базе данных.
Подводя итоги, выделим основные правила управления актуальностью каталога:
Удален для товаров, не прошедших фильтры.OnSuccessCatalogImport1C является наиболее гибким и понятным для контент-менеджеров.Помните, что удаление товара — процесс необратимый (теряются SEO-метатеги, комментарии, история продаж), поэтому в большинстве случаев деактивация предпочтительнее полного удаления карточки с сайта.