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