Как выгрузить данные через XML с отбором по запросу в Конвертации данных 2.0?

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

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

Постановка задачи и выбор механизма решения

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

Рассмотрим ситуацию, когда стандартная обработка «Универсальный обмен данными XML» игнорирует ваши попытки «подсунуть» ей данные. Выясним причину: при использовании стандартной выборки система сама обходит объектную таблицу, а при использовании произвольного алгоритма управление полностью передается разработчику.

Настройка ПВД: переход к произвольному алгоритму

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

  1. Откроем нужное Правило выгрузки данных (или создадим новое).
  2. В поле «Способ выборки» вместо значения «Стандартная» выберем «Произвольный алгоритм».
  3. Перейдем на закладку «Обработчики событий». Нас интересует обработчик Перед обработкой.

Важный нюанс: многие начинающие разработчики пытаются писать код в обработчике Перед выгрузкой. Однако в контексте произвольного алгоритма выборки именно обработчик Перед обработкой является «входной точкой», где мы должны сформировать выборку и явно вызвать команды выгрузки для каждого объекта.

Реализация программной выборки в обработчике «Перед обработкой»

Проанализируем пример кода, который позволит нам выгрузить документы на основании запроса. Нам необходимо инициализировать запрос, установить параметры и в цикле обойти результат, вызывая метод ВыгрузитьПоПравилу.

Рассмотрим пример кода:


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

// 2. Устанавливаем параметры из настроек обработки выгрузки
Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
Запрос.УстановитьПараметр("ДатаКонцовка", ДатаОкончания);
Запрос.УстановитьПараметр("Ответственный", Параметры.НужныйОтветственный);

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

Пока Выборка.Следующий() Цикл
    // 4. Явно вызываем выгрузку объекта по ПКО
    ВыгрузитьПоПравилу(Выборка.Ссылка, , , , "ОперацияБух");
КонецЦикла;

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

Типичные ошибки при написании кода

Выясним причины, по которым выгрузка может выдать «0 объектов», даже если запрос составлен верно. Рассмотрим ситуацию, с которой столкнулся пользователь в обсуждении:

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

2. Объявление переменных. Переменная Запрос не является предопределенной в данном обработчике. Её обязательно нужно создавать через Новый Запрос. То же самое касается и структуры параметров, если вы передаете свои значения через вкладку «Параметры» в обработке выгрузки.

3. Использование Сообщить(). При отладке ПВД в составе «Универсального обмена данными» метод Сообщить() может не выводить данные в окно сообщений, если в обработке включен режим отладки или перехвачены исключения. Для проверки работы цикла лучше использовать запись в журнал регистрации или временные текстовые файлы.

Особенности выгрузки документа «ОперацияБух»

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

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

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

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

Если задача выгрузки — разовая, и вы не хотите модифицировать XML-файл правил, можно воспользоваться механизмом планов обмена. Посмотрим, как это работает:

  1. Создаем временный план обмена (или используем существующий), где зарегистрирован документ ОперацияБух.
  2. С помощью обработки «Регистрация изменений для обмена» или программно (через ПланыОбмена.ЗарегистрироватьИзменения()) регистрируем только те документы, которые выдал ваш запрос.
  3. В обработке «Универсальный обмен данными XML» выбираем режим «Выгружать только зарегистрированные объекты».

Этот метод чище с точки зрения архитектуры правил, так как сами правила остаются «типовыми», а вся логика отбора переносится на уровень регистрации данных.

Заключение

Мы проанализировали основные способы выгрузки данных по запросу в КД 2.0. Использование ПВД с произвольным алгоритмом и методом ВыгрузитьПоПравилу дает разработчику максимальную гибкость. Главное — внимательно следить за синтаксисом методов (Следующий()), правильно выбирать обработчик (Перед обработкой) и не забывать инициализировать все используемые объекты.

← На главную