Почему товары с нулевым остатком попадают в import.xml при обмене с сайтом и как это исправить?

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

При настройке типового обмена 1С:Управление торговлей (УТ 11) с сайтом многие специалисты сталкиваются с ситуацией, когда в файл offers.xml (предложения) товары попадают корректно согласно отборам, а в файле import.xml (каталог) оказывается полный перечень номенклатуры, включая позиции с нулевыми остатками. Это создает избыточную нагрузку на сайт и засоряет базу данных интернет-магазина неактуальными товарами.

В этой статье мы подробно разберем, почему так происходит, проанализируем внутреннюю логику работы механизмов 1С и найдем способы решения данной проблемы.

Разделение логики формирования файлов import.xml и offers.xml

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

  1. Файл import.xml: Содержит описание структуры каталога, групп товаров, характеристик и самих карточек номенклатуры (наименования, артикулы, реквизиты).
  2. Файл offers.xml: Содержит коммерческие предложения, то есть цены и остатки для товаров, уже описанных в каталоге.

Проблема заключается в том, что в типовых конфигурациях (УТ 11, ERP, КА 2) программный фильтр «Выгружать только товары с остатками» зачастую применяется системой только в момент формирования предложений. Логика разработчиков 1С здесь такова: если товар есть в базе, его нужно создать на сайте (в файле import), чтобы пользователь мог увидеть карточку товара со статусом «Нет в наличии». Однако для многих бизнес-задач это поведение является нежелательным.

Где искать причину в коде 1С

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

ОбменССайтом.ВыполнитьОбменССайтом(ПараметрыОбмена);

При анализе выполнения этой процедуры мы увидим, что система использует механизмы СКД (Схемы компоновки данных) для выборки товаров. Рассмотрим, как устанавливаются параметры:

  1. Система проверяет настройки в узле «Обмен с сайтом».
  2. Если установлен ПрограммныйОтборПоКаталогу, 1С пытается применить его к запросу.
  3. Критическая деталь: При формировании import.xml запрос к базе данных может выполняться по справочнику Номенклатура, где соединение с регистром остатков либо отсутствует, либо выполняется через ЛЕВОЕ СОЕДИНЕНИЕ без жесткого условия в секции ГДЕ.

Способ 1: Настройка произвольного отбора в СКД

Самый простой и правильный путь без изменения программного кода — это использование расширенных настроек отбора непосредственно в интерфейсе 1С. Разберем по шагам:

  1. Перейдем в настройки узла Обмен с сайтом.
  2. Откроем вкладку Выгрузка товаров и перейдем в настройки состава выгружаемых данных.
  3. Вместо использования стандартного флага «Выгружать остатки более 0», который влияет только на offers.xml, создадим Произвольный отбор.
  4. В настройках компоновщика добавим новое поле: Остаток (Склад) > 0. Важно выбрать именно тот склад (или группу складов), который указан в настройках выгрузки.

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

Способ 2: Использование расширений для модификации запроса

Если типовые настройки не помогают (что случается в некоторых релизах УТ 11 из-за особенностей работы механизма регистрации изменений), мы можем прибегнуть к разработке расширения. Нам необходимо перехватить процедуру, отвечающую за заполнение временной таблицы товаров.

Рассмотрим пример логики, которую можно реализовать в расширении:


&После("ЗаполнитьТаблицуТоваровДляВыгрузки")
Процедура Ист_ЗаполнитьТаблицуТоваровДляВыгрузки(ТаблицаТоваров)
    // Удаляем из таблицы товары, у которых общий остаток равен 0
    КоличествоСтрок = ТаблицаТоваров.Количество();
    Для Счетчик = 1 По КоличествоСтрок Цикл
        Индекс = КоличествоСтрок - Счетчик;
        Строка = ТаблицаТоваров[Индекс];
        Если Строка.Остаток <= 0 Тогда
            ТаблицаТоваров.Удалить(Строка);
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Этот метод гарантирует, что в XML-пакеты не попадет ничего лишнего. Однако стоит помнить, что полное удаление товара из выгрузки может привести к тому, что на сайте товар останется «висеть» в старом статусе, если он не был скрыт ранее. Протокол CommerceML предполагает, что для удаления или деактивации товара нужно передать его со специальным признаком или обнулить его остаток.

Особенности механизма регистрации изменений

Выясним причину, почему иногда даже после настройки отборов товары продолжают выгружаться. 1С работает через планы обмена и регистр сведений Номенклатура к выгрузке.

Если товар когда-то имел остаток и был выгружен на сайт, он зарегистрирован в плане обмена. При обнулении остатка запись об изменении этого товара снова попадает в очередь. При выполнении обмена 1С видит: «Этот товар изменился, его нужно отправить». Если в логике формирования import.xml не прописано жесткое условие исключения по остатку, программа отправит обновленную карточку товара.

Рекомендация: Для полной очистки выгрузки попробуйте выполнить Полную выгрузку данных один раз после изменения настроек отбора. Это принудительно переформирует файлы согласно новым правилам СКД.

Резюме

Мы выяснили, что расхождение данных в файлах import и offers — это не баг, а особенность архитектуры 1С. Чтобы исключить «нулевые» товары из каталога import.xml, следует:

Такой комплексный подход позволит вам содержать каталог сайта в актуальном состоянии и оптимизировать процесс обмена данными.

← На главную