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