Как расширить стандартный формат обмена EnterpriseData (ЕД) в 1С:Предприятии, чтобы добавить свои реквизиты?

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

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

  1. Прямое расширение правил конвертации объектов (ПКО) и XDTO-пакета – этот метод предполагает непосредственное добавление новых свойств в правила конвертации и соответствующее расширение XDTO-схемы.
  2. Использование механизма AdditionalInfo – более гибкий способ передачи произвольных данных без прямого изменения структуры XDTO-пакета.

Также мы выясним, как правильно зарегистрировать новую версию формата обмена, чтобы система могла корректно работать с нашими изменениями.

Метод 1: Прямое расширение правил конвертации объектов (ПКО) и XDTO-пакета

Этот подход требует более глубокого вмешательства в логику обмена и предназначен для случаев, когда новые данные должны стать полноценной частью структуры обмена, быть строго типизированы и доступны в XDTO-схеме. Рассмотрим подробнее шаги по реализации такого расширения.

Шаг 1: Добавление нового свойства в Правило конвертации объекта (ПКО)

Мы начинаем с модификации процедуры, отвечающей за инициализацию правил конвертации объекта. Как правило, это процедуры с именами, начинающимися с ДобавитьПКО_, например, ДобавитьПКО_Справочник_Подразделения_Отправка. В этой процедуре мы инициализируем расширение для нашего ПКО и добавляем новое правило конвертации свойств (ПКС). Посмотрим на пример кода, который демонстрирует добавление нового реквизита "мой_КодСоответствия" для справочника "Подразделения":


&ИзменениеИКонтроль("ДобавитьПКО_Справочник_Подразделения_Отправка")
Процедура apkДобавитьПКО_Справочник_Подразделения_Отправка(ПравилаКонвертации)
    ПравилоКонвертации = ОбменДаннымиXDTOСервер.ИнициализироватьПравилоКонвертацииОбъекта(ПравилаКонвертации);
    ПравилоКонвертации.ИмяПКО              = "Справочник_Подразделения_Отправка";
    ПравилоКонвертации.ОбъектДанных        = Метаданные.Справочники.СтруктураПредприятия;
    ПравилоКонвертации.ОбъектФормата       = "Справочник.Подразделения";
    ПравилоКонвертации.ПриОтправкеДанных   = "ПКО_Справочник_Подразделения_Отправка_ПриОтправкеДанных";

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

    // #Вставка
    // Изначально предлагалось использовать ПространствоИмен = "http://v8.1c.ru/edi/edi_stnd/EnterpriseData_qw/1.19";
    // ОбменДаннымиXDTOСервер.ИнициализироватьРасширениеПравилаКонвертацииОбъекта(ПравилоКонвертации, ПространствоИмен);
    // ДобавитьПКС(СвойстваШапки,"мой_КодСоответствия","мой_КодСоответствия",1,,ПространствоИмен);

    // Но, согласно уточнениям, правильнее использовать стандартное пространство имен и другой подход:
    ПравилоКонвертации.ПространствоИмен = "http://v8.1c.ru/edi/edi_stnd/EnterpriseData/1.19";
    ОбменДаннымиXDTOСервер.ИнициализироватьРасширениеПравилаКонвертацииОбъекта(ПравилоКонвертации, ПравилоКонвертации.ПространствоИмен);
    ДобавитьПКС(СвойстваШапки,"мой_КодСоответствия","мой_КодСоответствия");
    // #КонецВставки

    СвойстваТЧ = ДобавитьПКТЧ(ПравилоКонвертации, "", "ДополнительныеРеквизиты");
    ДобавитьПКС(СвойстваТЧ, "", "ЗначениеСвойства", 1);
    ДобавитьПКС(СвойстваТЧ, "", "Свойство", 1, "Справочник_ДополнительныеРеквизиты");
КонецПроцедуры

Обратите внимание на блок с комментариями:

Шаг 2: Заполнение нового свойства при отправке данных

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


&ИзменениеИКонтроль("ПКО_Справочник_Подразделения_Отправка_ПриОтправкеДанных")
Процедура apkПКО_Справочник_Подразделения_Отправка_ПриОтправкеДанных(ДанныеИБ, ДанныеXDTO, КомпонентыОбмена, СтекВыгрузки)
    Если СтекВыгрузки.Количество() > 1 Тогда
        Возврат;
    КонецЕсли;

    Если ЕстьРеквизитДанныхИБ(ДанныеИБ, "ДополнительныеРеквизиты") Тогда
        ВыгрузитьДополнительныеРеквизитыИСведения(КомпонентыОбмена, ДанныеИБ, ДанныеXDTO, Истина);
    КонецЕсли;

    // #Вставка
    Если НЕ ПустаяСтрока(ДанныеИБ.мой_КодСоответствия) Тогда
        ДанныеXDTO.КлючевыеСвойства.Вставить("мой_КодСоответствия",ДанныеИБ.мой_КодСоответствия);
    КонецЕсли;
    // #КонецВставки
КонецПроцедуры

Здесь мы проверяем, заполнено ли значение нашего реквизита мой_КодСоответствия в исходных данных информационной базы (ДанныеИБ), и если да, то вставляем его в коллекцию ключевых свойств объекта XDTO (ДанныеXDTO.КлючевыеСвойства).

Шаг 3: Регистрация новой версии формата обмена

Чтобы система 1С распознавала и могла работать с расширенным форматом, нам необходимо зарегистрировать новую версию формата обмена. Мы сделаем это, добавив запись в процедуру ВерсииФорматаОбмена общего модуля ОбменДаннымиXDTOСервер (или аналогичного модуля, например, "МенеджерОбмена" в ERP). Посмотрим на пример вставки:


// #Вставка
Результат.Вставить("1.19", МенеджерОбменаЧерезУниверсальныйФормат13);
// #КонецВставки

Здесь мы связываем новую версию "1.19" с соответствующим обработчиком обмена (например, МенеджерОбменаЧерезУниверсальныйФормат13), который будет использовать наши расширенные правила конвертации.

Пространства имен XDTO и типы данных

При прямом расширении формата ЕД мы должны учитывать следующие моменты:

Метод 2: Использование механизма AdditionalInfo

Механизм AdditionalInfo (дополнительная информация) предоставляет более простой и гибкий способ передачи произвольных данных без прямого изменения структуры XDTO-пакета ЕД. Этот метод идеально подходит для передачи необязательных или специфических данных, которые не являются частью основной структуры ЕД и не требуют глубоких изменений в XDTO-схеме. Разберем, как использовать AdditionalInfo.

Шаг 1: Добавление данных в AdditionalInfo на стороне источника

На стороне базы-источника, в процедуре ПриОтправкеДанных соответствующего ПКО, мы можем добавить структурированные данные в свойство AdditionalInfo объекта ДанныеXDTO. Посмотрим на пример:


// В процедуре ПриОтправкеДанных ПКО
ДанныеXDTO.Вставить("AdditionalInfo", Новый Структура("ВашРеквизит", ДанныеИБ.ВашРеквизит));

В этом примере мы создаем структуру, содержащую наш реквизит "ВашРеквизит" и его значение из данных информационной базы (ДанныеИБ.ВашРеквизит), и помещаем эту структуру в свойство AdditionalInfo.

Шаг 2: Получение данных из AdditionalInfo на стороне приемника

На стороне базы-приемника, в процедуре ПриКонвертацииДанныхXDTO соответствующего ПКО, мы можем получить эти данные. Нам необходимо проверить наличие свойства AdditionalInfo и его тип, а затем извлечь нужные значения. Пример получения данных:


// В процедуре ПриКонвертацииДанныхXDTO ПКО
Если ДанныеXDTO.Свойство("AdditionalInfo") И ТипЗнч(ДанныеXDTO.AdditionalInfo) = Тип("Структура") Тогда
    ВашаПеременнаяДляУдобства = ДанныеXDTO.AdditionalInfo.ВашРеквизит;

    Если ЗначениеЗаполнено(ВашаПеременнаяДляУдобства) Тогда
        ПолученныеДанные.ВашРеквизит = ВашаПеременнаяДляУдобства;
    КонецЕсли;
КонецЕсли;

Здесь мы сначала убеждаемся, что свойство AdditionalInfo существует и является структурой, а затем извлекаем значение "ВашРеквизит" и присваиваем его соответствующему реквизиту в объекте ПолученныеДанные.

Преимущества и ограничения AdditionalInfo

Заключение

Мы рассмотрели два основных подхода к расширению формата EnterpriseData в 1С:Предприятии. Выбор метода зависит от ваших конкретных требований:

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

← К списку