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