Как настроить выгрузку из 1С на сайт, чтобы исключить товары с нулевым остатком?

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

При организации обмена данными между 1С и интернет-магазином (будь то WooCommerce, Битрикс или другие системы, поддерживающие протокол CommerceML), одной из самых частых задач является оптимизация каталога. Одной из таких задач выступает исключение из выгрузки позиций, которых нет в наличии. Рассмотрим подробно, почему стандартные отборы могут не работать и как правильно реализовать эту логику.

Понимание структуры выгрузки CommerceML

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

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

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

Почему не работает стандартный отбор в 1С?

Разберем ситуацию, когда в настройках узла обмена вы устанавливаете фильтр "Количество > 0", но он не приносит результата. В типовых конфигурациях (например, Управление торговлей 10.3 или ранние версии УНФ) механизм отбора часто работает по справочнику Номенклатура.

Остатки же хранятся в Регистрах накопления (например, ТоварыНаСкладах). Когда система выполняет запрос на выгрузку, она может проверять наличие товара в справочнике, но не всегда корректно связывает это с текущими итогами по регистрам в момент формирования import.xml. В результате товар попадает в файл описания, а в файле предложений (offers.xml) для него просто указывается количество "0".

Решение 1: Модификация запроса в модуле обмена

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

Рассмотрим пример того, как может выглядеть модифицированный запрос в коде 1С. Мы добавим левое соединение с виртуальной таблицей ТоварыНаСкладах.Остатки и установим фильтр:


// Пример модификации запроса для формирования списка выгружаемой номенклатуры
Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
|	Номенклатура.Ссылка КАК Ссылка,
|	ЕСТЬNULL(ТоварыНаСкладахОстатки.ВНаличииОстаток, 0) КАК Остаток
|ИЗ
|	Справочник.Номенклатура КАК Номенклатура
|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, ) КАК ТоварыНаСкладахОстатки
|		ПО ТоварыНаСкладахОстатки.Номенклатура = Номенклатура.Ссылка
|ГДЕ
|	Номенклатура.ЭтоГруппа = ЛОЖЬ
|	И ЕСТЬNULL(ТоварыНаСкладахОстатки.ВНаличииОстаток, 0) > 0";

Важный момент: если ваша конфигурация использует Схему компоновки данных (СКД) для настройки выгрузки, необходимо убедиться, что поле "Остаток" добавлено в доступные поля выбора и условие ГДЕ применяется именно к числовому значению остатка, а не к факту наличия записи в регистре.

Решение 2: Логика на стороне сайта (WooCommerce/Битрикс)

Иногда правильнее не удалять товар из выгрузки вовсе, а передавать его с нулевым остатком, чтобы сайт сам принял решение о его отображении. Проанализируем, почему это важно. Если вы просто перестанете присылать товар в XML-файле, сайт "не узнает", что его больше нет, и может оставить старое количество (например, 2 штуки), которое было загружено ранее.

Для WooCommerce рекомендуется проверить настройки плагина интеграции. Выясним основные настройки:

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

Решение 3: Работа с регистрацией изменений

Если вы используете режим "Выгружать только изменения", ситуация усложняется. Посмотрим на алгоритм: при списании товара в 1С до нуля, это событие регистрируется в плане обмена. При следующей выгрузке 1С должна отправить этот товар с количеством "0".

Если же вы используете полную выгрузку, но при этом включены жесткие фильтры по количеству в коде 1С, вы рискуете оставить на сайте "фантомные остатки". Рассмотрим, как этого избежать:

  1. Выполните полную регистрацию всех изменений для узла обмена через обработку Регистрация изменений для обмена.
  2. Убедитесь, что в процедуре ПередЗаписью или в специализированном модуле формирования XML не стоит жесткое прерывание цикла, если остаток равен нулю.
  3. Проанализируйте, используется ли в вашей системе механизм ПланыОбмена.ВыбратьИзменения(). Если выгрузка идет по этому механизму, то в пакет попадут только те позиции, по которым были движения (продажи, поступления, корректировки).

Рекомендации по реализации

Рассмотрим по шагам, как добиться идеальной синхронизации:

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

Шаг 2. Если вы решили править код, используйте Расширения конфигурации. Найдите метод, отвечающий за сбор данных (обычно это СформироватьЗапросПоНоменклатуре или аналогичный в модуле обмена данными с сайтом). Добавьте туда проверку остатка по всем складам, которые участвуют в обмене.

Шаг 3. Обратите внимание на работу с характеристиками. Если товар имеет характеристики, остаток нужно проверять в разрезе каждой характеристики (Номенклатура + Характеристика), иначе выгрузится "пустое" предложение, которое создаст ошибку на стороне WooCommerce.

Шаг 4. Проверьте настройки на стороне сайта. Проанализируем ситуацию: если в 1С товар есть на "Складе А" (который не выгружается) и нет на "Складе Б" (который выгружается), общий остаток в системе может быть положительным, но на сайт должен уйти ноль. Убедитесь, что фильтры в 1С учитывают складской контекст.

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

← На главную