Как перенести записи регистра сведений вместе с основным объектом в Конвертации данных 2.0?

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

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

Проблема автоматической выгрузки регистров

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

Способ 1. Использование «Виртуальных свойств» (Рекомендуемый метод)

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

  1. В ПКО справочника ФизическиеЛица добавим новое свойство (ПКС).
  2. Поле Источник оставим пустым.
  3. В поле Приемник выберем имя нашего регистра (например, ФИОФизическихЛиц). Если в списке выбора его нет, можно оставить пустым или ввести произвольное имя, которое поможет нам идентифицировать задачу.
  4. Установим флаг «Передавать данные в параметр».
  5. В обработчике «Перед выгрузкой» этого ПКС напишем код, который соберет нужные данные.

Рассмотрим пример кода для обработки Перед выгрузкой в ПКС:


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

Запрос.УстановитьПараметр("ФизЛицо", Источник);
РезультатЗапроса = Запрос.Выполнить();

// Направляем таблицу значений в коллекцию объектов для выгрузки
Значение = РезультатЗапроса.Выгрузить();

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

Способ 2. Программная выгрузка в обработчике «После выгрузки»

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

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


// 1. Создаем набор записей для чтения данных
НаборЗаписей = РегистрыСведений.ФИОФизическихЛиц.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.ФизическоеЛицо.Установить(Источник);
НаборЗаписей.Прочитать();

// 2. Циклически выгружаем каждую запись по правилу конвертации регистра
Для Каждого Запись ИЗ НаборЗаписей Цикл
    // Параметры: ИсходныеДанные, Приемник, УзелСсылки, ТолькоДанные, ИмяПравила
    ВыгрузитьПоПравилу(Запись, , , , "ФИОФизическихЛиц");
КонецЦикла;

Здесь крайне важно, чтобы в справочнике правил «Конвертации данных» уже существовало ПКО с именем ФИОФизическихЛиц, где в качестве источника указан соответствующий регистр.

Способ 3. Перенос через входящие данные (VkhodnyyeDannye)

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

В ПКО справочника в обработчике Перед выгрузкой мы подготавливаем структуру или таблицу, а в ПКО регистра сведений настраиваем получение значений из ВходящиеДанные. Это гарантирует, что данные будут переданы вместе с объектом и корректно сопоставлены в базе-приемнике.

Важные нюансы настройки поиска (Синхронизация)

Проанализируем критически важный момент: синхронизацию записей регистра. В отличие от справочников, у записей регистра нет Уникального Идентификатора (GUID). Поиск осуществляется по ключевым полям — измерениям и периоду.

Для регистра ФИОФизическихЛиц в ПКО необходимо:

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

Особенности регистра «Паспортные данные»

Разберем ситуацию с паспортными данными. В современных типовых конфигурациях (например, БП 3.0) паспортные данные могут храниться не только в регистре, но и в составе контактной информации. Если же используется классический регистр ПаспортныеДанныеФизЛиц, то схема выгрузки идентична ФИО. Однако следует помнить:

Таким образом, мы рассмотрели основные методики связки справочников с их регистрами в КД 2.0. Наиболее стабильным и простым в отладке является Способ 2 с использованием перебора набора записей, так как он позволяет точно отфильтровать данные именно для текущего выгружаемого объекта.

← На главную