При работе с типовыми конфигурациями 1С:Предприятия мы часто сталкиваемся с необходимостью передачи дополнительных данных, которые не предусмотрены стандартным форматом обмена EnterpriseData (ЕД). В таких случаях перед нами встает задача расширения этого формата. Давайте вместе разберем, какие подходы существуют для добавления собственных реквизитов и как правильно реализовать эти изменения, чтобы обеспечить корректный обмен данными между системами 1С. Мы рассмотрим два основных механизма расширения формата EnterpriseData:
AdditionalInfo – более гибкий способ передачи произвольных данных без прямого изменения структуры XDTO-пакета.Также мы выясним, как правильно зарегистрировать новую версию формата обмена, чтобы система могла корректно работать с нашими изменениями.
Этот подход требует более глубокого вмешательства в логику обмена и предназначен для случаев, когда новые данные должны стать полноценной частью структуры обмена, быть строго типизированы и доступны в XDTO-схеме. Рассмотрим подробнее шаги по реализации такого расширения.
Мы начинаем с модификации процедуры, отвечающей за инициализацию правил конвертации объекта. Как правило, это процедуры с именами, начинающимися с ДобавитьПКО_, например, ДобавитьПКО_Справочник_Подразделения_Отправка. В этой процедуре мы инициализируем расширение для нашего ПКО и добавляем новое правило конвертации свойств (ПКС).
Посмотрим на пример кода, который демонстрирует добавление нового реквизита "мой_КодСоответствия" для справочника "Подразделения":
&ИзменениеИКонтроль("ДобавитьПКО_Справочник_Подразделения_Отправка")
Процедура 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, "Справочник_ДополнительныеРеквизиты");
КонецПроцедуры
Обратите внимание на блок с комментариями:
_qw (например, http://v8.1c.ru/edi/edi_stnd/EnterpriseData_qw/1.19). Однако для стандартных расширений формата EnterpriseData мы рекомендуем использовать пространство имен вида http://v8.1c.ru/edi/edi_stnd/EnterpriseData/Х.ХХ, где Х.ХХ – это номер версии.ОбменДаннымиXDTOСервер.ИнициализироватьРасширениеПравилаКонвертацииОбъекта(), чтобы указать дополнительное пространство имен для нашего расширения. Это гарантирует, что наши новые реквизиты будут корректно интерпретированы в XDTO-схеме.ДобавитьПКС(). Важный момент: если наш новый реквизит не относится к дополнительному пространству имен, то указывать его в параметрах функции ДобавитьПКС не нужно, как показано в исправленном примере.
После того как мы описали новое свойство в ПКО, нам необходимо обеспечить его заполнение данными из информационной базы при выгрузке. Это делается в процедуре ПриОтправкеДанных соответствующего ПКО.
Разберем следующий пример:
&ИзменениеИКонтроль("ПКО_Справочник_Подразделения_Отправка_ПриОтправкеДанных")
Процедура apkПКО_Справочник_Подразделения_Отправка_ПриОтправкеДанных(ДанныеИБ, ДанныеXDTO, КомпонентыОбмена, СтекВыгрузки)
Если СтекВыгрузки.Количество() > 1 Тогда
Возврат;
КонецЕсли;
Если ЕстьРеквизитДанныхИБ(ДанныеИБ, "ДополнительныеРеквизиты") Тогда
ВыгрузитьДополнительныеРеквизитыИСведения(КомпонентыОбмена, ДанныеИБ, ДанныеXDTO, Истина);
КонецЕсли;
// #Вставка
Если НЕ ПустаяСтрока(ДанныеИБ.мой_КодСоответствия) Тогда
ДанныеXDTO.КлючевыеСвойства.Вставить("мой_КодСоответствия",ДанныеИБ.мой_КодСоответствия);
КонецЕсли;
// #КонецВставки
КонецПроцедуры
Здесь мы проверяем, заполнено ли значение нашего реквизита мой_КодСоответствия в исходных данных информационной базы (ДанныеИБ), и если да, то вставляем его в коллекцию ключевых свойств объекта XDTO (ДанныеXDTO.КлючевыеСвойства).
Чтобы система 1С распознавала и могла работать с расширенным форматом, нам необходимо зарегистрировать новую версию формата обмена. Мы сделаем это, добавив запись в процедуру ВерсииФорматаОбмена общего модуля ОбменДаннымиXDTOСервер (или аналогичного модуля, например, "МенеджерОбмена" в ERP).
Посмотрим на пример вставки:
// #Вставка
Результат.Вставить("1.19", МенеджерОбменаЧерезУниверсальныйФормат13);
// #КонецВставки
Здесь мы связываем новую версию "1.19" с соответствующим обработчиком обмена (например, МенеджерОбменаЧерезУниверсальныйФормат13), который будет использовать наши расширенные правила конвертации.
При прямом расширении формата ЕД мы должны учитывать следующие моменты:
http://v8.1c.ru/edi/edi_stnd/EnterpriseData/Х.ХХ.String, Boolean, Decimal, DateTime, обычно автоматически преобразуются. Однако для сложных типов или ссылочных данных может потребоваться дополнительная настройка правил конвертации. Если в XDTO-пакете реквизит имеет тип String? (т.е. строка, которая может быть пустой), то при его заполнении в 1С необходимо убедиться, что данные ИБ соответствуют этому типу.AdditionalInfo
Механизм AdditionalInfo (дополнительная информация) предоставляет более простой и гибкий способ передачи произвольных данных без прямого изменения структуры XDTO-пакета ЕД. Этот метод идеально подходит для передачи необязательных или специфических данных, которые не являются частью основной структуры ЕД и не требуют глубоких изменений в XDTO-схеме.
Разберем, как использовать AdditionalInfo.
AdditionalInfo на стороне источника
На стороне базы-источника, в процедуре ПриОтправкеДанных соответствующего ПКО, мы можем добавить структурированные данные в свойство AdditionalInfo объекта ДанныеXDTO.
Посмотрим на пример:
// В процедуре ПриОтправкеДанных ПКО
ДанныеXDTO.Вставить("AdditionalInfo", Новый Структура("ВашРеквизит", ДанныеИБ.ВашРеквизит));
В этом примере мы создаем структуру, содержащую наш реквизит "ВашРеквизит" и его значение из данных информационной базы (ДанныеИБ.ВашРеквизит), и помещаем эту структуру в свойство AdditionalInfo.
AdditionalInfo на стороне приемника
На стороне базы-приемника, в процедуре ПриКонвертацииДанныхXDTO соответствующего ПКО, мы можем получить эти данные. Нам необходимо проверить наличие свойства AdditionalInfo и его тип, а затем извлечь нужные значения.
Пример получения данных:
// В процедуре ПриКонвертацииДанныхXDTO ПКО
Если ДанныеXDTO.Свойство("AdditionalInfo") И ТипЗнч(ДанныеXDTO.AdditionalInfo) = Тип("Структура") Тогда
ВашаПеременнаяДляУдобства = ДанныеXDTO.AdditionalInfo.ВашРеквизит;
Если ЗначениеЗаполнено(ВашаПеременнаяДляУдобства) Тогда
ПолученныеДанные.ВашРеквизит = ВашаПеременнаяДляУдобства;
КонецЕсли;
КонецЕсли;
Здесь мы сначала убеждаемся, что свойство AdditionalInfo существует и является структурой, а затем извлекаем значение "ВашРеквизит" и присваиваем его соответствующему реквизиту в объекте ПолученныеДанные.
AdditionalInfoМы рассмотрели два основных подхода к расширению формата EnterpriseData в 1С:Предприятии. Выбор метода зависит от ваших конкретных требований:
AdditionalInfo для передачи дополнительных, менее структурированных данных, которые не требуют жесткой типизации и не являются ключевыми для основной структуры обмена.В любом случае, мы рекомендуем тщательно планировать изменения, проводить их в тестовой среде и проверять корректность обмена данными после каждого этапа модификации. Это поможет избежать ошибок и обеспечит стабильную работу ваших систем.
← К списку