Как использовать другой XDTO-пакет в обмене EnterpriseData?

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

При работе с обменами данными в 1С часто возникает необходимость передавать нестандартные реквизиты или даже целые объекты, которые не предусмотрены типовым форматом EnterpriseData. Обычное желание в такой ситуации — полностью изменить XDTO-пакет. Однако, как мы выясним, гораздо более правильным и гибким подходом является не замена типового пакета, а его расширение. Такой метод позволяет нам модифицировать формат обмена, сохраняя при этом конфигурацию на поддержке, что является критически важным для долгосрочной эксплуатации системы.

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

Основы работы с расширениями XDTO-пакетов

Прежде чем мы приступим к пошаговому внедрению, рассмотрим подробнее концепцию расширений XDTO-пакетов в контексте EnterpriseData.

Что такое расширение XDTO-пакета и зачем оно нужно?
Расширения XDTO-пакетов предоставляют нам возможность добавлять новые элементы (например, новые свойства к существующим типам объектов или даже совершенно новые типы объектов) в уже определенные структуры данных EnterpriseData. Это крайне удобно, когда нам требуется синхронизировать дополнительные ключевые поля или специфические реквизиты, которых нет в стандартном формате. При этом мы не вносим изменений в типовой пакет, что позволяет избежать сложностей при обновлении конфигурации. Важно отметить, что с помощью расширения мы не можем удалять или переименовывать существующие элементы типового пакета, но в большинстве случаев это и не требуется.

Ключевые отличия от расширений конфигурации
Мы должны четко понимать, что "расширение пакета XDTO" и "расширение конфигурации" — это две разные сущности. Хотя на практике реализация расширения XDTO-пакета чаще всего происходит внутри расширения конфигурации. Расширение конфигурации позволяет нам модифицировать код, формы и объекты метаданных без снятия конфигурации с поддержки, а расширение XDTO-пакета — это способ модификации структуры XML-файлов обмена.

Пространство имен (URI)
Одним из фундаментальных требований при создании расширяющего XDTO-пакета является использование уникального пространства имен (URI), которое должно отличаться от пространства имен основного пакета EnterpriseData. Например, если типовой URI выглядит как http://v8.1c.ru/edi/edi_stnd/EnterpriseData, то для нашего расширения мы можем использовать http://v8.1c.ru/edi/edi_stnd/EnterpriseDataExt или добавить числовую составляющую, например, http://v8.1c.ru/edi/edi_stnd/EnterpriseData/1.17_Custom. Это позволяет менеджеру обмена корректно идентифицировать и обрабатывать данные как расширенный формат.

Пошаговое решение: Интеграция расширенного XDTO-пакета

Теперь давайте разберем по шагам, как мы можем реализовать использование расширенного XDTO-пакета в нашем обмене EnterpriseData.

  1. Шаг 1: Поиск и изменение базовых настроек формата

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

    Нас интересует процедура ПриПолученииНастроек в этом модуле. В ней мы устанавливаем основной формат обмена. Важно: здесь мы указываем URI типового пакета EnterpriseData, так как наш пакет является его расширением. Затем мы добавим наш URI расширения в отдельную коллекцию настроек.

    Рассмотрим пример, где мы указываем основной формат обмена:

    
    // Модуль менеджера плана обмена "СинхронизацияДанныхЧерезУниверсальныйФормат"
    Процедура ПриПолученииНастроек(Настройки)
        // ... другие настройки
        Настройки.ФорматОбмена = "http://v8.1c.ru/edi/edi_stnd/EnterpriseData"; 
        // ...
    КонецПроцедуры
    

    Это базовая настройка, которая указывает на основной формат. Далее мы дополним ее информацией о нашем расширении.

  2. Шаг 2: Регистрация вашего расширения XDTO-пакета

    Чтобы система знала о существовании нашего расширенного XDTO-пакета, его необходимо зарегистрировать. Мы сделаем это в модуле ОбменДаннымиПереопределяемый (или его аналоге, если вы используете собственную реализацию). Для этого мы модифицируем или создадим обработчик процедуры ПриПолученииДоступныхРасширенийФормата. Как правило, такие изменения реализуются через расширение конфигурации с использованием директив &После или &ИзменениеИКонтроль.

    В этой процедуре мы добавим URI нашего расширяющего пакета и соответствующую версию формата в коллекцию РасширенияФормата. Обратите внимание на суффикс "Ext" в URI, который явно указывает на расширение.

    Посмотрим на пример кода для регистрации расширения:

    
    // Модуль расширения для модификации "ОбменДаннымиПереопределяемый"
    &ИзменениеИКонтроль("ПриПолученииДоступныхРасширенийФормата")
    Процедура _ПриПолученииДоступныхРасширенийФормата(РасширенияФормата)
        // Добавляем наш URI расширения и версию
        РасширенияФормата.Вставить("http://v8.1c.ru/edi/edi_stnd/EnterpriseDataExt", "1.11");
    КонецПроцедуры
    

    Таким образом, мы сообщаем системе, что помимо стандартного формата, существует еще и наше расширение с определенным пространством имен и версией.

  3. Шаг 3: Корректировка процедуры ПриПолученииНастроек для учета расширения

    Теперь вернемся к процедуре ПриПолученииНастроек, которую мы упоминали на Шаге 1. Помимо указания основного формата, здесь нам необходимо явно добавить наш расширяющий XDTO-пакет в коллекцию Настройки.РасширенияФорматаОбмена. Это гарантирует, что менеджер обмена будет учитывать наше расширение при формировании и чтении XML-данных.

    Также в этой процедуре мы устанавливаем другие важные параметры, такие как Настройки.ЭтоПланОбменаXDTO = Истина;, что указывает на использование XDTO-формата, и определяем алгоритмы для различных этапов обмена.

    Проанализируем пример полной процедуры ПриПолученииНастроек с учетом нашего расширения:

    
    // Модуль расширения для модификации "ОбменДаннымиСервер" (или "Модуль менеджера плана обмена")
    &ИзменениеИКонтроль("ПриПолученииНастроек")
    Процедура кмн_ПриПолученииНастроек(Настройки)
    
        Настройки.ИмяКонфигурацииИсточника = Метаданные.Имя;
    
        Настройки.ЭтоПланОбменаXDTO = Истина;
        Настройки.ПредупреждатьОНесоответствииВерсийПравилОбмена = Ложь;
        Настройки.ФорматОбмена = "http://v8.1c.ru/edi/edi_stnd/EnterpriseData"; // Основной формат
    
        ВерсииФормата = Новый Соответствие;
        ПолучитьВерсииФорматаОбмена(ВерсииФормата);
    
        Настройки.ВерсииФорматаОбмена = ВерсииФормата;
    
        Настройки.ПланОбменаИспользуетсяВМоделиСервиса = Истина;
    
        Настройки.Алгоритмы.ПриПолученииВариантовНастроекОбмена   = Истина;
        Настройки.Алгоритмы.ПриПолученииОписанияВариантаНастройки = Истина;
    
        Настройки.Алгоритмы.ПредставлениеОтбораИнтерактивнойВыгрузки = Истина;
        Настройки.Алгоритмы.НастроитьИнтерактивнуюВыгрузку           = Истина;
    
        // Добавляем наше расширение в коллекцию расширений формата
        Настройки.РасширенияФорматаОбмена.Вставить("http://v8.1c.ru/edi/edi_stnd/EnterpriseDataExt", "1.11");
        
    КонецПроцедуры
    

    Здесь мы видим, что помимо стандартных настроек, мы добавили строку с Настройки.РасширенияФорматаОбмена.Вставить(...), что является ключевым для активации нашего расширения.

  4. Шаг 4: Настройка правил конвертации объектов (ПКО) для работы с расширенными свойствами

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

    Эта функция связывает конкретное правило конвертации объекта с нашим расширенным XDTO-пакетом. После этого мы можем добавлять новые свойства в правила конвертации свойств (ПКС), указывая, что они относятся к нашему расширению. Для расширенных свойств в ПКС, помимо стандартных параметров (ИмяСвойстваИсточника, ИмяСвойстваПриемника, ТипСвойстваПриемника, Алгоритм, ПравилоКонвертации), мы указываем шестой параметр — URI пространства имен расширенного пакета.

    Посмотрим на пример добавления расширенных свойств для справочника "Контрагенты":

    
    // Модуль менеджера обмена (или модуль расширения)
    &ИзменениеИКонтроль("ДобавитьПКО_Справочник_Контрагенты_Отправка")
    Процедура кмн_ДобавитьПКО_Справочник_Контрагенты_Отправка(ПравилаКонвертации)
    	
    	ПравилоКонвертации = ОбменДаннымиXDTOСервер.ИнициализироватьПравилоКонвертацииОбъекта(ПравилаКонвертации);
    	ПравилоКонвертации.ИмяПКО            = "Справочник_Контрагенты_Отправка";
    	ПравилоКонвертации.ОбъектДанных      = Метаданные.Справочники.Контрагенты;
    	ПравилоКонвертации.ОбъектФормата     = "Справочник.Контрагенты";
    	ПравилоКонвертации.ПриОтправкеДанных = "ПКО_Справочник_Контрагенты_Отправка_ПриОтправкеДанных";
    	
    	СвойстваШапки = ПравилоКонвертации.Свойства;
    	// ... стандартные свойства
    	ДобавитьПКС(СвойстваШапки, "ИНН",                    "ИНН");
    	// ...
    
    	// Инициализируем расширение правила конвертации для данного объекта
    	ОбменДаннымиXDTOСервер.ИнициализироватьРасширениеПравилаКонвертацииОбъекта(ПравилоКонвертации, "http://v8.1c.ru/edi/edi_stnd/EnterpriseDataExt");
    	
    	// Добавляем наши расширенные свойства, указывая пространство имен расширения в 6-м параметре
    	ДобавитьПКС(СвойстваШапки, "",           "кмн_ЮрФизЛицо",             1, , "http://v8.1c.ru/edi/edi_stnd/EnterpriseDataExt");
    	ДобавитьПКС(СвойстваШапки, "",           "кмн_ЭтоИП",                 1, , "http://v8.1c.ru/edi/edi_stnd/EnterpriseDataExt");
    	
    КонецПроцедуры
    

    В этом примере мы сначала вызываем ИнициализироватьРасширениеПравилаКонвертацииОбъекта, а затем для наших специфических свойств кмн_ЮрФизЛицо и кмн_ЭтоИП указываем URI нашего расширенного пакета в качестве шестого параметра функции ДобавитьПКС. Это позволяет системе корректно выгружать и загружать эти свойства как часть расширенного формата.

Альтернативные подходы и важные нюансы

Помимо основного метода с использованием расширений XDTO-пакетов, существуют и другие аспекты, которые нам следует учитывать.

Использование поля AdditionalInfo
Для передачи небольшого количества нетиповых реквизитов, которые не требуют жесткой структуры, мы можем рассмотреть использование поля AdditionalInfo. Это поле присутствует в базовом типе Object пакета EnterpriseData и позволяет передавать произвольные данные в виде структуры. Мы можем упаковать наши дополнительные сведения в эту структуру при выгрузке и затем считать их при загрузке. Однако, если новых свойств много или они разбросаны по нескольким объектам формата, работа через AdditionalInfo может стать неудобной и менее читаемой, поэтому предпочтительнее использовать полноценные расширения XDTO.

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

Рекомендации по установке и обновлению

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

Параметр ЭтоПланОбменаXDTO
Этот параметр в настройках плана обмена (Настройки.ЭтоПланОбменаXDTO) имеет значение Истина, когда план обмена использует XDTO-формат. Мы всегда должны убеждаться, что этот параметр установлен правильно, чтобы система корректно обрабатывала данные.

Использование расширений конфигурации для реализации
Для того чтобы не вносить изменения непосредственно в типовую конфигурацию, все описанные модификации (процедуры в модулях ОбменДаннымиПереопределяемый, ОбменДаннымиСервер, модулях менеджеров планов обмена) мы можем реализовать в расширении конфигурации. Это лучший подход, так как он значительно упрощает обновление типовой конфигурации и поддержание системы.

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

← К списку