При организации регулярного обмена между типовыми конфигурациями 1С (например, Комплексная автоматизация 1.1 или Управление торговлей 10.3) и интернет-магазином на платформе 1С-Битрикс часто возникает неприятная ситуация: товар полностью распродан на складе, однако на витрине сайта по-прежнему отображается его старый положительный остаток. Покупатели продолжают оформлять заказы на отсутствующие позиции, что приводит к конфликтам и срывам поставок.
Разберем детально механизм возникновения этой ошибки по стандарту CommerceML и рассмотрим практические способы решения задачи как с доработкой алгоритмов, так и без снятия конфигурации 1С с поддержки.
Проанализируем структуру формируемого файла выгрузки предложений offers.xml. В типовых механизмах обмена 1С формирование узла <Количество> для каждого торгового предложения зачастую обернуто в условие проверки наличия положительного остатка в регистрах накопления. Если по учетным данным остаток товара равен нулю или запись в регистре вовсе отсутствует, узел <Количество> в XML-файл не записывается.
На стороне интернет-магазина обработчик импорта каталога работает по следующему принципу: значение поля остатка обновляется только тогда, когда для конкретного предложения в переданном пакете найден тег <Количество>. Если тег отсутствует, система интерпретирует это как «данные по остатку не передавались» и сохраняет предыдущее значение остатка в базе данных без изменений.
Выясним, как устранить проблему непосредственно в коде выгрузки 1С. В процедуре формирования торговых предложений необходимо убрать условие, пропускающее запись тега при нулевом остатке, либо явно прописать генерацию нулевого узла.
Посмотрим на пример логики формирования XML-узла предложения:
// В процедуре выгрузки торговых предложений
ЗаписьXML.ЗаписатьНачалоЭлемента("Предложение");
// ... запись реквизитов предложения ...
// Принудительно выгружаем количество даже при нулевом значении
Если ЗначениеЗаполнено(ВыборкаПоОстаткам.Количество) И ВыборкаПоОстаткам.Количество > 0 Тогда
ЗаписьXML.ЗаписатьЭлемент("Количество", Формат(ВыборкаПоОстаткам.Количество, "ЧЦ=15; ЧДЦ=3; ЧРД=.; ЧГ=0"));
Иначе
ЗаписьXML.ЗаписатьЭлемент("Количество", "0");
КонецЕсли;
ЗаписьXML.ЗаписатьКонецЭлемента(); // Предложение
После такой доработки в файл offers.xml для всех отсутствующих на складе позиций начнет гарантированно попадать узел <Количество>0</Количество>, и интернет-магазин корректно установит нулевой остаток при импорте.
Если конфигурация 1С находится на замке и вносить изменения в основную конфигурацию нежелательно, воспользуемся альтернативными вариантами:
Разберем вариант, когда в 1С настраивается жесткий отбор позиций в узле обмена по правилу Количество > 0. В этом случае отсутствующие товары вообще не попадают в выгрузку, а управление остатками делегируется логике интернет-магазина.
Разберем по шагам порядок настройки:
При таком подходе при каждой полной выгрузке система управления сайтом автоматически обнулит остатки по всем позициям каталога, которые не были переданы из 1С.