При использовании стандартного обмена через EnterpriseData (ED) версии 1.7 в конфигурациях 1С:Управление торговлей 11, ERP или Комплексная автоматизация разработчики часто сталкиваются с ограничением: формат «из коробки» не поддерживает тип номенклатуры Набор. Это происходит потому, что в XDTO-схеме формата ED до определенных версий просто отсутствует соответствующее значение в перечислении типов номенклатуры, а сама структура объекта Номенклатура не предусматривает передачу состава комплекта.
В данной статье мы разберем, как обойти это ограничение, сохранив базы на поддержке, и научим систему передавать наборы и их комплектующие. Мы проанализируем использование расширений, работу в Конвертации данных 3.0 и способы сериализации данных состава набора.
Основная причина кроется в архитектуре EnterpriseData. Формат ориентирован на универсальность, и специфические механизмы УТ 11, такие как динамические наборы, не всегда вписываются в общепринятые схемы. При попытке выгрузить номенклатуру с видом Набор, модуль менеджера обмена не находит соответствия в правилах и либо пропускает объект, либо выдает ошибку сопоставления типов.
Для решения задачи нам потребуется изменить логику работы МодуляМенеджераОбменаЧерезУниверсальныйформат. Поскольку базы находятся на поддержке, мы будем использовать механизм расширений.
Первым делом создадим новое расширение и добавим в него МодульМенеджераОбменаЧерезУниверсальныйформат. Этот модуль является ключевым звеном, так как именно в нем описаны правила выгрузки и загрузки данных в формате XDTO.
Рассмотрим две основные стратегии реализации:
Набор как обычный Товар, но в дополнительные реквизиты упаковываем информацию о его составе.Мы подробно разберем первый вариант как наиболее практичный и отказоустойчивый.
Нам необходимо перехватить процесс формирования данных XDTO для номенклатуры. Разберем процедуру ППО_Номенклатура_Отправка (или аналогичную в зависимости от версии). Нам нужно изменить сопоставление типа номенклатуры. Проанализируем пример кода, который можно внедрить в расширение:
&После("ЗаполнитьДанныеОбъектаXDTO")
Процедура Расш_ЗаполнитьДанныеОбъектаXDTO(ДанныеИБ, ДанныеXDTO, КомпонентыОбмена)
Если ТипЗнч(ДанныеИБ) = Тип("СправочникСсылка.Номенклатура") Тогда
Если ДанныеИБ.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Набор Тогда
// Подменяем тип для формата ED, чтобы он прошел валидацию схемы
ДанныеXDTO.ТипНоменклатуры = "Товар";
// Формируем состав набора
СоставНабора = ПолучитьСоставНабора(ДанныеИБ);
СтрокаСоставаJSON = СформироватьJSONСостава(СоставНабора);
// Записываем состав в дополнительные реквизиты
НоваяСтрокаДоп = ДанныеXDTO.ДополнительныеРеквизиты.Добавить();
НоваяСтрокаДоп.Свойство = "СоставКомплектаJSON";
НоваяСтрокаДоп.Значение = СтрокаСоставаJSON;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
В этом примере мы используем стандартную коллекцию ДополнительныеРеквизиты объекта Номенклатура в формате ED. Это позволяет нам передать произвольную строку данных, не меняя структуру XML-файла обмена.
Выясним, как программно получить комплектующие набора в УТ 11. Данные хранятся в регистре сведений ВариантыКомплектацииНоменклатуры. Рассмотрим функцию сбора данных:
Функция ПолучитьСоставНабора(НоменклатураСсылка)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Варианты.Номенклатура.Код КАК Код,
| Варианты.Количество КАК Количество
|ИЗ
| РегистрСведений.ВариантыКомплектацииНоменклатуры КАК Варианты
|ГДЕ
| Варианты.Владелец = &НоменклатураСсылка";
Запрос.УстановитьПараметр("НоменклатураСсылка", НоменклатураСсылка);
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции
Важно помнить, что для идентификации комплектующих в базе-приемнике лучше использовать Код или GUID, так как ссылки в разных базах будут отличаться.
На стороне приемника нам нужно выполнить обратную операцию. В том же модуле менеджера обмена в расширении перехватываем процедуру загрузки объекта (например, ППО_Номенклатура_Получение).
Проанализируем шаги, которые необходимо выполнить:
ДополнительныеРеквизиты свойство с нашим JSON.Номенклатура (которому мы принудительно установим вид Набор в базе-приемнике), программно заполнить регистр сведений ВариантыКомплектацииНоменклатуры.
&После("ПослеЗаписиОбъектаИБ")
Процедура Расш_ПослеЗаписиОбъектаИБ(ДанныеXDTO, ОбъектИБ, КомпонентыОбмена)
// Ищем наш дополнительный реквизит
Для Каждого ТекРеквизит Из ДанныеXDTO.ДополнительныеРеквизиты Цикл
Если ТекРеквизит.Свойство = "СоставКомплектаJSON" Тогда
Состав = РаспарситьJSON(ТекРеквизит.Значение);
ОбновитьРегистрСостава(ОбъектИБ.Ссылка, Состав);
Прервать;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Рассмотрим более системный подход. Как советуют участники форума, правильнее всего загрузить текст модуля менеджера обмена в конфигурацию Конвертация данных 3.0 (КД 3). Это позволит:
Важный нюанс: при работе в КД 3.0 необходимо следить за версией формата. Если вы решите перейти на более высокую версию ED (например, 1.10+), как предлагалось в сообщении 1, обязательно проверьте, поддерживают ли обе базы (отправитель и приемник) эту версию. Однако, даже в новых версиях, специфическая логика «наборов» УТ 11 может потребовать ручной доработки состава.
Если вы успешно передали номенклатуру-набор, это только половина дела. Выясним причину, по которой документы (Заказы, Реализации) могут загружаться некорректно. В УТ 11 наборы в табличных частях могут отображаться по-разному: только заголовок или заголовок с комплектующими.
Если в базе-приемнике требуется видеть состав набора в документах, вам придется доработать правила выгрузки документов, чтобы они корректно подтягивали информацию о связях строк. Рассмотрим это подробнее: в формате EnterpriseData строка табличной части документа имеет поле КлючСвязи. Используйте его для того, чтобы связать «родительскую» строку набора с его комплектующими при передаче.
Подведем итоги нашего анализа. Передача наборов через EnterpriseData 1.7 вполне возможна при соблюдении следующих условий:
Товар).ПослеЗаписи.Такой подход является наиболее гибким и позволяет передавать наборы любой сложности, не дожидаясь обновлений формата EnterpriseData от фирмы 1С.