Как перенести записи регистров сведений с персональными данными, связанных со справочником "Физ.лица", используя "Конвертацию данных 2.0" в 1С?

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

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

Разбираемся в проблеме: почему регистры сведений могут не выгружаться?

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

Прежде всего, давайте проанализируем, как настроена выгрузка регистров в вашей конфигурации, задав себе следующие вопросы:

  1. Используете ли вы отдельные Правила Выгрузки Данных (ПВД) для каждого регистра сведений, который нужно перенести, или вы ожидаете, что они будут выгружены "по правилам", как это часто реализовано в типовых обменах? В типовых правилах часто используется механизм ВыгрузитьПоПравилам(), который требует явного описания логики выгрузки подчиненных данных.
  2. Проверили ли вы, что для каждого регистра сведений, который вы хотите перенести, в соответствующем Правиле Выгрузки Данных (ПВД) установлен флаг "Выгружать данные"? Без этого флажка записи регистра просто не будут попадать в файл выгрузки.
  3. Если регистр сведений является подчиненным (например, регистр сведений "ПаспортныеДанныеФизЛиц" подчинен справочнику "ФизЛица"), убедитесь, что объект-владелец (справочник "ФизЛица") корректно переносится. Если ссылка на владельца не может быть восстановлена в базе-приемнике, зависимые записи подчиненного регистра сведений не будут загружены или даже не будут выгружаться.

Шаг за шагом: настройка переноса регистров сведений

Для успешного переноса записей регистров сведений, особенно содержащих персональные данные и связанных со справочником ФизЛица, мы рассмотрим следующие ключевые моменты и методы.

  1. Создание и привязка Правил Конвертации Объектов (ПКО) для регистров сведений

    Для каждого регистра сведений, который необходимо перенести, создайте отдельное Правило Конвертации Объекта (ПКО). Например, если у вас есть регистр сведений "ПаспортныеДанныеФизЛиц", создайте для него соответствующее ПКО.

    В этом ПКО:

    1. Настроим сопоставление измерений и ресурсов: Убедитесь, что все измерения регистра (например, ФизЛицо, Период) и ресурсы (например, СерияПаспорта, НомерПаспорта, КемВыдан) корректно сопоставлены с соответствующими полями источника. Для измерения ФизЛицо обязательно укажите Правило Конвертации Ссылки (ПКС), которое будет использовать ПКО для справочника ФизЛица.
    2. Установим флаг "Выгружать данные": Это критически важный шаг. Для каждого регистра сведений, который вы хотите перенести, необходимо в соответствующем Правиле Выгрузки Данных (ПВД) установить флаг "Выгружать данные". Без этого флажка записи регистра не будут выгружаться.

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

  2. Передача ссылок на связанные объекты

    Мы должны убедиться, что для всех ссылочных типов данных в регистре (например, на справочник ФизЛица) настроены соответствующие Правила Конвертации Объектов (ПКО). Только после того, как связанные объекты будут корректно перенесены, регистр сведений сможет на них сослаться в базе-приемнике. Если объект-владелец не переносится или переносится некорректно, записи подчиненного регистра сведений не будут выгружаться или не будут загружаться.

  3. Особенности выгрузки персональных данных

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

    1. Явное указание на необходимость выгрузки полей: Создайте отдельные Правила Конвертации Свойства (ПКС) для каждого поля регистра (например, для ФИО, Серии, НомераПаспорта, ДатыВыдачи и т.д.), чтобы явно указать, как эти данные должны быть конвертированы и загружены.
    2. Использование пользовательских алгоритмов: Если стандартные механизмы не подходят, мы можем написать пользовательские алгоритмы в обработчиках событий ПКО/ПВД для дополнительной обработки персональных данных, обеспечивая необходимую логику выгрузки и загрузки.
  4. Метод ПослеЗагрузки в ПКО (программное создание записей)

    Как было предложено на форуме, одним из наиболее гибких и мощных вариантов является использование обработчика ПослеЗагрузки в Правиле Конвертации Объектов (ПКО) для справочника ФизЛица или для самого регистра сведений. Этот подход особенно полезен, когда стандартные механизмы конвертации не справляются со сложной логикой привязки или формирования данных регистра. Мы можем программно создавать новые записи регистра сведений или обновлять существующие, используя данные, которые были получены из входящей структуры или из временного хранилища.

    Рассмотрим пример, как это можно реализовать в обработчике ПослеЗагрузки для ПКО справочника ФизЛица. Предположим, вы передали данные паспорта как входящие данные в ПКО справочника ФизЛица:

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

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

  5. Проверка уникальности записей регистра

    Для регистров сведений, особенно тех, которые зависят от измерений (например, ФизЛицо, Период), важно настроить правила поиска и записи данных в базе-приемнике. Убедитесь, что ключевые измерения регистра корректно сопоставляются, чтобы избежать дублирования или некорректного обновления записей. В большинстве случаев менеджер записи регистра сведений при вызове метода Записать() сам проверяет уникальность по измерениям. Если измерения совпадают, существующая запись будет перезаписана (при условии, что это не уникальный регистр с дополнительными ограничениями, которые требуют особой обработки).

  6. Отладка процесса выгрузки

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

    Пример отладки в ПриВыгрузке ПВД для регистра сведений:

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

    Такая отладка поможет нам точно определить, на каком этапе данные теряются: не выгружаются из источника, не формируются в файле обмена, или не загружаются в приемник.

Заключение

Перенос регистров сведений, особенно содержащих персональные данные, при помощи "Конвертации данных 2.0" требует внимательной настройки ПКО, ПВД и понимания механизмов связывания объектов. Используя предложенные методы, в частности, настройку явных ПКО для регистров, корректную передачу ссылок и при необходимости программное создание записей в обработчике ПослеЗагрузки, вы сможете добиться успешного переноса необходимых данных. Всегда начинайте с проверки базовых настроек и не пренебрегайте отладкой процесса для выявления корневой причины проблемы. Последовательный подход и внимательность к деталям позволят вам эффективно решить задачу переноса данных.

← На главную