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

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

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

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

Выясняем причину: почему структура "Параметры" пуста при загрузке?

Проанализируем ситуацию, описанную автором темы. В обработчике ПКО (Правило конвертации объектов) ПередВыгрузкой пишется код:

Параметры.Вставить("КодСтатьиРасходов", Источник.СтатьяРасходовБУ.Код);

При этом в обработчике ПКО ПослеЗагрузки происходит попытка обратиться к этому значению:


СтатьяЗатрат = Справочники.СтатьиЗатрат.НайтиПоКоду(Параметры.КодСтатьиРасходов);

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

Решение №1: Передача параметров конкретного объекта через ПКС и ПараметрыОбъекта

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

Разберем этот процесс по шагам:

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

Теперь при выгрузке КД 2.1 упакует это значение в специальный XML-блок параметров внутри узла самого объекта. При чтении файла в базе-приемнике эти данные автоматически прочитаются и поместятся в локальную коллекцию ПараметрыОбъекта.

Важная техническая деталь: коллекция ПараметрыОбъекта имеет тип Соответствие (Map), а не Структура. Это значит, что вы не можете обратиться к значению через точку (например, написать ПараметрыОбъекта.КодСтатьиРасходов). Доступ к элементам соответствия получается только через метод Получить().

Посмотрим на пример правильного кода в обработчике ПослеЗагрузки ПКО:


Если ПараметрыОбъекта <> Неопределено Тогда
    КодСтатьи = ПараметрыОбъекта.Получить("КодСтатьиРасходов");
    Если ЗначениеЗаполнено(КодСтатьи) Тогда
        СтатьяЗатрат = Справочники.СтатьиЗатрат.НайтиПоКоду(КодСтатьи);
        Если ЗначениеЗаполнено(СтатьяЗатрат) Тогда
            Объект.СтатьяЗатрат = СтатьяЗатрат;
        КонецЕсли;
    КонецЕсли;
КонецЕсли;

Проанализируем этот код. Мы обязательно проверяем коллекцию на равенство Неопределено, чтобы избежать ошибок, если объект загружается без параметров. Затем через метод Получить() извлекаем строковое значение кода, находим нужную статью в приемнике и подставляем ее в реквизит загружаемого объекта.

Особенности жизненного цикла "ПараметрыОбъекта" в обработчиках загрузки

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

Решение №2: Использование глобальных параметров конвертации

Что делать, если передаваемые данные не связаны с конкретным объектом, а определяют общее поведение обмена (например, переносить ли только проведенные документы, какая организация является головной, или какую ставку НДС использовать по умолчанию)? Для этого используются глобальные параметры конвертации.

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

  1. Передавать при выгрузке
  2. Использовать при загрузке

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

Архитектурный нюанс КД 2.1: баг с флажком «Отображать в диалоге»

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

Рассмотрим два проверенных способа обойти это ограничение:

Способ А. Оставить флаг включенным, но переопределить программно

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

Параметры.Вставить("МойСлужебныйПараметр", "НужноеЗначение");

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

Способ Б. Прямая запись параметра в XML (для сложных интеграций)

Если вам критически важно полностью скрыть параметр из интерфейса, можно записать его в XML-файл вручную в обход стандартного механизма. В глобальном обработчике конвертации ПередВыгрузкойДанных пишется следующий код:


УзелПарам = СоздатьУзел("ЗначениеParametra");
УстановитьАтрибут(УзелПарам, "Имя", "МойСлужебныйПараметр");
УстановитьАтрибут(УзелПарам, "Тип", "Строка");
ЗаписатьЭлемент(УзелПарам, "Значение", "СлужебноеЗначение");
ДобавитьПодчиненный(rootNode, УзелПарам);

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

Резюме и рекомендации

Подведем итог. Чтобы передача параметров в КД 2.1 работала стабильно и не вызывала ошибок, придерживайтесь простых правил:

← На главную