Как передать произвольные данные из источника в приемник в 1С:Конвертация данных 2.1

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

При разработке правил обмена в 1С:Конвертация данных 2.1 (КД 2.1) программисты часто сталкиваются с ситуацией, когда в базу-приемник необходимо передать значение, которого нет в явном виде в объекте-источнике. Например, это может быть результат сложного запроса, расчетный коэффициент или просто некий флаг, определяющий логику загрузки. Основная сложность заключается в том, что стандартные обработчики событий ПКО (Правила конвертации объектов) имеют ограниченный набор параметров: в одних доступен Источник, в других — уже созданный Объект (приемник), но редко они встречаются вместе в нужный момент для прямой передачи "на лету".

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

Метод 1: Использование ПКС с флагом «Передавать данные в параметр»

Это самый распространенный и "чистый" способ передачи произвольных данных. Рассмотрим его по шагам:

  1. В нужном ПКО перейдем на закладку "Конвертация свойств".
  2. Создадим новое ПКС (Правило конвертации свойства).
  3. Поле "Источник" оставим пустым.
  4. В поле "Приемник" выберем любой подходящий реквизит (если мы планируем записывать данные в реквизит) или оставим его пустым, если данные нужны только для логики в обработчиках.
  5. Важный момент: установим флаг "Передавать данные в параметр". В этом случае значение не будет пытаться записаться в реквизит объекта автоматически, а попадет в специальную коллекцию ПараметрыОбъекта.

Теперь проанализируем код. В обработчике ПередВыгрузкой этого ПКС на стороне источника мы пишем код для получения данных:


// Пример получения данных запросом
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Справочник.Склады ГДЕ Наименование = &Имя";
Запрос.УстановитьПараметр("Имя", "Основной склад");
Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Следующий() Тогда
    Значение = Выборка.Ссылка;
Иначе
    Значение = Неопределено;
КонецЕсли;

После выгрузки это значение попадет в XML-файл в узел параметров объекта. Чтобы воспользоваться им в приемнике, перейдем в ПКО в обработчик события ПослеЗагрузки:


// Получаем переданное значение из параметров объекта
МоеЗначение = ПараметрыОбъекта.Получить("ИмяВашегоПараметра");

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

Метод 2: Использование «ИсходящихДанных» для подчиненных объектов

Если нам нужно передать не просто строку или число, а целую структуру данных для заполнения табличной части или подчиненного объекта, проанализируем использование механизма ИсходящиеДанные.

В обработчике ПередВыгрузкой владельца (основного объекта) мы формируем структуру:


СтруктураДопДанных = Новый Структура;
СтруктураДопДанных.Вставить("СпецЦена", 1500);
СтруктураДопДанных.Вставить("Акция", Истина);

// Передаем структуру в подчиненное ПКС
ИсходящиеДанные = СтруктураДопДанных;

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

Метод 3: Передача сложных типов (Таблицы значений)

Многие начинающие разработчики сомневаются, можно ли передавать таблицы значений через параметры. Рассмотрим этот случай. Конвертация данных 2.1 отлично справляется с сериализацией таблиц значений, если их колонки содержат простые типы (числа, строки, даты, булево).

Если вы положите ТаблицуЗначений в ПараметрыОбъекта в обработчике ПередВыгрузкой, она будет автоматически преобразована в XML. В приемнике в обработчике ПослеЗагрузки вы сможете обойти её циклом:


ТаблицаЦен = ПараметрыОбъекта["ДополнительныеЦены"];
Если ТипЗнч(ТаблицаЦен) = Тип("ТаблицаЗначений") Тогда
    Для Каждого СтрокаЦены Из ТаблицаЦен Цикл
        // Логика обработки строк таблицы
    КонецЦикла;
КонецЕсли;

Метод 4: Глобальные параметры конвертации

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

Программно изменить глобальный параметр можно в обработчике Перед выгрузкой данных (глобальный обработчик конвертации):

Параметры.Вставить("ДатаНачалаОбмена", ТекущаяДата());

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

Важные рекомендации по работе с параметрами

При использовании вышеописанных методов следует придерживаться нескольких правил, чтобы избежать ошибок при обмене:

Таким образом, использование ПКС с передачей в параметр является наиболее гибким и мощным инструментом в руках разработчика КД 2.1, позволяя обходить ограничения стандартного сопоставления полей.

← На главную