При настройке типового обмена 1С:Управление торговлей (УТ 11) с сайтом многие специалисты сталкиваются с ситуацией, когда в файл offers.xml (предложения) товары попадают корректно согласно отборам, а в файле import.xml (каталог) оказывается полный перечень номенклатуры, включая позиции с нулевыми остатками. Это создает избыточную нагрузку на сайт и засоряет базу данных интернет-магазина неактуальными товарами.
В этой статье мы подробно разберем, почему так происходит, проанализируем внутреннюю логику работы механизмов 1С и найдем способы решения данной проблемы.
Для начала проанализируем архитектуру протокола CommerceML, который используется в стандартном обмене. Процесс выгрузки разделен на два основных этапа, каждый из которых формирует свой файл:
Проблема заключается в том, что в типовых конфигурациях (УТ 11, ERP, КА 2) программный фильтр «Выгружать только товары с остатками» зачастую применяется системой только в момент формирования предложений. Логика разработчиков 1С здесь такова: если товар есть в базе, его нужно создать на сайте (в файле import), чтобы пользователь мог увидеть карточку товара со статусом «Нет в наличии». Однако для многих бизнес-задач это поведение является нежелательным.
Давайте вместе проследим путь формирования данных. Основная точка входа в процесс обмена находится в модуле менеджера узла плана обмена. В типовых решениях это процедура:
ОбменССайтом.ВыполнитьОбменССайтом(ПараметрыОбмена);
При анализе выполнения этой процедуры мы увидим, что система использует механизмы СКД (Схемы компоновки данных) для выборки товаров. Рассмотрим, как устанавливаются параметры:
ПрограммныйОтборПоКаталогу, 1С пытается применить его к запросу.import.xml запрос к базе данных может выполняться по справочнику Номенклатура, где соединение с регистром остатков либо отсутствует, либо выполняется через ЛЕВОЕ СОЕДИНЕНИЕ без жесткого условия в секции ГДЕ.Самый простой и правильный путь без изменения программного кода — это использование расширенных настроек отбора непосредственно в интерфейсе 1С. Разберем по шагам:
offers.xml, создадим Произвольный отбор.Остаток (Склад) > 0. Важно выбрать именно тот склад (или группу складов), который указан в настройках выгрузки.В этом случае условие попадет в основной запрос выборки данных для обоих файлов, и товары с нулевым наличием будут отсечены еще на этапе подготовки таблицы выгрузки.
Если типовые настройки не помогают (что случается в некоторых релизах УТ 11 из-за особенностей работы механизма регистрации изменений), мы можем прибегнуть к разработке расширения. Нам необходимо перехватить процедуру, отвечающую за заполнение временной таблицы товаров.
Рассмотрим пример логики, которую можно реализовать в расширении:
&После("ЗаполнитьТаблицуТоваровДляВыгрузки")
Процедура Ист_ЗаполнитьТаблицуТоваровДляВыгрузки(ТаблицаТоваров)
// Удаляем из таблицы товары, у которых общий остаток равен 0
КоличествоСтрок = ТаблицаТоваров.Количество();
Для Счетчик = 1 По КоличествоСтрок Цикл
Индекс = КоличествоСтрок - Счетчик;
Строка = ТаблицаТоваров[Индекс];
Если Строка.Остаток <= 0 Тогда
ТаблицаТоваров.Удалить(Строка);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Этот метод гарантирует, что в XML-пакеты не попадет ничего лишнего. Однако стоит помнить, что полное удаление товара из выгрузки может привести к тому, что на сайте товар останется «висеть» в старом статусе, если он не был скрыт ранее. Протокол CommerceML предполагает, что для удаления или деактивации товара нужно передать его со специальным признаком или обнулить его остаток.
Выясним причину, почему иногда даже после настройки отборов товары продолжают выгружаться. 1С работает через планы обмена и регистр сведений Номенклатура к выгрузке.
Если товар когда-то имел остаток и был выгружен на сайт, он зарегистрирован в плане обмена. При обнулении остатка запись об изменении этого товара снова попадает в очередь. При выполнении обмена 1С видит: «Этот товар изменился, его нужно отправить». Если в логике формирования import.xml не прописано жесткое условие исключения по остатку, программа отправит обновленную карточку товара.
Рекомендация: Для полной очистки выгрузки попробуйте выполнить Полную выгрузку данных один раз после изменения настроек отбора. Это принудительно переформирует файлы согласно новым правилам СКД.
Мы выяснили, что расхождение данных в файлах import и offers — это не баг, а особенность архитектуры 1С. Чтобы исключить «нулевые» товары из каталога import.xml, следует:
Такой комплексный подход позволит вам содержать каталог сайта в актуальном состоянии и оптимизировать процесс обмена данными.