При интеграции конфигурации «1С:Управление торговлей 11» с сайтом на платформе «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С-Битрикс, отметим главное:
ПланыОбмена.ЗарегистрироватьИзменения и ПланыОбмена.УдалитьРегистрациюИзменений.Б_ОбменССайтомСервер.ДобавитьЗначениеРеквизитаXDTO в модулях формирования выгрузки данных.