Как программно получить паспортные данные физического лица в 1С:ERP?

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

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

Почему использование Менеджера записи — это ошибка?

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

  1. Назначение объекта: МенеджерЗаписи предназначен для работы с одной конкретной уникальной записью регистра. Чтобы метод Прочитать() сработал, вам нужно передать точные значения всех измерений (Период, Физлицо, Вид документа). Если вы ошибетесь в периоде хотя бы на секунду, метод ничего не найдет.
  2. Лишние действия: Ошибка в коде ПаспортныеДанные.Записать() возникает из-за того, что система пытается перезаписать (изменить) данные в базе. Для вывода в печатную форму запись в базу не требуется и даже опасна, так как может повредить целостность данных.
  3. Периодичность: Регистр «Документы физических лиц» является периодическим. Паспортные данные могут меняться со временем (замена по возрасту, смена фамилии). Для получения актуальных данных на конкретную дату необходимо использовать механизм Среза последних.

Способ 1. Получение данных через запрос (универсальный метод)

Самый надежный и понятный способ — использование запроса к виртуальной таблице СрезПоследних. Это позволяет получить данные, актуальные на дату формирования документа.

Разберем пример кода, который можно использовать во внешней печатной форме:


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

// В качестве периода лучше передавать дату документа, для которого строится печать
Запрос.УстановитьПараметр("Период", СсылкаНаОбъект.Дата);
Запрос.УстановитьПараметр("Физлицо", СсылкаНаОбъект.ФизическоеЛицо);
// Указываем конкретный вид документа — Паспорт РФ
Запрос.УстановитьПараметр("ВидДокумента", Справочники.ВидыДокументовФизическихЛиц.ПаспортРФ);

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

Важный нюанс: Обратите внимание, что условие по Физлицо и ВидДокумента мы ставим прямо в параметрах виртуальной таблицы. Это критически важно для производительности системы, особенно в крупных базах ERP.

Способ 2. Использование типовых функций (API конфигурации)

В современных конфигурациях на базе БСП (Библиотека стандартных подсистем) разработчики 1С уже написали функции, которые упрощают получение этих данных. Использование типовых методов делает ваш код более «чистым» и устойчивым к обновлениям.

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


// Подготовим массив физлиц (даже если оно одно)
МассивФизЛиц = Новый Массив;
МассивФизЛиц.Добавить(СсылкаНаОбъект.ФизическоеЛицо);

// Вызываем типовую функцию
ТаблицаДокументов = КадровыйУчет.ДанныеДокументовФизическихЛиц(МассивФизЛиц, СсылкаНаОбъект.Дата, Справочники.ВидыДокументовФизическихЛиц.ПаспортРФ);

Если ТаблицаДокументов.Количество() > 0 Тогда
    СтрокаДанных = ТаблицаДокументов[0];
    Серия = СтрокаДанных.Серия;
    Номер = СтрокаДанных.Номер;
    // Функция возвращает все поля: КемВыдан, ДатаВыдачи и т.д.
КонецЕсли;

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

Формирование красивого представления данных

Зачастую в печатной форме не нужно выводить серию и номер в разные ячейки, а требуется одна длинная строка: «Паспорт РФ серия 1234 № 567890, выдан ОВД г. Москвы...». Чтобы не собирать эту строку вручную плюсиками, проанализируем функцию ПредставлениеДокумента в модуле КадровыйУчетКлиентСервер.

Вы можете передать в неё структуру с данными, и она вернет грамматически верную строку. Это избавляет от проблем с лишними пробелами или запятыми, если какое-то поле (например, код подразделения) не заполнено.

Особенности доступа (RLS)

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

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


УстановитьПривилегированныйРежим(Истина);
// Выполняем запрос или вызываем типовую функцию
УстановитьПривилегированныйРежим(Ложь);

Резюмируем: Для получения паспортных данных в ERP забудьте про СоздатьМенеджерЗаписи. Используйте либо прямой запрос к виртуальной таблице СрезПоследних с обязательной фильтрацией по виду документа, либо (что более профессионально) обращайтесь к методам общего модуля КадровыйУчет. Это гарантирует точность данных и стабильную работу вашей обработки.

← На главную