При работе с инструментом «1С:Конвертация данных 2.1» (КД 2.1) и используя усовершенствованный редактор правил (см. обработка настройки регулярного обмена по правилам КД), разработчики часто сталкиваются с ситуацией, когда стандартных механизмов выгрузки объектов недостаточно. Например, когда данные для одного документа-приемника нужно собрать из разных регистров или документов источника. В таких случаях на помощь приходит режим «Произвольный алгоритм» в правилах выгрузки данных (ПВД). Однако его настройка таит в себе множество нюансов, от корректного заполнения выборки до обеспечения синхронизации только измененных объектов.
В данной статье мы подробно разберем, как заставить произвольный алгоритм работать правильно, а также упомянем выгрузку правил КД 2.1 в файлы для удобства командной разработки., как передавать данные через структуры и как не «выгрузить лишнего», настроив отбор по узлу обмена.
Для начала проанализируем, как КД 2.1 понимает, что именно нужно выгружать. В настройках ПВД есть поле «Способ выборки данных». Рассмотрим два основных варианта:
ВыборкаДанных.Важный нюанс: Если вы выбрали «Произвольный алгоритм», вы обязаны явно вызвать функцию ВыгрузитьПоПравилу(). Для проверки работы таких вызовов часто требуется отладка правил обмена КД 2.0. в цикле. Если этого не сделать, файл выгрузки будет пустым, даже если запрос внутри алгоритма отработал успешно.
Часто в ПКО (Правилах конвертации объектов) источник не указан (пустое поле). Это делается для того, чтобы ПКО могло принимать на вход не готовую ссылку из базы, а произвольную Структуру с данными. Рассмотрим пример кода, который следует писать в обработчике ПВД «Перед обработкой» при использовании произвольного алгоритма:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПриемНаРаботу.Сотрудник КАК Сотрудник,
| ПриемНаРаботу.Подразделение КАК Подразделение,
| ПриемНаРаботу.Должность КАК Должность,
| ПриемНаРаботу.Дата КАК ДатаДокумента
|ИЗ
| Документ.ПриемНаРаботу КАК ПриемНаРаботу
|ГДЕ
| ПриемНаРаботу.Проведен = ИСТИНА";
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
// Создаем структуру, поля которой совпадают с именами свойств в ПКО (или Входящими данными)
ДанныеОбъекта = Новый Структура("Сотрудник, Подразделение, Должность, ДатаДокумента");
Пока Выборка.Следующий() Цикл
// Заполняем структуру данными из запроса
ЗаполнитьЗначенияСвойств(ДанныеОбъекта, Выборка);
// Вызываем выгрузку по конкретному правилу
// Пятый параметр - Имя ПКО, как оно задано в конфигурации КД
ВыгрузитьПоПравилу(ДанныеОбъекта, , , , "ЗУП_ПриемНаРаботу");
КонецЦикла;
Обратите внимание на функцию ВыгрузитьПоПравилу(). Если вы используете редактор кода для КД 2, писать такие алгоритмы станет удобнее. Когда мы передаем первым параметром структуру, в самом ПКО на стороне приемника эти данные будут доступны через переменную Источник (если настроено соответствие полей) или через ВходящиеДанные.
Одной из главным проблем произвольного алгоритма является то, что он по умолчанию игнорирует регистрацию на узлах обмена и выгружает все данные, подходящие под условия запроса. Чтобы выгружать только те документы, которые были изменены, нам нужно модифицировать запрос, используя таблицу изменений. Для решения этой задачи есть обработка управления регистрацией объектов на узлах обмена.
Проанализируем ситуацию: в КД 2.1 при выгрузке через план обмена доступен параметр УзелДляОбмена. Мы можем использовать его в запросе следующим образом:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Т.Ссылка КАК Ссылка
|ИЗ
| Документ.ПриемНаРаботу КАК Т
|ГДЕ
| Т.Ссылка В (ВЫБРАТЬ Изменения.Ссылка ИЗ Документ.ПриемНаРаботу.Изменения КАК Изменения ГДЕ Изменения.Узел = &УзелОбмена)";
Запрос.УстановитьПараметр("УзелОбмена", Параметры.УзелДляОбмена);
Такой подход гарантирует, что программа не будет каждый раз переносить всю историческую базу, а ограничится только актуальными правками.
Если при загрузке в ERP вы получаете ошибку о невозможности найти тип объекта, это сигнализирует о том, что в XML-файле отсутствует описание метаданных для загружаемого объекта. Это часто происходит при работе с «пустыми» источниками.
Чтобы избежать этой ошибки, убедитесь в следующем:
ДокументСсылка.ПриемНаРаботу). Даже если источника нет, приемник должен быть жестко типизирован.ВыгрузитьПоПравилу в ПВД правильно указано имя ПКО (строковый идентификатор).Если вы не хотите писать цикл обхода вручную, можно использовать стандартный механизм выборки, но с собственным запросом. Для этого в обработчике ПВД «Перед обработкой» нужно инициализировать переменную ВыборкаДанных.
Важно: Система ожидает, что в ВыборкаДанных попадет итерируемый объект. Рассмотрим правильный пример:
Запрос = Новый Запрос("ВЫБРАТЬ * ИЗ Документ.Договор");
// Ошибка: ВыборкаДанных = Запрос;
// Правильно:
ВыборкаДанных = Запрос.Выполнить().Выгрузить(); // Таблица значений
// Или:
ВыборкаДанных = Запрос.Выполнить().Выбрать(); // Выборка из результата запроса
В этом случае КД сама организует цикл, а вам останется только настроить соответствие полей в ПКО. Если же запрос слишком сложный или требует постобработки (например, склейки строк или вычислений), лучше вернуться к варианту с произвольным алгоритмом и ручным вызовом ВыгрузитьПоПравилу, так как это дает максимальный контроль над процессом трансформации данных.
Для закрепления материала разберем, в каких местах КД 2.1 лучше размещать логику:
Отказ = Истина) или модифицировать ВходящиеДанные.Значение для передачи результата.Таким образом, комбинируя возможности запросов и гибкость встроенного языка 1С, мы можем настроить обмен любой сложности, обеспечив при этом высокую производительность и точность передачи данных между системами ЗУП и ERP — для контроля результатов пригодится обработка сравнения данных и регистрации объектов для обмена.