Как реализовать обмен номенклатурой с видом Набор через EnterpriseData 1.7?

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

При использовании стандартного обмена через EnterpriseData (ED) версии 1.7 в конфигурациях 1С:Управление торговлей 11, ERP или Комплексная автоматизация разработчики часто сталкиваются с ограничением: формат «из коробки» не поддерживает тип номенклатуры Набор. Это происходит потому, что в XDTO-схеме формата ED до определенных версий просто отсутствует соответствующее значение в перечислении типов номенклатуры, а сама структура объекта Номенклатура не предусматривает передачу состава комплекта.

В данной статье мы разберем, как обойти это ограничение, сохранив базы на поддержке, и научим систему передавать наборы и их комплектующие. Мы проанализируем использование расширений, работу в Конвертации данных 3.0 и способы сериализации данных состава набора.

Почему возникает проблема?

Основная причина кроется в архитектуре EnterpriseData. Формат ориентирован на универсальность, и специфические механизмы УТ 11, такие как динамические наборы, не всегда вписываются в общепринятые схемы. При попытке выгрузить номенклатуру с видом Набор, модуль менеджера обмена не находит соответствия в правилах и либо пропускает объект, либо выдает ошибку сопоставления типов.

Для решения задачи нам потребуется изменить логику работы МодуляМенеджераОбменаЧерезУниверсальныйформат. Поскольку базы находятся на поддержке, мы будем использовать механизм расширений.

Шаг 1: Подготовка расширения и выбор стратегии

Первым делом создадим новое расширение и добавим в него МодульМенеджераОбменаЧерезУниверсальныйформат. Этот модуль является ключевым звеном, так как именно в нем описаны правила выгрузки и загрузки данных в формате XDTO.

Рассмотрим две основные стратегии реализации:

  1. Маскировка под Товар: Мы передаем Набор как обычный Товар, но в дополнительные реквизиты упаковываем информацию о его составе.
  2. Модификация XDTO-пакета: Создание собственного пространства имен в расширении для передачи состава. Это более сложный путь, требующий глубокой правки схем.

Мы подробно разберем первый вариант как наиболее практичный и отказоустойчивый.

Шаг 2: Модификация правил выгрузки (Отправка)

Нам необходимо перехватить процесс формирования данных XDTO для номенклатуры. Разберем процедуру ППО_Номенклатура_Отправка (или аналогичную в зависимости от версии). Нам нужно изменить сопоставление типа номенклатуры. Проанализируем пример кода, который можно внедрить в расширение:


&После("ЗаполнитьДанныеОбъектаXDTO")
Процедура Расш_ЗаполнитьДанныеОбъектаXDTO(ДанныеИБ, ДанныеXDTO, КомпонентыОбмена)
    Если ТипЗнч(ДанныеИБ) = Тип("СправочникСсылка.Номенклатура") Тогда
        Если ДанныеИБ.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Набор Тогда
            // Подменяем тип для формата ED, чтобы он прошел валидацию схемы
            ДанныеXDTO.ТипНоменклатуры = "Товар"; 
            
            // Формируем состав набора
            СоставНабора = ПолучитьСоставНабора(ДанныеИБ);
            СтрокаСоставаJSON = СформироватьJSONСостава(СоставНабора);
            
            // Записываем состав в дополнительные реквизиты
            НоваяСтрокаДоп = ДанныеXDTO.ДополнительныеРеквизиты.Добавить();
            НоваяСтрокаДоп.Свойство = "СоставКомплектаJSON";
            НоваяСтрокаДоп.Значение = СтрокаСоставаJSON;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

В этом примере мы используем стандартную коллекцию ДополнительныеРеквизиты объекта Номенклатура в формате ED. Это позволяет нам передать произвольную строку данных, не меняя структуру XML-файла обмена.

Шаг 3: Получение состава набора

Выясним, как программно получить комплектующие набора в УТ 11. Данные хранятся в регистре сведений ВариантыКомплектацииНоменклатуры. Рассмотрим функцию сбора данных:


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

Важно помнить, что для идентификации комплектующих в базе-приемнике лучше использовать Код или GUID, так как ссылки в разных базах будут отличаться.

Шаг 4: Обработка при получении (Загрузка)

На стороне приемника нам нужно выполнить обратную операцию. В том же модуле менеджера обмена в расширении перехватываем процедуру загрузки объекта (например, ППО_Номенклатура_Получение).

Проанализируем шаги, которые необходимо выполнить:

  1. Найти в коллекции ДополнительныеРеквизиты свойство с нашим JSON.
  2. Распарсить JSON-строку обратно в таблицу или массив.
  3. После записи объекта Номенклатура (которому мы принудительно установим вид Набор в базе-приемнике), программно заполнить регистр сведений ВариантыКомплектацииНоменклатуры.

&После("ПослеЗаписиОбъектаИБ")
Процедура Расш_ПослеЗаписиОбъектаИБ(ДанныеXDTO, ОбъектИБ, КомпонентыОбмена)
    // Ищем наш дополнительный реквизит
    Для Каждого ТекРеквизит Из ДанныеXDTO.ДополнительныеРеквизиты Цикл
        Если ТекРеквизит.Свойство = "СоставКомплектаJSON" Тогда
            Состав = РаспарситьJSON(ТекРеквизит.Значение);
            ОбновитьРегистрСостава(ОбъектИБ.Ссылка, Состав);
            Прервать;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Использование Конвертации данных 3.0

Рассмотрим более системный подход. Как советуют участники форума, правильнее всего загрузить текст модуля менеджера обмена в конфигурацию Конвертация данных 3.0 (КД 3). Это позволит:

Важный нюанс: при работе в КД 3.0 необходимо следить за версией формата. Если вы решите перейти на более высокую версию ED (например, 1.10+), как предлагалось в сообщении 1, обязательно проверьте, поддерживают ли обе базы (отправитель и приемник) эту версию. Однако, даже в новых версиях, специфическая логика «наборов» УТ 11 может потребовать ручной доработки состава.

Особенности работы с документами

Если вы успешно передали номенклатуру-набор, это только половина дела. Выясним причину, по которой документы (Заказы, Реализации) могут загружаться некорректно. В УТ 11 наборы в табличных частях могут отображаться по-разному: только заголовок или заголовок с комплектующими.

Если в базе-приемнике требуется видеть состав набора в документах, вам придется доработать правила выгрузки документов, чтобы они корректно подтягивали информацию о связях строк. Рассмотрим это подробнее: в формате EnterpriseData строка табличной части документа имеет поле КлючСвязи. Используйте его для того, чтобы связать «родительскую» строку набора с его комплектующими при передаче.

Заключение и рекомендации

Подведем итоги нашего анализа. Передача наборов через EnterpriseData 1.7 вполне возможна при соблюдении следующих условий:

Такой подход является наиболее гибким и позволяет передавать наборы любой сложности, не дожидаясь обновлений формата EnterpriseData от фирмы 1С.

← На главную