Почему из 1С:УТ 11 на сайт выгружаются нулевые остатки и нет цен, и как это исправить?

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

При настройке интеграции между 1С:Управление торговлей 11 (УТ 11) и сайтами на базе WordPress (WooCommerce) пользователи часто сталкиваются с нестандартным поведением типового обмена. В отличие от УТ 10.3, где фильтры работали прямолинейно, в 11-й версии можно наблюдать следующую картину: выгружаются позиции без цен, а установка в настройках узла обмена отбора по остатку «остаток на складе больше 0» не дает результата — система все равно отправляет на сайт весь список пустой номенклатуры. Проанализируем ситуацию и разберем по шагам, как настроить корректный обмен.

Причина выгрузки нулевых остатков: логика CommerceML

В типовом механизме обмена (по формату CommerceML) установка жесткого отбора по положительному остатку часто срабатывает не так, как ожидается. Рассмотрим подробнее, почему это происходит.

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

Решение 1: Настройка скрытия товаров на стороне сайта (WooCommerce)

Самый правильный и безболезненный способ, который не требует программирования в 1С — это обработка нулевых остатков на стороне CMS.

  1. Зайдите в панель администратора WordPress.
  2. Перейдите в раздел WooCommerce — Настройки — Товары — Запасы.
  3. Убедитесь, что включена опция управления запасами.
  4. Поставьте галочку Скрывать товары, которых нет в наличии.

При такой настройке 1С будет регулярно и корректно передавать товары с количеством 0, а сайт будет автоматически снимать их с витрины.

Почему не выгружаются цены товаров?

Чтобы цены попадали в файл предложений offers.xml, недостаточно просто отметить галочками параметры выгрузки. Критически важно правильно настроить типовое соглашение. Разберем необходимые условия:

  1. Перейдите к справочнику типовых соглашений с клиентами.
  2. Соглашение, используемое для обмена, должно иметь статус Действует.
  3. Поле СегментПартнеров в этом соглашении должно быть оставлено пустым (иначе цены привяжутся только к конкретным клиентам).
  4. Обязательно должна стоять отметка Доступно внешним пользователям.
  5. Цены на номенклатуру должны быть зафиксированы документом Установка цен номенклатуры по тому виду цен, который указан в соглашении.

Решение 2: Программная блокировка выгрузки нулевых остатков в 1С

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

В этой процедуре 1С объединяет запросы цен и остатков:


ТаблицаЦены = РезультатВыполненияСхемы(КомпоновщикНастроек, ТекстыЗапросов.Цены, ПоляИсточниковДанных.Цены, ПрикладныеПараметры, "ПакетПредложений");
ТаблицаЦены.Индексы.Добавить("Номенклатура");

ТаблицаОстатки = РезультатВыполненияСхемы(КомпоновщикНастроек, ТекстыЗапросов.Остатки, ПоляИсточниковДанных.Остатки, ПрикладныеПараметры, "ПакетПредложений");
ТаблицаОстатки.Индексы.Добавить("Номенклатура");

Проблема заключается в том, что 1С использует левое соединение списка номенклатуры с таблицей остатков. Чтобы принудительно исключить позиции с нулевыми остатками до формирования пакета XDTO, нам необходимо обработать финальную таблицу ТаблицаДанныеПакетаПредложений.

Добавьте перед концом процедуры перебор строк для очистки лишних данных:


ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ТаблицаДанныеПакетаПредложений = Новый ТаблицаЗначений;
ПроцессорВывода.УстановитьОбъект(ТаблицаДанныеПакетаПредложений);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
ТаблицаДанныеПакетаПредложений.Индексы.Добавить("Номенклатура");

// ДОРАБОТКА: Удаляем товары с нулевыми остатками
МассивСтрокКУдалению = Новый Массив;
Для Каждого ТекСтрока Из ТаблицаДанныеПакетаПредложений Цикл
    ОстатокВсего = 0;
    Если ТипЗнч(ТекСтрока.Остатки) = Тип("ТаблицаЗначений") Тогда
        Для Каждого СтрОстаток Из ТекСтрока.Остатки Цикл
            ОстатокВсего = ОстатокВсего + СтрОстаток.ОстатокНаСкладе;
        КонецЦикла;
    КонецЕсли;
    
    Если ОстатокВсего <= 0 Тогда
        МассивСтрокКУдалению.Добавить(ТекСтрока);
    КонецЕсли;
КонецЦикла;

Для Каждого СтрУдалить Из МассивСтрокКУдалению Цикл
    ТаблицаДанныеПакетаПредложений.Удалить(СтрУдалить);
КонецЦикла;

В этом примере мы анализируем коллекцию в колонке Остатки у каждой позиции номенклатуры. Если суммарный остаток меньше или равен нулю, строка удаляется из таблицы выгрузки. После этого 1С перестанет формировать пакеты XDTO для отсутствующих товаров в процедуре ЗаполнитьИзменияПакета.

Альтернативные варианты обмена

Типовой протокол обмена CommerceML достаточно тяжеловесен и не всегда идеально совместим с архитектурой современных плагинов электронной коммерции. Если вы постоянно сталкиваетесь с ошибками выгрузки, стоит рассмотреть использование сторонних модулей (например, упомянутый в теме unimodul) или плагинов обмена по REST API. Они позволяют точечно обновлять цены и остатки для конкретных ID товаров, минуя сложные механизмы СКД и формирование огромных XML-файлов внутри конфигурации 1С.

← На главную