Почему при обмене с сайтом выгружаются товары с нулевым остатком?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

Многие пользователи сталкиваются с ситуацией, когда при настройке обмена между 1С:Управление торговлей 11 и WooCommerce, даже при установленных отборах на выгрузку остатков, товары с нулевым количеством всё равно попадают на сайт. Давайте разберем, почему это происходит и как исправить эту логику обмена на уровне программного кода.

Анализ механизма формирования пакета данных

Основная причина заключается в том, как именно 1С подготавливает данные для выгрузки. Система сначала собирает массив номенклатуры согласно заданному каталогу, а уже затем пытается дополнить его информацией о ценах и остатках. Если в процедуре формирования данных отсутствует жесткое условие на исключение записи при нулевом остатке, то номенклатурная позиция будет выгружена в любом случае — просто с пустым значением остатка, что интерпретируется сайтом как товар, доступный к заказу.

Решение проблемы через доработку кода

Для того чтобы товары с нулевым остатком не попадали в выгрузку, необходимо модифицировать процедуру ЗаполнитьИзменияПакета. Мы должны добавить проверку остатков непосредственно перед добавлением объекта ПредложениеXDTO в пакет. Рассмотрим, как это сделать по шагам.

Откройте модуль обмена и найдите участок, отвечающий за заполнение остатков по складам. Нам нужно реализовать проверку и принудительный пропуск итерации, если данных недостаточно.

Рекомендуемый вариант внесения правок в цикл обработки:


ОстатокВсего = 0;
Для Каждого СтрокаОстаткиПоСкладам Из ТекСтрока.Остатки Цикл
    // Исключаем записи с нулевым или отрицательным остатком
    Если СтрокаОстаткиПоСкладам.ОстатокНаСкладе <= 0 Тогда
        Продолжить;
    КонецЕсли;

    Если Не ЗначениеЗаполнено(СтрокаОстаткиПоСкладам.Склад) Тогда
        Продолжить;
    КонецЕсли;

    ОстаткиПоСкладамXDTO = ФабрикаXDTO.Создать(ОстаткиПоСкладамТип);
    ОстаткиПоСкладамXDTO.ИдСклада = УникальныйИдентификаторОбъекта(СтрокаОстаткиПоСкладам.Склад);
    ОстаткиПоСкладамXDTO.КоличествоНаСкладе = СтрокаОстаткиПоСкладам.ОстатокНаСкладе;

    ПредложениеXDTO.Склады.Добавить(ОстаткиПоСкладамXDTO);

    ОстатокВсего = ОстатокВсего + СтрокаОстаткиПоСкладам.ОстатокНаСкладе;
КонецЦикла;

// Если после проверки остаток все равно равен нулю, такой товар не включаем в пакет
Если ОстатокВсего <= 0 Тогда
    Продолжить; 
КонецЕсли;

ПредложениеXDTO.Количество = ОстатокВсего;
ПредложенияXDTO.Предложение.Добавить(ПредложениеXDTO);

Проверка работы системы компоновки данных (СКД)

Помимо правок в процедурах формирования XML, стоит обратить внимание на то, как работают РезультатВыполненияСхемы и ПроцессорКомпоновки в процедуре ПолучитьДанныеДляВыгрузкиПакетаПредложений. Если отборы в настройках КомпоновщикаНастроек установлены некорректно, СКД может выбирать всю номенклатуру из справочника.

  1. Убедитесь, что в пользовательском режиме 1С, в настройках узла обмена, установлен отбор Остаток > 0 именно по номенклатуре.
  2. Проверьте, что связи наборов данных Цены и Остатки настроены верно. Если используется левое соединение, то номенклатура всегда будет попадать в результирующую выборку, даже если показатели остатков равны NULL или 0.
  3. Используйте Индексы для таблиц значений ТаблицаЦены и ТаблицаОстатки. Как показано в коде, метод Индексы.Добавить("Номенклатура") существенно ускоряет процесс поиска и сопоставления данных.

Важные рекомендации по отладке

Чтобы понять, на каком этапе «проскакивает» лишний товар, выполните следующие действия:

Применяя данные методы, вы сможете добиться точного соответствия выгружаемых данных реальным складским остаткам. Помните, что доработки кода в модулях, поставляемых с плагинами обмена, могут быть затерты при обновлении конфигурации или самого плагина, поэтому сохраняйте все изменения в отдельных файлах или используйте механизмы расширений конфигурации.

← На главную