При настройке интеграции между 1С:Управление торговлей 11 (УТ 11) и сайтами на базе WordPress (WooCommerce) пользователи часто сталкиваются с нестандартным поведением типового обмена. В отличие от УТ 10.3, где фильтры работали прямолинейно, в 11-й версии можно наблюдать следующую картину: выгружаются позиции без цен, а установка в настройках узла обмена отбора по остатку «остаток на складе больше 0» не дает результата — система все равно отправляет на сайт весь список пустой номенклатуры. Проанализируем ситуацию и разберем по шагам, как настроить корректный обмен.
В типовом механизме обмена (по формату CommerceML) установка жесткого отбора по положительному остатку часто срабатывает не так, как ожидается. Рассмотрим подробнее, почему это происходит.
Когда товар полностью раскупают и его остаток на складе в 1С становится равным нулю, система обязана передать эту информацию интернет-магазину. Если жестко отсечь нулевые остатки на этапе запроса в 1С, товар просто перестанет попадать в файл выгрузки. В результате интернет-магазин "подумает", что по данному товару изменений нет, и он так и останется висеть на сайте с положительным остатком (доступным для заказа). Поэтому 1С при полной выгрузке или выгрузке изменений транслирует "0", чтобы сайт скрыл товар или поменял его статус на "Нет в наличии".
Самый правильный и безболезненный способ, который не требует программирования в 1С — это обработка нулевых остатков на стороне CMS.
При такой настройке 1С будет регулярно и корректно передавать товары с количеством 0, а сайт будет автоматически снимать их с витрины.
Чтобы цены попадали в файл предложений offers.xml, недостаточно просто отметить галочками параметры выгрузки. Критически важно правильно настроить типовое соглашение. Разберем необходимые условия:
СегментПартнеров в этом соглашении должно быть оставлено пустым (иначе цены привяжутся только к конкретным клиентам).Если специфика вашего проекта требует, чтобы 1С физически не помещала в файл товары без остатков, потребуется доработка конфигурации. Посмотрим на пример кода, который формирует таблицу выгрузки через Схему Компоновки Данных (СКД). Выборка формируется в процедуре ПолучитьДанныеДляВыгрузкиПакетаПредложений.
В этой процедуре 1С объединяет запросы цен и остатков:
ТаблицаЦены = РезультатВыполненияСхемы(КомпоновщикНастроек, ТекстыЗапросов.Цены, ПоляИсточниковДанных.Цены, ПрикладныеПараметры, "ПакетПредложений");
ТаблицаЦены.Индексы.Добавить("Номенклатура");
ТаблицаОстатки = РезультатВыполненияСхемы(КомпоновщикНастроек, ТекстыЗапросов.Остатки, ПоляИсточниковДанных.Остатки, ПрикладныеПараметры, "ПакетПредложений");
ТаблицаОстатки.Индексы.Добавить("Номенклатура");
Проблема заключается в том, что 1С использует левое соединение списка номенклатуры с таблицей остатков. Чтобы принудительно исключить позиции с нулевыми остатками до формирования пакета XDTO, нам необходимо обработать финальную таблицу ТаблицаДанныеПакетаПредложений.
Добавьте перед концом процедуры перебор строк для очистки лишних данных:
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ТаблицаДанныеПакетаПредложений = Новый ТаблицаЗначений;
ПроцессорВывода.УстановитьОбъект(ТаблицаДанныеПакетаПредложений);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
ТаблицаДанныеПакетаПредложений.Индексы.Добавить("Номенклатура");
// ДОРАБОТКА: Удаляем товары с нулевыми остатками
МассивСтрокКУдалению = Новый Массив;
Для Каждого ТекСтрока Из ТаблицаДанныеПакетаПредложений Цикл
ОстатокВсего = 0;
Если ТипЗнч(ТекСтрока.Остатки) = Тип("ТаблицаЗначений") Тогда
Для Каждого СтрОстаток Из ТекСтрока.Остатки Цикл
ОстатокВсего = ОстатокВсего + СтрОстаток.ОстатокНаСкладе;
КонецЦикла;
КонецЕсли;
Если ОстатокВсего <= 0 Тогда
МассивСтрокКУдалению.Добавить(ТекСтрока);
КонецЕсли;
КонецЦикла;
Для Каждого СтрУдалить Из МассивСтрокКУдалению Цикл
ТаблицаДанныеПакетаПредложений.Удалить(СтрУдалить);
КонецЦикла;
В этом примере мы анализируем коллекцию в колонке Остатки у каждой позиции номенклатуры. Если суммарный остаток меньше или равен нулю, строка удаляется из таблицы выгрузки. После этого 1С перестанет формировать пакеты XDTO для отсутствующих товаров в процедуре ЗаполнитьИзменияПакета.
Типовой протокол обмена CommerceML достаточно тяжеловесен и не всегда идеально совместим с архитектурой современных плагинов электронной коммерции. Если вы постоянно сталкиваетесь с ошибками выгрузки, стоит рассмотреть использование сторонних модулей (например, упомянутый в теме unimodul) или плагинов обмена по REST API. Они позволяют точечно обновлять цены и остатки для конкретных ID товаров, минуя сложные механизмы СКД и формирование огромных XML-файлов внутри конфигурации 1С.