Как передать входящие данные из ПВД с произвольным алгоритмом в ПКО в Конвертации данных 2.1?

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

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

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

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

Рассмотрим типичную ситуацию. Разработчик создает ПВД со способом выборки "Произвольный алгоритм" и пытается в цикле по результату запроса выгрузить данные, формируя структуру параметров и передавая ее в ПКО. На стороне ПКО в обработчике ПередВыгрузкой или в Правилах конвертации свойств (ПКС) эти данные оказываются пустыми.

Выясним основные причины такого поведения:

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

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

Шаг 1. Изучаем сигнатуру и правила вызова функции ВыгрузитьПоПравилу

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


ВыгрузитьПоПравилу(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, ИмяПКО, УзелСсылка, ТолькоПолучитьСсылка, Проводки, ИмяПКОВидСубконто)

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

Проанализируем типичные ошибки позиционирования параметров, которые совершают разработчики:


// Ошибка 1: Передача структуры вторым параметром вместо третьего
ВыгрузитьПоПравилу(, ИсходящиеДанные); 

// Ошибка 2: Структура передана третьим параметром, но не указано имя ПКО
ВыгрузитьПоПравилу(, , ВходящиеДанные);

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

Рассмотрим правильный шаблон вызова функции ВыгрузитьПоПравилу:


// Шаблон 1: Выгружаем существующий объект (ссылку) с передачей параметров
ВыгрузитьПоПравилу(СсылкаНаОбъект, , МояСтруктураПараметров, , "ИмяНужногоПКО");

// Шаблон 2: Выгружаем "виртуальный" объект без источника (на основе структуры)
ВыгрузитьПоПравилу(, , МояСтруктураПараметров, , "ИмяНужногоПКО");

Шаг 2. Разделение логики ПВД: ПередОбработкой и ПередВыгрузкой

При использовании способа выборки "Произвольный алгоритм" критически важно понимать жизненный цикл выполнения обработчиков ПВД.

Рассмотрим два основных сценария работы с произвольным алгоритмом:

Сценарий А. Полностью ручное управление в "ПередОбработкой"

В этом сценарии мы пишем весь код (запрос, обход выборки, заполнение структур и вызов выгрузки) непосредственно в обработчике ПВД ПередОбработкой. Это наиболее гибкий и контролируемый способ. Посмотрим на пример реализации такого алгоритма:


// Обработчик ПВД "ПередОбработкой"
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	РеестрПлатежей.Ссылка КАК Ссылка,
    |	РеестрПлатежей.Организация КАК Организация,
    |	РеестрПлатежей.СуммаДокумента КАК Сумма
    |ИЗ
    |	Документ.РеестрПлатежей КАК РеестрПлатежей
    |ГДЕ
    |	РеестрПлатежей.Проведен";

Выборка = Запрос.Выполнить().Выбрать();

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

// Обязательно устанавливаем Отказ в Истина!
// Это указывает платформе, что стандартную выгрузку для этого ПВД производить не нужно.
Отказ = Истина;

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

Сценарий Б. Использование стандартного обхода через ВыборкаДанных

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


// Обработчик ПВД "ПередОбработкой"
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Документ.РеестрПлатежей ГДЕ Проведен";
ВыборкаДанных = Запрос.Выполнить().Выгрузить(); // Передаем таблицу значений

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


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

Платформа автоматически перенесет структуру из переменной ИсходящиеДанные обработчика ПВД ПередВыгрузкой во ВходящиеДанные вызываемого ПКО. Этот способ изящнее, но требует четкого понимания того, как платформа связывает обработчики.

Шаг 3. Настройка ПКО для приема входящих данных

Даже если мы идеально настроили ПВД и передали структуру параметров третьим аргументом в ВыгрузитьПоПравилу, на стороне ПКО эти данные могут быть проигнорированы. Разберем, как правильно принять и обработать эти параметры внутри ПКО.

Когда параметры передаются в ПКО, они становятся доступны в виде структуры ВходящиеДанные во всех обработчиках этого ПКО (например, в ПередВыгрузкой, ПриВыгрузке ПКО, а также в ПКС этого ПКО).

Существует два способа работы с ними на стороне ПКО:

Способ 1. Автоматическое заполнение через ПКС (рекомендуемый)

Если нам нужно заполнить реквизиты объекта-приемника переданными параметрами, мы настраиваем Правила конвертации свойств (ПКС) следующим образом:

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

Способ 2. Ручная обработка параметров в ПКС

Если имя ключа структуры не совпадает с приемником, или нам требуется дополнительная обработка данных перед заполнением, мы можем написать код в обработчике ПКС ПередВыгрузкой:


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

Почему в ПКО доступен "Источник", если выгрузка произвольная?

Часто программисты удивляются: "Почему в ПКО в обработчике ПередВыгрузкой параметр Источник заполнен ссылкой, хотя в ПВД выбран Произвольный алгоритм?"

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

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

Если мы хотим, чтобы ПКО работало исключительно "из головы" (только на основании переданной структуры без привязки к конкретному объекту-источнику), нам необходимо:

  1. Создать отдельное ПКО, у которого поле "Источник" в заголовке правила оставлено пустым.
  2. Вызывать выгрузку, передавая первым параметром Неопределено:

ВыгрузитьПоПравилу(, , ПараметрыПередачи, , "ПКО_Без_Источника");

Шаг 4. Настройка надежной отладки обработчиков выгрузки в КД 2.1

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

Проанализируем по шагам, как настроить полноценную интерактивную отладку в КД 2.1 с помощью выгрузки обработчиков во внешнюю обработку:

  1. Откроем обработку "Универсальный обмен данными в формате XML" в режиме 1С:Предприятие в базе-источнике.
  2. Перейдем на вкладку "Выгрузка данных". В левом нижнем углу найдем и установим флаг "Режим отладки обработчиков выгрузки".
  3. После установки этого флага станет доступна кнопка "Настройка отладки выгрузки". Нажмем ее.
  4. В открывшемся окне выберем второй вариант настройки: "Выгрузить код обработчиков во внешнюю обработку". Это самый надежный и стабильный режим отладки, исключающий сбои динамического подключения кода.
  5. Укажем путь к файлу на диске, куда система должна сохранить генерируемую обработку отладки (например, D:\Debug\г_ОбработчикиВыгрузки.epf), и нажмем кнопку "Сформировать файл обработчиков".
  6. Не закрывая окно настройки отладки, откроем Конфигуратор нашей информационной базы. Через меню Файл -> Открыть найдем и откроем созданный файл внешней обработки г_ОбработчикиВыгрузки.epf.
  7. В модуле этой обработки найдем нужную нам процедуру. Имена процедур генерируются по шаблону, отражающему тип события и имя правила. Например, для ПВД с произвольным алгоритмом процедура будет называться примерно так: ПВД_ПередОбработкой_ПравилоВыгрузки_РеестрПлатежей.
  8. Поставим стандартную точку останова (клавиша F9) на интересующую нас строку кода внутри этой процедуры.
  9. Вернемся в режим 1С:Предприятие в окно настройки отладки обмена. Убедимся, что в поле "Путь к файлу обработчиков" указан верный путь к нашей сгенерированной внешней обработке. Нажмем кнопку "Готово" (или "Применить").
  10. Запустим выгрузку данных.

Платформа при начале выгрузки вместо динамического выполнения кода из XML обратится к модулю нашей внешней обработки, благодаря чему управление передастся в Конфигуратор, и выполнение кода остановится ровно на нашей точке останова. Теперь мы можем выполнять пошаговую отладку (F10, F11), вычислять выражения на табло и анализировать состояние переменных, включая ВходящиеДанные и ВыборкаДанных.

Резюме

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

Используя эти правила и настроив интерактивную отладку, мы сможем быстро и без ошибок реализовывать обмены любой сложности в Конвертации данных 2.1.

← На главную