При работе с инструментом «1С:Конвертация данных 2.0» (КД 2.0) разработчики часто сталкиваются с необходимостью передать дополнительные данные из базы-источника в базу-приемник. Казалось бы, использование привычного метода Параметры.Вставить() в обработчиках выгрузки должно решать задачу. Однако на стороне загрузки часто возникает ошибка: «Ключ не найден» или сообщение о том, что такой параметр не существует. В этой статье мы подробно разберем, почему так происходит, и изучим правильные способы передачи параметров для этапа загрузки.
Для начала проанализируем ситуацию с точки зрения механизмов работы обработки Универсальный обмен данными XML. Когда мы настраиваем правила конвертации, на закладке «Параметры» мы описываем структуру данных, которые могут передаваться глобально. У каждого параметра есть флаг «Использовать при загрузке». Этот флаг критически важен по следующим причинам:
Параметры на стороне приемника.Параметры.Вставить("МойПараметр", Значение) в коде выгрузки, но этого параметра нет в метаданных самой конвертации, обработка выгрузки запишет его в тело файла, но обработка загрузки не «узнает» о нем при инициализации и не создаст соответствующий ключ в структуре Параметры.Именно поэтому при попытке обратиться к такому параметру в обработчике «Перед загрузкой данных» или «При загрузке объекта» система выдает ошибку.
Рассмотрим самый надежный и правильный с точки зрения архитектуры КД2 способ. Если вам заранее известны имена параметров, которые нужно передать, выполните следующие шаги:
Имя и Тип.После этого вы сможете изменять значение этого параметра программно в любом обработчике выгрузки (например, «Перед выгрузкой данных»):
Параметры.МойПараметр = "НужноеЗначение";
// Или через Вставить, если вы предпочитаете этот метод
Параметры.Вставить("МойПараметр", "НужноеЗначение");
На стороне загрузки этот параметр будет доступен автоматически в коллекции Параметры.
Бывают ситуации, когда состав передаваемых данных динамический, и мы не можем заранее создать десятки параметров в интерфейсе КД2. В этом случае проанализируем «хак» с использованием одного служебного параметра.
Создадим в КД один-единственный параметр, назовем его, например, ДополнительныеДанные и укажем тип Произвольный. Не забудем поставить флаг «Использовать при загрузке».
Теперь в обработчике выгрузки мы можем поместить в этот параметр структуру или таблицу значений со всеми необходимыми нам данными:
Контейнер = Новый Структура;
Контейнер.Вставить("ОрганизацияДляЗагрузки", СсылкаНаОрг);
Контейнер.Вставить("РежимПроведения", Истина);
Контейнер.Вставить("СлужебныйТекст", "Передано программно");
Параметры.ДополнительныеДанные = Контейнер;
На стороне загрузки, например, в обработчике «Перед загрузкой данных», мы можем легко извлечь эти данные:
Если Параметры.ДополнительныеДанные <> Неопределено Тогда
НашРежим = Параметры.ДополнительныеДанные.РежимПроведения;
// Используем полученные данные в логике загрузки
КонецЕсли;
Этот метод позволяет обходить ограничение на жесткое описание каждого параметра, сохраняя при этом работоспособность механизма передачи.
Если данные нужны не глобально для всей загрузки, а для конкретного документа или справочника, выясним, как работает структура ВходящиеДанные. Это гораздо эффективнее, чем использовать глобальные параметры.
В правилах выгрузки данных (ПВД) или правилах конвертации объектов (ПКО) в обработчике «Перед выгрузкой» мы можем сформировать структуру ВходящиеДанные. Рассмотрим пример:
ВходящиеДанные = Новый Структура;
ВходящиеДанные.Вставить("СпецПризнак", Истина);
При загрузке этого объекта в ПКО в обработчике «После загрузки» эти данные будут доступны в одноименной структуре ВходящиеДанные. Преимущество здесь в том, что ВходящиеДанные не нужно объявлять в глобальном списке параметров КД2 — они передаются в контексте конкретного объекта обмена.
Чтобы ваша обработка загрузки не «падала» при использовании старых версий правил (где параметр может быть еще не добавлен), всегда используйте безопасную проверку. Разберем, как это сделать в обработчике «Перед загрузкой данных»:
Если Параметры.Свойство("ИмяНужногоПараметра") = Ложь Тогда
// Если параметра нет в файле, инициализируем его значением по умолчанию
Параметры.Вставить("ИмяНужногоПараметра", Ложь);
КонецЕсли;
Этот подход гарантирует стабильность работы кода загрузки вне зависимости от того, как именно была произведена выгрузка.
Проанализируем ситуацию, когда обмен идет не через файл XML, а через прямое COM-подключение. В этом режиме механизмы КД2 ведут себя несколько иначе. Параметры могут передаваться напрямую через объектную модель. Однако даже в этом случае хорошим тоном и залогом отсутствия ошибок считается предварительное описание параметров в дереве правил конвертации. Это делает ваш код прозрачным и понятным для других разработчиков, которые будут сопровождать ваши правила обмена.
Резюмируем: Для того чтобы параметр был доступен «при загрузке», его обязательно нужно добавить в список параметров в интерфейсе «Конвертации данных 2.0» и установить соответствующий флаг. Для динамических данных используйте один параметр-контейнер с типом Структура, а для объектных данных — механизм ВходящиеДанные.