В процессе обмена данными между конфигурациями 1С, особенно при использовании инструмента "Конвертация данных 2.0", часто возникает задача переноса не только основных объектов, таких как документы или справочники, но и связанных с ними регистров сведений. Одним из распространенных сценариев является перенос справочника ФизЛица вместе с ассоциированными регистрами, содержащими конфиденциальные данные, например, паспортные. Давайте рассмотрим, как добиться успешного переноса таких данных.
Пользователи часто сталкиваются с ситуацией, когда, несмотря на добавление справочника ФизЛица и необходимых регистров в правила конвертации, записи этих регистров не переносятся. Как было отмечено на форуме, причина может крыться в некорректной настройке правил выгрузки данных (ПВД) или правил конвертации объектов (ПКО).
Прежде всего, давайте проанализируем, как настроена выгрузка регистров в вашей конфигурации, задав себе следующие вопросы:
ВыгрузитьПоПравилам(), который требует явного описания логики выгрузки подчиненных данных.Для успешного переноса записей регистров сведений, особенно содержащих персональные данные и связанных со справочником ФизЛица, мы рассмотрим следующие ключевые моменты и методы.
Для каждого регистра сведений, который необходимо перенести, создайте отдельное Правило Конвертации Объекта (ПКО). Например, если у вас есть регистр сведений "ПаспортныеДанныеФизЛиц", создайте для него соответствующее ПКО.
В этом ПКО:
ФизЛицо, Период) и ресурсы (например, СерияПаспорта, НомерПаспорта, КемВыдан) корректно сопоставлены с соответствующими полями источника. Для измерения ФизЛицо обязательно укажите Правило Конвертации Ссылки (ПКС), которое будет использовать ПКО для справочника ФизЛица.Если регистр сведений является подчиненным по составу какому-либо объекту (например, сотруднику), его выгрузка может быть настроена через Правила Конвертации Свойства (ПКС) основного объекта. В этом случае в качестве источника может выступать табличная часть или реквизит, связанный с регистром.
Мы должны убедиться, что для всех ссылочных типов данных в регистре (например, на справочник ФизЛица) настроены соответствующие Правила Конвертации Объектов (ПКО). Только после того, как связанные объекты будут корректно перенесены, регистр сведений сможет на них сослаться в базе-приемнике. Если объект-владелец не переносится или переносится некорректно, записи подчиненного регистра сведений не будут выгружаться или не будут загружаться.
Передача паспортных данных требует особого внимания. Некоторые типовые конфигурации могут иметь встроенные механизмы, ограничивающие прямой перенос таких данных по соображениям безопасности или конфиденциальности. В таких случаях может потребоваться:
ФИО, Серии, НомераПаспорта, ДатыВыдачи и т.д.), чтобы явно указать, как эти данные должны быть конвертированы и загружены.ПослеЗагрузки в ПКО (программное создание записей)Как было предложено на форуме, одним из наиболее гибких и мощных вариантов является использование обработчика ПослеЗагрузки в Правиле Конвертации Объектов (ПКО) для справочника ФизЛица или для самого регистра сведений. Этот подход особенно полезен, когда стандартные механизмы конвертации не справляются со сложной логикой привязки или формирования данных регистра. Мы можем программно создавать новые записи регистра сведений или обновлять существующие, используя данные, которые были получены из входящей структуры или из временного хранилища.
Рассмотрим пример, как это можно реализовать в обработчике ПослеЗагрузки для ПКО справочника ФизЛица. Предположим, вы передали данные паспорта как входящие данные в ПКО справочника ФизЛица:
// ВходящиеДанные.ПаспортныеДанные - это структура или набор значений,
// содержащий информацию о паспорте (Серия, Номер, КемВыдан, ДатаВыдачи и т.д.),
// которые мы предварительно сформировали в базе-источнике и передали.
Если ВходящиеДанные.Свойство("ПаспортныеДанные") И НЕ ВходящиеДанные.ПаспортныеДанные = Неопределено Тогда
ПаспортныеДанные = ВходящиеДанные.ПаспортныеДанные;
// Получаем ссылку на текущий элемент справочника ФизЛица, который только что загружен.
// СсылкаНаОбъект - это предопределенная переменная в обработчике ПослеЗагрузки.
НовоеФизЛицо = СсылкаНаОбъект;
// Создаем или находим менеджер записи регистра сведений "ПаспортныеДанныеФизЛиц".
ЗаписьРегистра = РегистрыСведений.ПаспортныеДанныеФизЛиц.СоздатьМенеджерЗаписи();
ЗаписьРегистра.ФизЛицо = НовоеФизЛицо;
// Предполагаем, что регистр периодический и мы хотим записать на текущую дату.
// Если регистр непериодический, это поле не требуется.
ЗаписьРегистра.Период = ТекущаяДата();
// Заполняем ресурсы регистра данными из ВходящиеДанные.
ЗаписьРегистра.СерияПаспорта = ПаспортныеДанные.СерияПаспорта;
ЗаписьРегистра.НомерПаспорта = ПаспортныеДанные.НомерПаспорта;
ЗаписьРегистра.ДатаВыдачи = ПаспортныеДанные.ДатаВыдачи;
ЗаписьРегистра.КемВыдан = ПаспортныеДанные.КемВыдан;
// ... и другие поля, если они есть в регистре и были переданы
Попытка
// Записываем запись регистра. Параметр Истина означает замещение
// существующей записи, если найдены совпадающие измерения.
ЗаписьРегистра.Записать(Истина);
Исключение
// В случае ошибки записи, сообщаем пользователю.
Сообщить("Ошибка записи паспортных данных для физлица " + НовоеФизЛицо + ": " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
Этот подход требует, чтобы данные паспорта были переданы в ВходящиеДанные ПКО справочника ФизЛица на этапе выгрузки. Вы можете сделать это, например, в обработчике ПослеВыгрузки ПКО для ФизЛица в базе-источнике, добавив их в структуру ВыгружаемыеДанные, которая затем станет ВходящиеДанные в базе-приемнике, или же создать отдельное ПКО для регистра сведений и настроить его так, чтобы оно выгружало данные напрямую.
Для регистров сведений, особенно тех, которые зависят от измерений (например, ФизЛицо, Период), важно настроить правила поиска и записи данных в базе-приемнике. Убедитесь, что ключевые измерения регистра корректно сопоставляются, чтобы избежать дублирования или некорректного обновления записей. В большинстве случаев менеджер записи регистра сведений при вызове метода Записать() сам проверяет уникальность по измерениям. Если измерения совпадают, существующая запись будет перезаписана (при условии, что это не уникальный регистр с дополнительными ограничениями, которые требуют особой обработки).
Если данные все еще не выгружаются или выгружаются некорректно, необходимо найти место в программном коде правил конвертации, где они должны выгружаться, и проверить, какое условие срабатывает. Мы рекомендуем использовать обработчики событий ПередВыгрузкой и ПриВыгрузке в ПВД или ПКО. Временно добавьте отладочные сообщения (например, с помощью функции Сообщить()) или установите точки останова, чтобы убедиться, что код выгрузки регистра сведений достигается и данные, которые вы ожидаете выгрузить, действительно присутствуют на этом этапе.
Пример отладки в ПриВыгрузке ПВД для регистра сведений:
// Этот код выполняется при выгрузке каждой записи регистра сведений.
// Источник - это ссылка на запись регистра в базе-источнике.
Если Источник <> Неопределено Тогда
Сообщить("Выгружается запись регистра сведений " + Источник.Метаданные().Имя +
" для физлица: " + Строка(Источник.ФизЛицо) +
" (Серия: " + Строка(Источник.СерияПаспорта) +
", Номер: " + Строка(Источник.НомерПаспорта) + ")");
// Можно добавить более подробные проверки условий или значения полей,
// например, проверить, является ли физлицо "нужным" для выгрузки.
Иначе
Сообщить("Ошибка: Источник в ПриВыгрузке равен Неопределено.");
КонецЕсли;
Такая отладка поможет нам точно определить, на каком этапе данные теряются: не выгружаются из источника, не формируются в файле обмена, или не загружаются в приемник.
Перенос регистров сведений, особенно содержащих персональные данные, при помощи "Конвертации данных 2.0" требует внимательной настройки ПКО, ПВД и понимания механизмов связывания объектов. Используя предложенные методы, в частности, настройку явных ПКО для регистров, корректную передачу ссылок и при необходимости программное создание записей в обработчике ПослеЗагрузки, вы сможете добиться успешного переноса необходимых данных. Всегда начинайте с проверки базовых настроек и не пренебрегайте отладкой процесса для выявления корневой причины проблемы. Последовательный подход и внимательность к деталям позволят вам эффективно решить задачу переноса данных.