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