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

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

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

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

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

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

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

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

Использование структуры вместо объекта-источника

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


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

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

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

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

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

Обеспечение выгрузки только зарегистрированных изменений

Одной из главным проблем произвольного алгоритма является то, что он по умолчанию игнорирует регистрацию на узлах обмена и выгружает все данные, подходящие под условия запроса. Чтобы выгружать только те документы, которые были изменены, нам нужно модифицировать запрос, используя таблицу изменений. Для решения этой задачи есть обработка управления регистрацией объектов на узлах обмена.

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


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   Т.Ссылка КАК Ссылка
    |ИЗ
    |   Документ.ПриемНаРаботу КАК Т
    |ГДЕ
    |   Т.Ссылка В (ВЫБРАТЬ Изменения.Ссылка ИЗ Документ.ПриемНаРаботу.Изменения КАК Изменения ГДЕ Изменения.Узел = &УзелОбмена)";

Запрос.УстановитьПараметр("УзелОбмена", Параметры.УзелДляОбмена);

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

Ошибка «Не найден тип объекта выборки»

Если при загрузке в ERP вы получаете ошибку о невозможности найти тип объекта, это сигнализирует о том, что в XML-файле отсутствует описание метаданных для загружаемого объекта. Это часто происходит при работе с «пустыми» источниками.

Чтобы избежать этой ошибки, убедитесь в следующем:

Использование переменной ВыборкаДанных

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

Важно: Система ожидает, что в ВыборкаДанных попадет итерируемый объект. Рассмотрим правильный пример:


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

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

Где писать код: памятка по обработчикам

Для закрепления материала разберем, в каких местах КД 2.1 лучше размещать логику:

  1. ПВД -> Перед обработкой: Здесь мы определяем массив или таблицу объектов для выгрузки. Если используем произвольный алгоритм — здесь же пишем весь цикл.
  2. ПКО -> Перед выгрузкой: Этот обработчик вызывается для каждого конкретного объекта. Здесь удобно проверять дополнительные условия (параметр Отказ = Истина) или модифицировать ВходящиеДанные.
  3. ПКС -> Перед выгрузкой: Идеальное место для заполнения конкретного реквизита, если его значение нужно вычислить программно или взять из переданной структуры. Используйте переменную Значение для передачи результата.

Таким образом, комбинируя возможности запросов и гибкость встроенного языка 1С, мы можем настроить обмен любой сложности, обеспечив при этом высокую производительность и точность передачи данных между системами ЗУП и ERP — для контроля результатов пригодится обработка сравнения данных и регистрации объектов для обмена.

← На главную