При организации обмена данными между 1С и интернет-магазином (будь то WooCommerce, Битрикс или другие системы, поддерживающие протокол CommerceML), одной из самых частых задач является оптимизация каталога. Одной из таких задач выступает исключение из выгрузки позиций, которых нет в наличии. Рассмотрим подробно, почему стандартные отборы могут не работать и как правильно реализовать эту логику.
Прежде чем приступать к правке кода, проанализируем, как формируется выгрузка. Стандартный процесс обмена состоит из формирования двух основных типов файлов:
import.xml): здесь передается иерархия групп, свойства товаров, описания и ссылки на картинки.offers.xml): в этих пакетах передаются коммерческие условия — цены и остатки.Проблема автора заключается в том, что при полной выгрузке в пакеты попадают все товары, включая те, у которых остаток равен нулю. Если на стороне сайта не настроено автоматическое скрытие товаров с нулевым запасом, витрина магазина заполняется "пустыми" позициями, что негативно сказывается на конверсии и удобстве пользователей.
Разберем ситуацию, когда в настройках узла обмена вы устанавливаете фильтр "Количество > 0", но он не приносит результата. В типовых конфигурациях (например, Управление торговлей 10.3 или ранние версии УНФ) механизм отбора часто работает по справочнику Номенклатура.
Остатки же хранятся в Регистрах накопления (например, ТоварыНаСкладах). Когда система выполняет запрос на выгрузку, она может проверять наличие товара в справочнике, но не всегда корректно связывает это с текущими итогами по регистрам в момент формирования import.xml. В результате товар попадает в файл описания, а в файле предложений (offers.xml) для него просто указывается количество "0".
Проанализируем техническую сторону решения. Чтобы полностью исключить товар из выгрузки, необходимо изменить запрос, который собирает данные для пакетов. Чаще всего это происходит в процедурах формирования временных таблиц номенклатуры. Нам нужно добавить условие соединения с виртуальной таблицей остатков.
Рассмотрим пример того, как может выглядеть модифицированный запрос в коде 1С. Мы добавим левое соединение с виртуальной таблицей ТоварыНаСкладах.Остатки и установим фильтр:
// Пример модификации запроса для формирования списка выгружаемой номенклатуры
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| ЕСТЬNULL(ТоварыНаСкладахОстатки.ВНаличииОстаток, 0) КАК Остаток
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, ) КАК ТоварыНаСкладахОстатки
| ПО ТоварыНаСкладахОстатки.Номенклатура = Номенклатура.Ссылка
|ГДЕ
| Номенклатура.ЭтоГруппа = ЛОЖЬ
| И ЕСТЬNULL(ТоварыНаСкладахОстатки.ВНаличииОстаток, 0) > 0";
Важный момент: если ваша конфигурация использует Схему компоновки данных (СКД) для настройки выгрузки, необходимо убедиться, что поле "Остаток" добавлено в доступные поля выбора и условие ГДЕ применяется именно к числовому значению остатка, а не к факту наличия записи в регистре.
Иногда правильнее не удалять товар из выгрузки вовсе, а передавать его с нулевым остатком, чтобы сайт сам принял решение о его отображении. Проанализируем, почему это важно. Если вы просто перестанете присылать товар в XML-файле, сайт "не узнает", что его больше нет, и может оставить старое количество (например, 2 штуки), которое было загружено ранее.
Для WooCommerce рекомендуется проверить настройки плагина интеграции. Выясним основные настройки:
В таком случае, даже если 1С выгрузит товар с остатком 0, он просто исчезнет с витрины, но останется в базе сайта, что сохранит его SEO-позиции и корректную историю заказов.
Если вы используете режим "Выгружать только изменения", ситуация усложняется. Посмотрим на алгоритм: при списании товара в 1С до нуля, это событие регистрируется в плане обмена. При следующей выгрузке 1С должна отправить этот товар с количеством "0".
Если же вы используете полную выгрузку, но при этом включены жесткие фильтры по количеству в коде 1С, вы рискуете оставить на сайте "фантомные остатки". Рассмотрим, как этого избежать:
Регистрация изменений для обмена.ПередЗаписью или в специализированном модуле формирования XML не стоит жесткое прерывание цикла, если остаток равен нулю.ПланыОбмена.ВыбратьИзменения(). Если выгрузка идет по этому механизму, то в пакет попадут только те позиции, по которым были движения (продажи, поступления, корректировки).Рассмотрим по шагам, как добиться идеальной синхронизации:
Шаг 1. Определитесь со стратегией. Если товаров в базе 1С десятки тысяч, а в наличии только сотни — фильтрация на стороне 1С оправдана для ускорения процесса обмена.
Шаг 2. Если вы решили править код, используйте Расширения конфигурации. Найдите метод, отвечающий за сбор данных (обычно это СформироватьЗапросПоНоменклатуре или аналогичный в модуле обмена данными с сайтом). Добавьте туда проверку остатка по всем складам, которые участвуют в обмене.
Шаг 3. Обратите внимание на работу с характеристиками. Если товар имеет характеристики, остаток нужно проверять в разрезе каждой характеристики (Номенклатура + Характеристика), иначе выгрузится "пустое" предложение, которое создаст ошибку на стороне WooCommerce.
Шаг 4. Проверьте настройки на стороне сайта. Проанализируем ситуацию: если в 1С товар есть на "Складе А" (который не выгружается) и нет на "Складе Б" (который выгружается), общий остаток в системе может быть положительным, но на сайт должен уйти ноль. Убедитесь, что фильтры в 1С учитывают складской контекст.
Использование комплексного подхода — фильтрации в 1С для оптимизации и настройки правил обработки на сайте для корректности данных — позволит вам создать стабильную и производительную систему обмена.