Как программно передать параметры при загрузке в 1С:Конвертация данных 2.0

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

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

Разберем причину: почему флаг «Использовать при загрузке» так важен

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

  1. Формирование заголовка XML: Если флаг установлен, описание параметра (его имя и тип) попадает в заголовок файла обмена.
  2. Инициализация структуры на стороне загрузки: Когда обработка загрузки открывает файл, она сначала считывает заголовок. Только те параметры, которые описаны в заголовке, будут инициализированы в коллекции Параметры на стороне приемника.
  3. Программное ограничение: Если вы просто вызываете Параметры.Вставить("МойПараметр", Значение) в коде выгрузки, но этого параметра нет в метаданных самой конвертации, обработка выгрузки запишет его в тело файла, но обработка загрузки не «узнает» о нем при инициализации и не создаст соответствующий ключ в структуре Параметры.

Именно поэтому при попытке обратиться к такому параметру в обработчике «Перед загрузкой данных» или «При загрузке объекта» система выдает ошибку.

Способ 1: Стандартное решение через интерфейс КД2

Рассмотрим самый надежный и правильный с точки зрения архитектуры КД2 способ. Если вам заранее известны имена параметров, которые нужно передать, выполните следующие шаги:

  1. Откройте вашу конвертацию в конфигурации «Конвертация данных».
  2. Перейдите на закладку «Параметры».
  3. Добавьте новый параметр, укажите его Имя и Тип.
  4. Обязательно установите галочку «Использовать при загрузке».
  5. Сохраните правила и обновите их в обработке выгрузки.

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


Параметры.МойПараметр = "НужноеЗначение";
// Или через Вставить, если вы предпочитаете этот метод
Параметры.Вставить("МойПараметр", "НужноеЗначение");

На стороне загрузки этот параметр будет доступен автоматически в коллекции Параметры.

Способ 2: Использование универсального «контейнера»

Бывают ситуации, когда состав передаваемых данных динамический, и мы не можем заранее создать десятки параметров в интерфейсе КД2. В этом случае проанализируем «хак» с использованием одного служебного параметра.

Создадим в КД один-единственный параметр, назовем его, например, ДополнительныеДанные и укажем тип Произвольный. Не забудем поставить флаг «Использовать при загрузке».

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


Контейнер = Новый Структура;
Контейнер.Вставить("ОрганизацияДляЗагрузки", СсылкаНаОрг);
Контейнер.Вставить("РежимПроведения", Истина);
Контейнер.Вставить("СлужебныйТекст", "Передано программно");

Параметры.ДополнительныеДанные = Контейнер;

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


Если Параметры.ДополнительныеДанные <> Неопределено Тогда
    НашРежим = Параметры.ДополнительныеДанные.РежимПроведения;
    // Используем полученные данные в логике загрузки
КонецЕсли;

Этот метод позволяет обходить ограничение на жесткое описание каждого параметра, сохраняя при этом работоспособность механизма передачи.

Способ 3: Передача данных для конкретного объекта (ВходящиеДанные)

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

В правилах выгрузки данных (ПВД) или правилах конвертации объектов (ПКО) в обработчике «Перед выгрузкой» мы можем сформировать структуру ВходящиеДанные. Рассмотрим пример:


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

При загрузке этого объекта в ПКО в обработчике «После загрузки» эти данные будут доступны в одноименной структуре ВходящиеДанные. Преимущество здесь в том, что ВходящиеДанные не нужно объявлять в глобальном списке параметров КД2 — они передаются в контексте конкретного объекта обмена.

Безопасное обращение к параметрам

Чтобы ваша обработка загрузки не «падала» при использовании старых версий правил (где параметр может быть еще не добавлен), всегда используйте безопасную проверку. Разберем, как это сделать в обработчике «Перед загрузкой данных»:


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

Этот подход гарантирует стабильность работы кода загрузки вне зависимости от того, как именно была произведена выгрузка.

Особенности COM-соединения

Проанализируем ситуацию, когда обмен идет не через файл XML, а через прямое COM-подключение. В этом режиме механизмы КД2 ведут себя несколько иначе. Параметры могут передаваться напрямую через объектную модель. Однако даже в этом случае хорошим тоном и залогом отсутствия ошибок считается предварительное описание параметров в дереве правил конвертации. Это делает ваш код прозрачным и понятным для других разработчиков, которые будут сопровождать ваши правила обмена.

Резюмируем: Для того чтобы параметр был доступен «при загрузке», его обязательно нужно добавить в список параметров в интерфейсе «Конвертации данных 2.0» и установить соответствующий флаг. Для динамических данных используйте один параметр-контейнер с типом Структура, а для объектных данных — механизм ВходящиеДанные.

← На главную