При разработке правил обмена в 1С:Конвертация данных 2.1 (КД 2.1) программисты часто сталкиваются с ситуацией, когда в базу-приемник необходимо передать значение, которого нет в явном виде в объекте-источнике. Например, это может быть результат сложного запроса, расчетный коэффициент или просто некий флаг, определяющий логику загрузки. Основная сложность заключается в том, что стандартные обработчики событий ПКО (Правила конвертации объектов) имеют ограниченный набор параметров: в одних доступен Источник, в других — уже созданный Объект (приемник), но редко они встречаются вместе в нужный момент для прямой передачи "на лету".
В этой статье мы подробно разберем, как правильно организовать передачу таких данных, используя механизмы параметров и специализированные обработчики событий.
Это самый распространенный и "чистый" способ передачи произвольных данных. Рассмотрим его по шагам:
ПКО перейдем на закладку "Конвертация свойств".ПараметрыОбъекта.Теперь проанализируем код. В обработчике ПередВыгрузкой этого ПКС на стороне источника мы пишем код для получения данных:
// Пример получения данных запросом
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Справочник.Склады ГДЕ Наименование = &Имя";
Запрос.УстановитьПараметр("Имя", "Основной склад");
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Значение = Выборка.Ссылка;
Иначе
Значение = Неопределено;
КонецЕсли;
После выгрузки это значение попадет в XML-файл в узел параметров объекта. Чтобы воспользоваться им в приемнике, перейдем в ПКО в обработчик события ПослеЗагрузки:
// Получаем переданное значение из параметров объекта
МоеЗначение = ПараметрыОбъекта.Получить("ИмяВашегоПараметра");
Если ЗначениеЗаполнено(МоеЗначение) Тогда
// Выполняем произвольную логику
Объект.Комментарий = "Склад определен по спец. алгоритму: " + Строка(МоеЗначение);
// Обязательно взводим флаг модифицированности, если меняем реквизиты объекта
ОбъектМодифицирован = Истина;
КонецЕсли;
Если нам нужно передать не просто строку или число, а целую структуру данных для заполнения табличной части или подчиненного объекта, проанализируем использование механизма ИсходящиеДанные.
В обработчике ПередВыгрузкой владельца (основного объекта) мы формируем структуру:
СтруктураДопДанных = Новый Структура;
СтруктураДопДанных.Вставить("СпецЦена", 1500);
СтруктураДопДанных.Вставить("Акция", Истина);
// Передаем структуру в подчиненное ПКС
ИсходящиеДанные = СтруктураДопДанных;
На стороне приемника в соответствующем ПКО эти данные станут доступны в переменной ВходящиеДанные. Это избавляет нас от необходимости делать повторные тяжелые запросы к базе данных при конвертации каждой строки табличной части.
Многие начинающие разработчики сомневаются, можно ли передавать таблицы значений через параметры. Рассмотрим этот случай. Конвертация данных 2.1 отлично справляется с сериализацией таблиц значений, если их колонки содержат простые типы (числа, строки, даты, булево).
Если вы положите ТаблицуЗначений в ПараметрыОбъекта в обработчике ПередВыгрузкой, она будет автоматически преобразована в XML. В приемнике в обработчике ПослеЗагрузки вы сможете обойти её циклом:
ТаблицаЦен = ПараметрыОбъекта["ДополнительныеЦены"];
Если ТипЗнч(ТаблицаЦен) = Тип("ТаблицаЗначений") Тогда
Для Каждого СтрокаЦены Из ТаблицаЦен Цикл
// Логика обработки строк таблицы
КонецЦикла;
КонецЕсли;
Иногда требуется передать значение, которое будет доступно вообще во всех правилах в рамках одного сеанса обмена. Для этого используются Глобальные параметры. Выясним нюанс их работы: чтобы параметр был передан, он должен быть предварительно описан в дереве параметров самой конвертации.
Программно изменить глобальный параметр можно в обработчике Перед выгрузкой данных (глобальный обработчик конвертации):
Параметры.Вставить("ДатаНачалаОбмена", ТекущаяДата());
В приемнике этот параметр будет доступен в любом обработчике через коллекцию Параметры. Однако помните, что глобальные параметры лучше использовать для общих настроек, а для конкретных данных объекта лучше применять ПараметрыОбъекта, описанные в Методе 1.
При использовании вышеописанных методов следует придерживаться нескольких правил, чтобы избежать ошибок при обмене:
СправочникСсылка), убедитесь, что этот объект также выгружается. В противном случае в приемнике вы получите "Объект не найден". Безопаснее передавать Уникальный Идентификатор (GUID) в виде строки или ключевые поля (Артикул, Код).ПослеЗагрузки, используя данные из параметров, система 1С может "не заметить" эти изменения и не записать объект, если остальные (стандартные) реквизиты не менялись. Всегда устанавливайте ОбъектМодифицирован = Истина;.ПараметрыОбъекта доступны и в обработчике Поля поиска. Это позволяет идентифицировать объект в приемнике по значению, которое было вычислено в источнике, но не сохранено ни в одном реквизите.Таким образом, использование ПКС с передачей в параметр является наиболее гибким и мощным инструментом в руках разработчика КД 2.1, позволяя обходить ограничения стандартного сопоставления полей.