Как передать параметр типа Список значений в Конвертации данных 2.x?

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

При настройке правил обмена в конфигурации «Конвертация данных 2.x» (КД) разработчики часто сталкиваются с необходимостью передать сложную коллекцию данных, такую как СписокЗначений или ТаблицаЗначений, в качестве глобального параметра. Напрямую указать этот тип в стандартной таблице параметров на вкладке «Параметры» КД невозможно, так как платформа предлагает выбор только примитивных типов или ссылок на объекты метаданных.

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

Способ 1. Программная передача через сериализацию в строку (классический метод)

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

Разберем алгоритм реализации этого метода. Нам потребуется создать стандартный строковый параметр в правилах обмена, который будет выступать в роли «транспортного контейнера» для нашей коллекции.

  1. Перейдем в Конвертации данных на вкладку «Параметры» и создадим новый параметр с именем СписокПодразделенийСтрокой. Тип значения оставим строковым.
  2. В обработчике события «После выгрузки данных» или в конкретном ПВД (Правило выгрузки данных) преобразуем наш список значений в строку с помощью встроенной функции платформы ЗначениеВСтрокуВнутр() и передадим этот параметр в приемник.

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


// Создаем и заполняем список значений программно
НашСписокЗначений = Новый СписокЗначений;
НашСписокЗначений.Добавить(Справочники.ПодразделенияОрганизаций.НайтиПоКоду("00001"));
НашСписокЗначений.Добавить(Справочники.ПодразделенияОрганизаций.НайтиПоКоду("00002"));

// Сериализуем список значений в строку внутреннего формата 1С
СтроковоеПредставление = ЗначениеВСтрокуВнутр(НашСписокЗначений);

// Передаем параметр в файл обмена для приемника
ПередатьОдинПараметрВПриемник("СписокПодразделенийСтрокой", СтроковоеПредставление);

Теперь разберем, как восстановить этот список на стороне приемника. Нам нужно прочитать строковый параметр и преобразовать его обратно в полноценный объект СписокЗначений.

  1. В правилах обмена перейдем к обработчику события «После загрузки параметров» или «Перед загрузкой данных». По завершении всех операций обмена рекомендуется провести автоматическую сверку бухгалтерских проводок для поиска расхождений.
  2. Напишем код десериализации, который вернет строковое представление в объектный вид и поместит его в глобальную структуру Параметры под удобным ключом.

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


// Проверяем наличие переданного параметра в структуре
Если Параметры.Свойство("СписокПодразделенийСтрокой") Тогда
    Попытка
        // Восстанавливаем объект СписокЗначений из строки внутреннего формата
        Параметры.Вставить("СписокПодразделений", ЗначениеИзСтрокиВнутр(Параметры.СписокПодразделенийСтрокой));
    Исключение
        // На случай непредвиденных ошибок инициализируем пустой список
        Параметры.Вставить("СписокПодразделений", Новый СписокЗначений);
    КонецПопытки;
Иначе
    Параметры.Вставить("СписокПодразделений", Новый СписокЗначений);
КонецЕсли;

После выполнения этого кода в любом обработчике загрузки объектов (например, в ПКО при записи документов или справочников) мы сможем обращаться к списку значений напрямую: Параметры.СписокПодразделений.НайтиПоЗначению(Объект.Подразделение).

Способ 2. Современный подход через JSON-сериализацию

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

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

Разберем по шагам, как передать массив значений через JSON-строку:

  1. На стороне источника выгрузим значения из нашего списка в простой массив и преобразуем его в JSON.
  2. Передадим полученную строку в приемник стандартным методом.
  3. На стороне приемника прочитаем JSON-строку, восстановим массив и загрузим его обратно в СписокЗначений.

Посмотрим на программную реализацию выгрузки в JSON на источнике:


// Допустим, у нас есть сформированный список значений параметров выгрузки
МассивЗначений = Параметры.СписокПодразделений.ВыгрузитьЗначения();

// Сериализуем массив в JSON-строку
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, МассивЗначений);
СтрокаJSON = ЗаписьJSON.Закрыть();

// Передаем JSON-строку как параметр
ПередатьОдинПараметрВПриемник("СписокПодразделенийJSON", СтрокаJSON);

Теперь рассмотрим, как принять и обработать эти данные на стороне приемника в обработчике «После загрузки параметров»:


Если Параметры.Свойство("СписокПодразделенийJSON") И ЗначениеЗаполнено(Параметры.СписокПодразделенийJSON) Тогда
    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(Параметры.СписокПодразделенийJSON);
    
    // Читаем массив значений из JSON
    МассивЗначений = ПрочитатьJSON(ЧтениеJSON);
    
    // Инициализируем СписокЗначений и загружаем в него данные
    НовыйСписок = Новый СписокЗначений;
    НовыйСписок.ЗагрузитьЗначения(МассивЗначений);
    
    Параметры.Вставить("СписокПодразделений", НовыйСписок);
Иначе
    Параметры.Вставить("СписокПодразделений", Новый СписокЗначений);
КонецЕсли;

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

Способ 3. Интерактивный выбор через механизм «Подключаемых обработок»

Что делать, если список значений должен заполнять сам пользователь интерактивно непосредственно перед запуском обмена в обработке «Универсальный обмен данными XML»? Напрямую вывести форму выбора списка значений в стандартной таблице параметров не получится.

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

Разберем алгоритм настройки по шагам:

  1. В конфигураторе базы-источника создадим внешнюю обработку (например, НастройкаПараметровОбмена.epf).
  2. В этой обработке создадим реквизит с типом СписокЗначений. Важно: его имя должно в точности совпадать с именем параметра, объявленного в правилах обмена (например, СписокСкладов).
  3. Вынесем этот реквизит на форму обработки, чтобы пользователь мог интерактивно добавлять, удалять или выбирать элементы.
  4. В кодовой части формы обработки для кнопки подтверждения выбора напишем команду закрытия формы: ОповеститьОВыборе(1);.
  5. Откроем нашу «Конвертацию данных» и перейдем на вкладку «Подключаемые обработки». Зарегистрируем нашу обработку, установив для нее флаги «Обработка используется при выгрузке данных» и «Это обработка формы настройки».
  6. В табличной части параметров этой подключаемой обработки укажем связь между реквизитом обработки и глобальным параметром правил обмена.

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

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

Способ 4. Передача локального контекста через «ВходящиеДанные» и «ИсходящиеДанные»

Иногда список значений требуется передать не глобально для всей конвертации, а точечно — для заполнения конкретного объекта приемника (например, табличной части документа на основе списка, сформированного при выгрузке этого документа). Использовать глобальные параметры для этого не обязательно.

Рассмотрим, как задействовать локальные структуры КД ИсходящиеДанные и ВходящиеДанные:

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

Посмотрим на пример установки данных в источнике (обработчик «Перед выгрузкой» ПКО или ПВД):


ИсходящиеДанные = Новый Структура;
СписокДляПередачи = Новый СписокЗначений;
СписокДляПередачи.Добавить("Значение1");
СписокДляПередачи.Добавить("Значение2");

ИсходящиеДанные.Вставить("ЛокальныйСписок", СписокДляПередачи);

И разберем пример чтения в приемнике (обработчик «Перед загрузкой» или «При загрузке» ПКО):


Если ВходящиеДанные <> Неопределено Тогда
    Если ВходящиеДанные.Свойство("ЛокальныйСписок") Тогда
        // Получаем переданный список значений напрямую без ручной сериализации в XML!
        ПолученныйСписок = ВходящиеДанные.ЛокальныйСписок;
        
        // Используем полученную коллекцию для заполнения объекта
        Для Каждого ЭлементСписка Из ПолученныйСписок Цикл
            // Логика заполнения табличных частей или реквизитов
        КонецЦикла;
    КонецЕсли;
КонецЕсли;

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

Подведем итоги

Мы детально изучили проблему передачи списка значений в правилах обмена «Конвертации данных 2.x» и рассмотрели четыре различных подхода. Выбор конкретного метода зависит от ваших задач: программное формирование отлично реализуется через сериализацию в JSON или ЗначениеВСтрокуВнутр(), для интерактивного выбора пользователем незаменимы подключаемые настроечные обработки, а для точечной передачи коллекций внутри конкретных правил выгрузки объектов идеально подходит использование локального контекста ВходящиеДанные.

← На главную