Почему при обмене с Битрикс выгружаются все товары в режиме «Только изменения» и как добавить свои реквизиты в выгрузку

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

При интеграции конфигурации «1С:Управление торговлей 11» с сайтом на платформе «1С-Битрикс» разработчики часто сталкиваются с ситуацией, когда при включенном флаге «Выгружать только изменения» система все равно формирует пакет с сотнями или тысячами позиций. Разберем основные причины такого поведения, выясним, как устроена регистрация изменений, и рассмотрим пример добавления пользовательских реквизитов (планируемой даты поступления и ожидаемого количества) в выгрузку XDTO.

Причины избыточной выгрузки товаров при режиме «Только изменения»

Проанализируем архитектуру модуля обмена. Режим выгрузки изменений опирается на стандартный механизм платформных планов обмена. Однако в реальной эксплуатации возникают следующие факторы:

  1. Регистрация при проведении складских документов. При проведении любого документа движения товаров (поступления, реализации, перемещения, пересчета товаров) встроенные подписки на события регистрируют всю номенклатуру из табличной части в узле обмена Б_ОбменССайтом. В активной торговой базе за короткий промежуток времени могут измениться остатки по сотням позиций.
  2. Выгрузка в каталог на диске вместо сайта. Если обмен выполняется путем сохранения файлов во локальную или сетевую папку (без отправки по HTTP/HTTPS непосредственно на сайт), платформа 1С не снимает объекты с регистрации. Зарегистрированные изменения сохраняются в таблице изменений узла до тех пор, пока не будет успешно выполнен сеанс веб-обмена.
  3. Незавершенная сессия обмена. Очистка таблицы зарегистрированных изменений происходит только после завершения полного цикла обмена и получения от веб-сервера Битрикса финального подтверждения (ответа со статусом успеха). Если в процессе передачи данных произошел обрыв соединения или таймаут обработки файлов на стороне сайта, сброс регистрации в 1С не происходит, и при следующем запуске товары выгружаются снова.

Управление регистрацией изменений без физической перезаписи объектов

Ошибочным решением является попытка вызвать перезапись элемента справочника (Объект.Записать()) для его попадания в обмен. Это приводит к лишним блокировкам и изменению версионирования. Для управления очередью обмена необходимо использовать программные методы работы с планами обмена.

Для регистрации или снятия номенклатуры с учета в узле обмена Б_ОбменССайтом используем процедуры платформы:


// Регистрация конкретной номенклатуры или массива ссылок
МассивУзлов = Новый Массив;
МассивУзлов.Добавить(УзелОбмена); // Ссылка на узел плана обмена Б_ОбменССайтом

ПланыОбмена.ЗарегистрироватьИзменения(МассивУзлов, НоменклатураСсылка);

// Снятие объекта с регистрации (если выгружать его не требуется)
ПланыОбмена.УдалитьРегистрациюИзменений(МассивУзлов, НоменклатураСсылка);

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

Добавление собственных реквизитов в пакет выгрузки XDTO

Рассмотрим часто встречающуюся задачу: необходимо выгружать на сайт не только базовые остатки и цены, но и планируемую дату поступления и ожидаемое количество на основе документов «Заказ поставщику».

В модуле интеграции с Битрикс (модули Б_ОбменССайтомСерверВыгрузкаДанных и Б_ОбменССайтомСервер) данные каталога и предложений формируются через структуры XDTO в процедурах ВыгрузитьТоварыXDTO и ВыгрузитьПредложенияXDTO.

Разберем реализацию по шагам:

Шаг 1. Подготовка запроса для получения даты поступления и количества из остатков заказов поставщикам:


Функция ПолучитьДанныеПланирования(лМенеджерВременныхТаблиц, Номенклатура, Характеристика = Неопределено) Экспорт
    
    Запрос = Новый Запрос;
    Запрос.МенеджерВременныхТаблиц = лМенеджерВременныхТаблиц;
    Запрос.Текст = 
        "ВЫБРАТЬ ПЕРВЫЕ 1
        |    ВремПланируемыеДатыПоступления.Количество КАК ОжидаемоеКоличество,
        |    ВремПланируемыеДатыПоступления.ДатаПоступления КАК ДатаПоступления
        |ИЗ
        |    ВремПланируемыеДатыПоступления КАК ВремПланируемыеДатыПоступления
        |ГДЕ
        |    ВремПланируемыеДатыПоступления.Номенклатура = &Номенклатура
        |    И ВремПланируемыеДатыПоступления.Характеристика = &Характеристика
        |УПОРЯДОЧИТЬ ПО
        |    ДатаПоступления";
        
    Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
    
    Если ЗначениеЗаполнено(Характеристика) Тогда
        Запрос.УстановитьПараметр("Характеристика", Характеристика);
    Иначе
        Запрос.УстановитьПараметр("Характеристика", Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка());
    КонецЕсли;
    
    РезультатЗапроса = Запрос.Выполнить().Выбрать();
    
    СтруктураРезультата = Новый Структура("ДатаПоступления, ОжидаемоеКоличество", "", 0);
    Если РезультатЗапроса.Следующий() Тогда
        СтруктураРезультата.ДатаПоступления = РезультатЗапроса.ДатаПоступления;
        СтруктураРезультата.ОжидаемоеКоличество = РезультатЗапроса.ОжидаемоеКоличество;
    КонецЕсли;
    
    Возврат СтруктураРезультата;
    
КонецФункции

Шаг 2. Формирование тегов реквизитов с использованием служебного метода Б_ОбменССайтомСервер.ДобавитьЗначениеРеквизитаXDTO.

В процедурах формирования XDTO-объектов (например, в ВыгрузитьТоварыXDTO или ВыгрузитьПредложенияXDTO) добавим код записи дополнительных реквизитов:


// Получаем данные по планируемому поступлению
ДанныеПоступления = ПолучитьДанныеПланирования(лМенеджерВременныхТаблиц, ТекПредложение.Номенклатура, ТекПредложение.Характеристика);

// Выгружаем "Планируемая дата поступления"
Б_ОбменССайтомСервер.ДобавитьЗначениеРеквизитаXDTO(
    ПараметрыОбмена, 
    XDTOЗначенияРеквизитов, 
    XDTOЗначениеРеквизитаТип, 
    "Планируемая дата поступления", 
    Строка(Формат(ДанныеПоступления.ДатаПоступления, "ДФ=yyyy-MM-dd"))
);

// Выгружаем "Ожидаемое количество"
Б_ОбменССайтомСервер.ДобавитьЗначениеРеквизитаXDTO(
    ПараметрыОбмена, 
    XDTOЗначенияРеквизитов, 
    XDTOЗначениеРеквизитаТип, 
    "Ожидаемое количество", 
    Строка(ДанныеПоступления.ОжидаемоеКоличество)
);

В результате работы процедуры в итоговый XML-файл обмена (например, offers.xml или import.xml) запишутся корректные узлы реквизитов:


<ЗначенияРеквизитов>
    <ЗначениеРеквизита>
        <Наименование>Планируемая дата поступления</Наименование>
        <Значение>2023-10-25</Значение>
    </ЗначениеРеквизита>
    <ЗначениеРеквизита>
        <Наименование>Ожидаемое количество</Наименование>
        <Значение>150</Значение>
    </ЗначениеРеквизита>
</ЗначенияРеквизитов>

Резюме

Проанализировав работу обмена 1С с 1С-Битрикс, отметим главное:

← На главную