Как перенести паспортные данные из ЗУП 3.1 в УТ 10.3 при помощи Конвертации данных 2.1?

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

Перенос регистрационных и паспортных данных между конфигурациями «1С» — классическая задача при интеграции систем. Однако при попытке настроить прямой обмен данными между регистром сведений ДокументыФизическихЛиц в ЗУП 3.1 и регистром ПаспортныеДанныеФизЛиц в УТ 10.3 разработчики часто сталкиваются с ошибками проектирования правил обмена. Самая частая из них — попытка сопоставления записей нессылочных типов.

В этой статье мы подробно разберем, почему возникает популярная ошибка «поиск по полю отменен, так как объект для загрузки в приемнике не ссылочного типа», и по шагам настроим корректный, отказоустойчивый перенос данных с использованием специализированных обработчиков событий в технологии «Конвертация данных 2.1».

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

---

Почему возникает ошибка поиска в регистрах сведений?

Прежде чем перейти к коду, давайте выясним техническую причину сбоя при стандартной настройке правил обмена. Ошибка возникает из-за фундаментального различия между ссылочными объектами платформы «1С:Предприятие» (справочники, документы) и регистрами сведений:

Когда вы пытаетесь сопоставить записи регистров «напрямую», выставляя галочки поиска на ресурсах или реквизитах, механизм конвертации выдает ошибку. Алгоритм «Конвертации данных 2.1» просто не может выполнить метод поиска по ссылке для сущности, которая физически не хранится в таблицах ссылок СУБД.

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

---

Шаг 1. Создание и настройка ПКО для регистра сведений

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

Выполним следующие действия по настройке правила:

  1. В поле Источник оставим пустое значение (так как данные мы будем собирать и передавать программно через специальную структуру).
  2. В поле Приемник выберем объект: РегистрСведенийЗапись.ПаспортныеДанныеФизЛиц.
  3. Перейдем в табличную часть Правил конвертации свойств (ПКС) и добавим строки для всех необходимых реквизитов и измерений регистра-приемника:
    • Период
    • ФизЛицо
    • ДокументВид
    • ДокументСерия
    • ДокументНомер
    • ДокументДатаВыдачи
    • ДокументКемВыдан
    • ДокументКодПодразделения
  4. Для каждого из этих свойств в колонке настроек обязательно установим флаг «Получить из входящих данных». Это указывает механизму КД, что значения не будут считываться из полей источника автоматически, а придут из программно подготовленной структуры.
  5. Для свойств, являющихся ключевыми измерениями (в нашем случае это ФизЛицо и, если регистр периодический, Период), установим флаг «Поиск». Это позволит платформе сопоставить существующие записи в базе УТ 10.3 и обновить их, избегая дублирования.
  6. Для ссылочных свойств (ФизЛицо, ДокументВид) укажем их собственные ПКО (например, ФизическиеЛица и ВидыДокументовФизическихЛиц соответственно).
  7. В настройках самого ПКО регистра на вкладке «Общие» обязательно взведем флаг «Не запоминать выгруженные объекты». Это предотвратит переполнение оперативной памяти при выгрузке больших объемов данных.

---

Шаг 2. Программная выгрузка паспортных данных в ПКО «ФизическиеЛица»

Теперь настроим логику передачи данных. Нам нужно сделать так, чтобы при конвертации конкретного физического лица система автоматически обращалась к регистру ДокументыФизическихЛиц в ЗУП 3.1, выбирала оттуда действующий паспорт, упаковывала его параметры в структуру и передавала в созданное на Шаге 1 правило.

Откроем ПКО справочника ФизическиеЛица и перейдем в обработчик события «После выгрузки». Напишем следующий программный код на языке 1С:


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

Рассмотрим подробнее, как работает этот алгоритм. Во время выгрузки каждого физического лица система временно приостанавливает стандартный линейный процесс и выполняет SQL-запрос к базе данных ЗУП 3.1. Запрос извлекает строку документа с типом «Паспорт РФ» для выгружаемого в данный момент объекта. Затем метод ВыгрузитьПоПравилу берет подготовленную структуру СтруктураПаспорта и отправляет ее в XML-файл обмена, размечая тегами ПКО ПаспортныеДанныеФизЛиц.

---

Шаг 3. Анализ и исправление ошибок незагруженных данных

Часто разработчики сталкиваются с тем, что часть паспортных данных не доходит до приемника. Выясним основные причины этой проблемы и разберем способы борьбы с ними.

Проблема №1: Несовпадение кодов физических лиц в базах ЗУП и УТ

Если в правилах конвертации справочника ФизическиеЛица настроен поиск исключительно по коду, то при несовпадении кодов в двух базах сопоставление не произойдет. В ЗУП 3.1 коды физических лиц могут содержать префиксы организации (например, "ЗП00-00001"), в то время как в УТ 10.3 они могут быть чисто числовыми ("00000001"). Если КД не находит сопоставления для физлица, измерение ФизЛицо в регистре сведений остается пустым при загрузке. База данных «1С» отвергает записи с пустыми ведущими измерениями, и строка тихо игнорируется.

Решение: Настройте комбинированные поля поиска в ПКО ФизическиеЛица. Помимо кода, установите флаг поиска по свойствам ФИО (Наименование) и Дата рождения. Для этого в ПКО справочника перейдите в обработчик события ПоляПоиска и пропишите приоритеты сопоставления.

Проблема №2: Отсутствие флага записи регистра в приемнике

Даже если файл обмена успешно сформирован и прочитан загрузчиком в УТ 10.3, данные могут не появиться в таблицах СУБД, если отключена принудительная запись транзакций.

Решение: Убедитесь, что в настройках ПКО регистра сведений ПаспортныеДанныеФизЛиц на стороне приемника взведен флаг «Записывать в информационную базу при загрузке». Без этого флага XML-анализатор обработает теги в оперативной памяти, но физически метод НаборЗаписей.Записать() вызван не будет.

Проблема №3: Пропуски из-за пустого реквизита «Период»

В некоторых базах ЗУП 3.1 исторические паспортные данные могут иметь незаполненную дату записи (пустой период). При выгрузке в периодический регистр УТ 10.3 это может вызвать наложение ключей записи (когда для одного физлица создается несколько записей с пустой датой). В результате в УТ запишется только одна случайная строка.

Решение: В коде запроса обработчика «После выгрузки» добавьте проверку даты. Если дата выдачи или период не заполнены, принудительно устанавливайте минимальную системную дату платформы «1С» (например, '19800101000000') во избежание конфликтов перезаписи ключей.

Применяя предложенную методику программной генерации записей регистра через входящие данные и используя надежные алгоритмы поиска физических лиц по ФИО и дате рождения, вы гарантированно обеспечите полную и корректную передачу всей паспортной информации из ЗУП 3.1 в УТ 10.3.

← На главную