Как выгрузить справочник в «Конвертации данных 2.1» по произвольному алгоритму?

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

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

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

Способ 1. Использование стандартного механизма через «ВыборкаДанных»

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

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


Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ РАЗЛИЧНЫЕ
|    ХозрасчетныйОбороты.Субконто1 КАК Ссылка
|ИЗ
|    РегистрБухгалтерии.Хозрасчетный.Обороты(&НачалоПериода, , , , &СубконтоКонтрагенты, , , ) КАК ХозрасчетныйОбороты";

Запрос.УстановитьПараметр("НачалоПериода", Дата(2023, 01, 01));
Запрос.УстановитьПараметр("СубконтоКонтрагенты", ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты);

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

Важные нюансы этого метода:

  1. Имена колонок: Чтобы механизм сработал автоматически, колонка в результате запроса должна называться именно Ссылка или Объект. Если вы назовете её иначе (например, Контрагент), КД может не сопоставить поле с источником ПКО.
  2. Типы данных: В переменную ВыборкаДанных можно передать РезультатЗапроса, ВыборкуИзРезультатаЗапроса, ТаблицуЗначений или Массив.
  3. Сопоставление свойств: Если в ПКО (Правиле конвертации объектов) поиск настроен по полям (например, по коду и наименованию), то в запросе желательно также выбрать эти поля с соответствующими псевдонимами. Однако, если передается ссылка, КД сама извлечет нужные реквизиты.

Способ 2. Ручной перебор и функция «ВыгрузитьПоПравилу»

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

Разберем пример реализации в обработчике ПВД Перед обработкой:


Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ РАЗЛИЧНЫЕ
|    ХозрасчетныйОбороты.Субконто1 КАК Источник
|ИЗ
|    РегистрБухгалтерии.Хозрасчетный.Обороты(&НачалоПериода, , , , &СубконтоКонтрагенты, , , ) КАК ХозрасчетныйОбороты";

Запрос.УстановитьПараметр("НачалоПериода", Дата(2023, 06, 15));
Запрос.УстановитьПараметр("СубконтоКонтрагенты", ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты);

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

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

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

Проанализируем параметры функции ВыгрузитьПоПравилу:

Оптимизация выгрузки через «Соответствие»

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

В глобальном обработчике конверсии Перед выгрузкой данных создадим список разрешенных объектов и поместим его в параметры:


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

// Используем Соответствие для максимально быстрого поиска
РазрешенныеКонтрагенты = Новый Соответствие;
Для Каждого Стр Из Таблица Цикл
    РазрешенныеКонтрагенты.Вставить(Стр.Ссылка, Истина);
КонецЦикла;

Параметры.Вставить("РазрешенныеКонтрагенты", РазрешенныеКонтрагенты);

Теперь в ПКО Контрагенты в обработчике Перед выгрузкой достаточно написать короткую проверку:


Если Параметры.РазрешенныеКонтрагенты.Получить(Источник) = Неопределено Тогда
    Отказ = Истина;
КонецЕсли;

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

Типичные ошибки и советы

Рассмотрим основные причины, по которым объекты могут не выгружаться даже при наличии данных в запросе:

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

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

← На главную