Разработка и Конфигурация · 10 мин
1С Конвертация данных: как передать параметр в правила обмена
Как передать параметр в 1С Конвертация данных: Параметры, ПередатьОдинПараметрВПриемник, обработчики правил ПКО и ПВД, примеры кода и типичные ошибки.
Параметры в «1С:Конвертация данных» — это именованные значения, которые доступны внутри обработчиков правил обмена и позволяют передавать данные между правилом выгрузки данных (ПВД), правилом конвертации объектов (ПКО) и правилом конвертации свойств (ПКС). Без параметров сложно реализовать сценарии вроде «записать документ только если контрагент найден», «передать признак режима обмена из обработки выгрузки в приемник» или «пробросить вычисленное значение вглубь структуры правил».
Механизм параметров отличается от переменных запроса и от произвольных глобальных переменных: параметры хранятся в структуре обмена и доступны через коллекцию Параметры или функции встроенного языка правил. При этом часть параметров можно задать интерактивно в обработке «Универсальный обмен данными в формате XML», а часть — только программно из кода обработчиков.
Ниже разобраны основные способы передачи параметров: через настройку в обработке выгрузки, через функцию ПередатьОдинПараметрВПриемник, через коллекцию Параметры внутри правил, а также типичные ошибки, из-за которых параметр «не виден» или обнуляется.
Что такое параметры в правилах конвертации и когда они нужны
Параметр — это пара «имя–значение», которая живёт в контексте выполнения обмена. Значение может быть примитивным типом (строка, число, дата, булево) или ссылкой на объект, однако при передаче в приемник через файл обмена надёжно сериализуются только простые типы и строковые представления. Ссылочные значения между базами напрямую не передаются — их нужно конвертировать через ПКО.
Типовые задачи, где без параметров не обойтись: передача признака «первоначальная выгрузка», указание организации, по которой выполняется обмен, переключение логики правил в зависимости от режима, передача вычисленного в ПКО значения в другие правила. Параметры также используются в запросах ПВД с отбором по произвольному запросу — там они подставляются как параметры запроса.
Как задать параметр в обработке универсального обмена
Если правила конвертации подготовлены в конфигурации «Конвертация данных» и в них объявлены параметры (закладка «Параметры» в форме правил обмена), то в обработке «Универсальный обмен данными в формате XML» появится закладка «Параметры». Там пользователь вручную заполняет значения перед выгрузкой: например, дату начала выгрузки или код узла.
Параметры, заданные в обработке, доступны в обработчиках как Параметры.ИмяПараметра. Это самый простой способ передать значение без изменения кода правил. Ограничение: пользователь может забыть заполнить параметр, поэтому в обработчиках стоит проверять наличие значения и задавать значение по умолчанию.
Пример чтения параметра с проверкой:
Если Не Параметры.Свойство("ДатаНачалаВыгрузки") Тогда
Параметры.Вставить("ДатаНачалаВыгрузки", НачалоГода(ТекущаяДата()));
КонецЕсли;
Как установить параметр программно в обработчиках правил
В любом обработчике конвертации (перед выгрузкой данных, перед конвертацией объекта, после загрузки и т.д.) параметр создаётся или изменяется через коллекцию Параметры:
Параметры.Вставить("РежимПервичнойВыгрузки", Истина);
После этого значение доступно во всех последующих обработчиках текущего сеанса обмена. Это удобно для передачи данных «вниз» по иерархии: например, в обработчике «Перед выгрузкой данных» вычисляется список организаций, а в ПВД и ПКО он используется для отбора.
Значения, вычисленные в одном ПКО, можно передать в другие правила через тот же приём: в обработчике «После выгрузки» одного объекта записать значение в параметр, а в обработчике другого ПКО — прочитать. Однако такой подход хрупок: порядок выгрузки объектов не всегда очевиден, и при параллельной обработке значение может быть перезаписано. Для связанных объектов надёжнее использовать ПКС и входящие данные.
- 1Откройте правило (ПВД, ПКО или событие конвертации) и перейдите на закладку нужного обработчика
- 2Добавьте код Параметры.Вставить("ИмяПараметра", Значение)
- 3В месте использования прочитайте значение через Параметры.ИмяПараметра с проверкой через Параметры.Свойство()
- 4Сохраните правила и выполните тестовую выгрузку, проверив значение через Сообщить() или отладку
Как передать параметр в приемник через ПередатьОдинПараметрВПриемник
Когда значение нужно использовать не только при выгрузке, но и при загрузке в базе-приемнике, применяется встроенная функция ПередатьОдинПараметрВПриемник(Имя, Значение, ИмяПКО). Она записывает параметр в файл обмена, и на стороне загрузки он становится доступен в коллекции Параметры базы-приемника.
Типовое место вызова — обработчик «Перед выгрузкой данных» или «После выгрузки данных»:
// В обработчике выгрузки
ПередатьОдинПараметрВПриемник("НомерСеансаОбмена", Строка(Новый УникальныйИдентификатор));
// В обработчиках загрузки (приемник)
Если Параметры.Свойство("НомерСеансаОбмена") Тогда
// используем значение
КонецЕсли;
Ограничения функции: передавать можно значения примитивных типов, которые корректно сериализуются в XML. Ссылки, таблицы значений и сложные объекты напрямую не передаются — их нужно либо конвертировать в строку (например, GUID), либо выгружать как полноценные объекты через ПКО. Также учтите, что параметр попадёт в приемник только при загрузке того же файла обмена; при обмене через планы обмена механика может отличаться.
ПередатьОдинПараметрВПриемник("ОрганизацияКод", СокрЛП(Организация.Код));Как использовать параметры в ПВД с произвольным запросом
Если ПВД использует способ выборки «Произвольный алгоритм» или запрос с отбором, параметры подставляются в текст запроса стандартным синтаксисом &ИмяПараметра. Перед выполнением запроса значение нужно установить в параметры запроса — в типовых правилах это делается через соответствие параметров конвертации.
Практический приём: объявить параметр в правилах обмена, задать его в обработке выгрузки, а в запросе ПВД использовать как отбор:
ВЫБРАТЬ
РеализацияТоваровУслуг.Ссылка
ИЗ
Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ГДЕ
РеализацияТоваровУслуг.Дата >= &ДатаНачалаВыгрузки
Если параметр не задан, запрос либо вернёт пустой результат, либо выдаст ошибку — в зависимости от того, как платформа обработает неустановленный параметр. Поэтому в обработчике «Перед выгрузкой данных» стоит явно инициализировать все параметры, участвующие в запросах.
Способы передачи параметра
Подходит для значений, которые задаёт пользователь: даты, флаги режима. Ограничение — требует дисциплины заполнения.
Подходит для вычисляемых в коде значений, видимых только на стороне выгрузки. Не передаётся в приемник автоматически.
Единственный штатный способ пробросить значение в базу-приемник через файл обмена. Только простые типы.
Типичные ошибки при работе с параметрами
Самая частая проблема — обращение к несуществующему параметру. Если параметр не объявлен и не вставлен, выражение Параметры.ИмяПараметра вызовет ошибку «Поле объекта не обнаружено» или вернёт Неопределено в зависимости от контекста. Всегда проверяйте наличие через Параметры.Свойство().
Вторая типовая ошибка — попытка передать ссылку через ПередатьОдинПараметрВПриемник. Ссылка источника бессмысленна в приемнике: там у объекта другой идентификатор. Передавайте код, GUID в виде строки или выгружайте объект целиком.
Третья ошибка — ожидание, что параметр, установленный в приемнике, вернётся обратно в источник. Передача односторонняя: только из выгрузки в загрузку. Для обратной связи нужен отдельный сеанс обмена или служебные объекты.
Как проверить, что параметр передался корректно
Простейшая диагностика — вывод значения через Сообщить() в обработчиках выгрузки и загрузки. В журнале регистрации или в окне сообщений обработки обмена будет видно, какое значение имел параметр на каждом этапе.
Дополнительно можно открыть файл обмена в текстовом редакторе и найти узел с параметрами: значения, переданные через ПередатьОдинПараметрВПриемник, записываются в XML. Если параметра в файле нет — функция не вызвалась или вызвалась после формирования соответствующего блока.
Как проверить результат
Сообщить() выводит ожидаемое значение
Неопределено или ошибка «поле не обнаружено»
В XML присутствует узел с именем и значением параметра
Узел отсутствует — ПередатьОдинПараметрВПриемник не отработал
Параметры.Свойство() возвращает Истина, значение корректно
Параметр отсутствует — проверьте порядок вызова и тип значения
Часто задаваемые вопросы
Можно ли передать таблицу значений через параметр?
Напрямую — нет. Параметры рассчитаны на простые типы. Таблицу можно сериализовать в строку (например, через ЗначениеВСтрокуВнутр) и передать как строку, но надёжнее выгрузить данные как отдельные объекты через ПКО или использовать произвольные алгоритмы выборки.
Чем параметры отличаются от переменных обработчиков?
Переменная, объявленная в одном обработчике, видна только в нём. Параметр хранится в объекте обмена и доступен во всех обработчиках сеанса, а при использовании ПередатьОдинПараметрВПриемник — и в базе-приемнике.
Почему параметр, заданный в обработке выгрузки, пустой в правилах?
Чаще всего причина в том, что параметр не объявлен на закладке «Параметры» в правилах конвертации — тогда обработка его не передаёт. Также проверьте точное совпадение имени параметра в правилах и в коде, включая регистр букв.
Работает ли ПередатьОдинПараметрВПриемник при обмене через планы обмена?
Функция рассчитана на универсальный обмен через файл. При обмене через типовые планы обмена и EnterpriseData механизм параметров отличается — там используются собственные структуры данных и дополнительные свойства объектов.
Как передать параметр из одного ПКО в другое внутри выгрузки?
Установите значение через Параметры.Вставить() в обработчике первого ПКО и прочитайте во втором. Учтите, что порядок выгрузки объектов не гарантирован, поэтому такой способ надёжен только для значений, вычисленных до начала выгрузки объектов (например, в «Перед выгрузкой данных»).
Что важно запомнить
Параметр задаётся в обработке выгрузки, устанавливается в коде через Параметры.Вставить() и передаётся в приемник функцией ПередатьОдинПараметрВПриемник(). Перед чтением всегда проверяйте наличие через Параметры.Свойство() и передавайте только простые типы.