К статье
Практический материал

Разработка и Конфигурация · 10 мин

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

Как передать параметр в 1С Конвертация данных: Параметры, ПередатьОдинПараметрВПриемник, обработчики правил ПКО и ПВД, примеры кода и типичные ошибки.

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

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

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

Что такое параметры в правилах конвертации и когда они нужны

Параметр — это пара «имя–значение», которая живёт в контексте выполнения обмена. Значение может быть примитивным типом (строка, число, дата, булево) или ссылкой на объект, однако при передаче в приемник через файл обмена надёжно сериализуются только простые типы и строковые представления. Ссылочные значения между базами напрямую не передаются — их нужно конвертировать через ПКО.

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

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

Если правила конвертации подготовлены в конфигурации «Конвертация данных» и в них объявлены параметры (закладка «Параметры» в форме правил обмена), то в обработке «Универсальный обмен данными в формате XML» появится закладка «Параметры». Там пользователь вручную заполняет значения перед выгрузкой: например, дату начала выгрузки или код узла.

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

Пример чтения параметра с проверкой:

Если Не Параметры.Свойство("ДатаНачалаВыгрузки") Тогда

Параметры.Вставить("ДатаНачалаВыгрузки", НачалоГода(ТекущаяДата()));

КонецЕсли;

Как установить параметр программно в обработчиках правил

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

Параметры.Вставить("РежимПервичнойВыгрузки", Истина);

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

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

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

Как передать параметр в приемник через ПередатьОдинПараметрВПриемник

Когда значение нужно использовать не только при выгрузке, но и при загрузке в базе-приемнике, применяется встроенная функция ПередатьОдинПараметрВПриемник(Имя, Значение, ИмяПКО). Она записывает параметр в файл обмена, и на стороне загрузки он становится доступен в коллекции Параметры базы-приемника.

Типовое место вызова — обработчик «Перед выгрузкой данных» или «После выгрузки данных»:

// В обработчике выгрузки

ПередатьОдинПараметрВПриемник("НомерСеансаОбмена", Строка(Новый УникальныйИдентификатор));

// В обработчиках загрузки (приемник)

Если Параметры.Свойство("НомерСеансаОбмена") Тогда

// используем значение

КонецЕсли;

Ограничения функции: передавать можно значения примитивных типов, которые корректно сериализуются в XML. Ссылки, таблицы значений и сложные объекты напрямую не передаются — их нужно либо конвертировать в строку (например, GUID), либо выгружать как полноценные объекты через ПКО. Также учтите, что параметр попадёт в приемник только при загрузке того же файла обмена; при обмене через планы обмена механика может отличаться.

bsl
ПередатьОдинПараметрВПриемник("ОрганизацияКод", СокрЛП(Организация.Код));

Как использовать параметры в ПВД с произвольным запросом

Если ПВД использует способ выборки «Произвольный алгоритм» или запрос с отбором, параметры подставляются в текст запроса стандартным синтаксисом &ИмяПараметра. Перед выполнением запроса значение нужно установить в параметры запроса — в типовых правилах это делается через соответствие параметров конвертации.

Практический приём: объявить параметр в правилах обмена, задать его в обработке выгрузки, а в запросе ПВД использовать как отбор:

ВЫБРАТЬ

РеализацияТоваровУслуг.Ссылка

ИЗ

Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг

ГДЕ

РеализацияТоваровУслуг.Дата >= &ДатаНачалаВыгрузки

Если параметр не задан, запрос либо вернёт пустой результат, либо выдаст ошибку — в зависимости от того, как платформа обработает неустановленный параметр. Поэтому в обработчике «Перед выгрузкой данных» стоит явно инициализировать все параметры, участвующие в запросах.

Способы передачи параметра

Закладка «Параметры» в обработке выгрузки

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

Параметры.Вставить() в обработчике

Подходит для вычисляемых в коде значений, видимых только на стороне выгрузки. Не передаётся в приемник автоматически.

ПередатьОдинПараметрВПриемник()

Единственный штатный способ пробросить значение в базу-приемник через файл обмена. Только простые типы.

Типичные ошибки при работе с параметрами

Самая частая проблема — обращение к несуществующему параметру. Если параметр не объявлен и не вставлен, выражение Параметры.ИмяПараметра вызовет ошибку «Поле объекта не обнаружено» или вернёт Неопределено в зависимости от контекста. Всегда проверяйте наличие через Параметры.Свойство().

Вторая типовая ошибка — попытка передать ссылку через ПередатьОдинПараметрВПриемник. Ссылка источника бессмысленна в приемнике: там у объекта другой идентификатор. Передавайте код, GUID в виде строки или выгружайте объект целиком.

Третья ошибка — ожидание, что параметр, установленный в приемнике, вернётся обратно в источник. Передача односторонняя: только из выгрузки в загрузку. Для обратной связи нужен отдельный сеанс обмена или служебные объекты.

Типичные ошибки
01
Обращение к параметру без проверки Параметры.Свойство() — ошибка выполнения правил и прерывание обмена
02
Передача ссылки объекта в приемник — значение теряет смысл, используйте код или строковый GUID
03
Установка параметра в обработчике «После загрузки данных» с ожиданием его видимости в источнике — передача работает только в одну сторону
04
Использование одного параметра как временного хранилища в нескольких ПКО — значение перезаписывается в непредсказуемом порядке

Как проверить, что параметр передался корректно

Простейшая диагностика — вывод значения через Сообщить() в обработчиках выгрузки и загрузки. В журнале регистрации или в окне сообщений обработки обмена будет видно, какое значение имел параметр на каждом этапе.

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

Контрольные точки

Как проверить результат

Значение параметра в обработчике выгрузки
Норма

Сообщить() выводит ожидаемое значение

Тревожный признак

Неопределено или ошибка «поле не обнаружено»

Наличие параметра в файле обмена
Норма

В XML присутствует узел с именем и значением параметра

Тревожный признак

Узел отсутствует — ПередатьОдинПараметрВПриемник не отработал

Доступность в приемнике
Норма

Параметры.Свойство() возвращает Истина, значение корректно

Тревожный признак

Параметр отсутствует — проверьте порядок вызова и тип значения

Часто задаваемые вопросы

Можно ли передать таблицу значений через параметр?

Напрямую — нет. Параметры рассчитаны на простые типы. Таблицу можно сериализовать в строку (например, через ЗначениеВСтрокуВнутр) и передать как строку, но надёжнее выгрузить данные как отдельные объекты через ПКО или использовать произвольные алгоритмы выборки.

Чем параметры отличаются от переменных обработчиков?

Переменная, объявленная в одном обработчике, видна только в нём. Параметр хранится в объекте обмена и доступен во всех обработчиках сеанса, а при использовании ПередатьОдинПараметрВПриемник — и в базе-приемнике.

Почему параметр, заданный в обработке выгрузки, пустой в правилах?

Чаще всего причина в том, что параметр не объявлен на закладке «Параметры» в правилах конвертации — тогда обработка его не передаёт. Также проверьте точное совпадение имени параметра в правилах и в коде, включая регистр букв.

Работает ли ПередатьОдинПараметрВПриемник при обмене через планы обмена?

Функция рассчитана на универсальный обмен через файл. При обмене через типовые планы обмена и EnterpriseData механизм параметров отличается — там используются собственные структуры данных и дополнительные свойства объектов.

Как передать параметр из одного ПКО в другое внутри выгрузки?

Установите значение через Параметры.Вставить() в обработчике первого ПКО и прочитайте во втором. Учтите, что порядок выгрузки объектов не гарантирован, поэтому такой способ надёжен только для значений, вычисленных до начала выгрузки объектов (например, в «Перед выгрузкой данных»).

Итог

Что важно запомнить

Параметр задаётся в обработке выгрузки, устанавливается в коде через Параметры.Вставить() и передаётся в приемник функцией ПередатьОдинПараметрВПриемник(). Перед чтением всегда проверяйте наличие через Параметры.Свойство() и передавайте только простые типы.