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