Как передать произвольный параметр при обмене через универсальный формат (EnterpriseData) в 1С?

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

При настройке синхронизации данных между конфигурациями 1С (например, между Управление торговлей и взаимоотношениями с клиентами (CRM) и Бухгалтерия предприятия 3.0) часто возникает задача передать вместе с объектом дополнительные сведения. Если эти данные хранятся не в самом объекте (например, не в реквизитах справочника Номенклатура), а в отдельном регистре сведений, стандартных полей пакета XDTO EnterpriseData может не хватить. Рассмотрим, как решить эту проблему и правильно передать параметр в приемник.

Основное решение: Использование узла AdditionalInfo

В универсальном формате EnterpriseData предусмотрено специальное свойство AdditionalInfo (Дополнительная информация). Оно предназначено как раз для передачи пользовательских данных в виде структуры «Ключ — Значение», не изменяя при этом основную схему XDTO выгружаемого объекта.

Разберем процесс реализации по шагам:

  1. Формирование и отправка данных на стороне источника:

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

    Посмотрим на пример кода выгрузки:

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

    В базе-приемнике в обработчике получения данных (например, ПКО_Справочник_Номенклатура_Получение_ПриПолученииДанных или ПослеЗагрузкиДанных) считываем значение из AdditionalInfo и записываем его в нужный реквизит номенклатуры.

    Проанализируем пример кода загрузки:

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

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

  1. Штатный механизм «Дополнительные реквизиты и сведения» (БСП):

    Если передаваемое значение логически является доп. сведением или реквизитом объекта, можно воспользоваться стандартным механизмом БСП. Формат EnterpriseData из коробки умеет передавать коллекцию ДополнительныеРеквизиты, что избавит от необходимости вручную формировать узлы XML.

  2. Расширение пакета XDTO:

    Если требуется передать сложную структурированную иерархию данных, можно создать расширение XDTO-пакета (на базе используемой версии, например EnterpriseData_1_2_1) и добавить в тип данных номенклатуры новое свойство. Этот способ более трудоемок, так как требует настройки правил в конфигурации «Конвертация данных 3.0».

Важные технические нюансы и ограничения

При реализации обмена с передачей дополнительных параметров следует учитывать следующие особенности:

1. Типы данных в AdditionalInfo: Поле рассчитано на примитивные типы (строка, число, булево, дата) или сериализованные строки (JSON, XML, Внутренняя строка). Если из регистра требуется передать ссылку на объект (например, другой справочник), передавайте его Уникальный Идентификатор (UUID), ИНН или код в виде строки, а на стороне приемника выполняйте программный поиск через Справочники.ИмяСправочника.НайтиПо...().

2. Регистрация изменений на плане обмена: Обратите внимание, что изменение записей в регистре сведений автоматически не регистрирует связанную номенклатуру на плане обмена. Если значение в регистре изменилось, элемент номенклатуры не попадет в сеанс выгрузки. Для решения этой проблемы в модуле набора записей регистра сведений в событии ПриЗаписи вызовите метод ПланыОбмена.ЗарегистрироватьИзменения() для соответствующей номенклатуры.

3. Сохранение типовой конфигурации: Доработки алгоритмов выгрузки и загрузки в модуле МенеджерОбменаЧерезУниверсальныйФормат рекомендуется выполнять через **расширение конфигурации**, используя аннотации &После или &ИзменениеИКонтроль. Это позволит сохранить конфигурацию на типовой поддержке и существенно упростит последующие обновления.

← На главную