При разработке внешних печатных форм или кастомных отчетов в 1С:ERP Управление предприятием (а также в ЗУП 3.1 или Комплексной автоматизации 2) часто возникает необходимость вывести паспортные данные сотрудника или контрагента. Начинающие разработчики часто пытаются использовать МенеджерЗаписи для чтения данных, что приводит к ошибкам или пустым результатам. В этой статье мы подробно разберем, почему старые методы не работают и как правильно извлекать персональные данные, используя современные механизмы платформы и типовых конфигураций.
Рассмотрим ситуацию: разработчик пытается получить данные, создавая объект РегистрыСведений.ДокументыФизическихЛиц.СоздатьМенеджерЗаписи(). Это в корне неверный подход для чтения данных в контексте печатных форм. Проанализируем основные причины:
МенеджерЗаписи предназначен для работы с одной конкретной уникальной записью регистра. Чтобы метод Прочитать() сработал, вам нужно передать точные значения всех измерений (Период, Физлицо, Вид документа). Если вы ошибетесь в периоде хотя бы на секунду, метод ничего не найдет.ПаспортныеДанные.Записать() возникает из-за того, что система пытается перезаписать (изменить) данные в базе. Для вывода в печатную форму запись в базу не требуется и даже опасна, так как может повредить целостность данных.Самый надежный и понятный способ — использование запроса к виртуальной таблице СрезПоследних. Это позволяет получить данные, актуальные на дату формирования документа.
Разберем пример кода, который можно использовать во внешней печатной форме:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДокументыФизическихЛицСрезПоследних.Серия КАК Серия,
| ДокументыФизическихЛицСрезПоследних.Номер КАК Номер,
| ДокументыФизическихЛицСрезПоследних.ДатаВыдачи КАК ДатаВыдачи,
| ДокументыФизическихЛицСрезПоследних.КемВыдан КАК КемВыдан,
| ДокументыФизическихЛицСрезПоследних.КодПодразделения КАК КодПодразделения
|ИЗ
| РегистрСведений.ДокументыФизическихЛиц.СрезПоследних(&Период, Физлицо = &Физлицо И ВидДокумента = &ВидДокумента) КАК ДокументыФизическихЛицСрезПоследних";
// В качестве периода лучше передавать дату документа, для которого строится печать
Запрос.УстановитьПараметр("Период", СсылкаНаОбъект.Дата);
Запрос.УстановитьПараметр("Физлицо", СсылкаНаОбъект.ФизическоеЛицо);
// Указываем конкретный вид документа — Паспорт РФ
Запрос.УстановитьПараметр("ВидДокумента", Справочники.ВидыДокументовФизическихЛиц.ПаспортРФ);
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
// Теперь данные доступны через Выборка.Серия, Выборка.Номер и т.д.
ПаспортныеДанныеСтрокой = "Паспорт: " + Выборка.Серия + " " + Выборка.Номер + ", выдан " + Формат(Выборка.ДатаВыдачи, "ДЛФ=D");
КонецЕсли;
Важный нюанс: Обратите внимание, что условие по Физлицо и ВидДокумента мы ставим прямо в параметрах виртуальной таблицы. Это критически важно для производительности системы, особенно в крупных базах ERP.
В современных конфигурациях на базе БСП (Библиотека стандартных подсистем) разработчики 1С уже написали функции, которые упрощают получение этих данных. Использование типовых методов делает ваш код более «чистым» и устойчивым к обновлениям.
Рассмотрим использование функции из программного интерфейса модуля КадровыйУчет. Этот метод удобен тем, что он возвращает сразу готовую структуру данных или таблицу:
// Подготовим массив физлиц (даже если оно одно)
МассивФизЛиц = Новый Массив;
МассивФизЛиц.Добавить(СсылкаНаОбъект.ФизическоеЛицо);
// Вызываем типовую функцию
ТаблицаДокументов = КадровыйУчет.ДанныеДокументовФизическихЛиц(МассивФизЛиц, СсылкаНаОбъект.Дата, Справочники.ВидыДокументовФизическихЛиц.ПаспортРФ);
Если ТаблицаДокументов.Количество() > 0 Тогда
СтрокаДанных = ТаблицаДокументов[0];
Серия = СтрокаДанных.Серия;
Номер = СтрокаДанных.Номер;
// Функция возвращает все поля: КемВыдан, ДатаВыдачи и т.д.
КонецЕсли;
Преимущество этого метода в том, что внутри него уже учтены все нюансы работы с регистром, включая проверку прав доступа и корректность выбора среза данных.
Зачастую в печатной форме не нужно выводить серию и номер в разные ячейки, а требуется одна длинная строка: «Паспорт РФ серия 1234 № 567890, выдан ОВД г. Москвы...». Чтобы не собирать эту строку вручную плюсиками, проанализируем функцию ПредставлениеДокумента в модуле КадровыйУчетКлиентСервер.
Вы можете передать в неё структуру с данными, и она вернет грамматически верную строку. Это избавляет от проблем с лишними пробелами или запятыми, если какое-то поле (например, код подразделения) не заполнено.
При работе с персональными данными в ERP часто включены ограничения на уровне записей (RLS). Если у пользователя, который запускает печать, нет прав на чтение регистра ДокументыФизическихЛиц, ваш запрос вернет пустой результат, даже если паспорт у человека в базе есть.
Если печатная форма должна работать у всех сотрудников, независимо от их доступа к кадровым данным, необходимо обернуть получение данных в привилегированный режим:
УстановитьПривилегированныйРежим(Истина);
// Выполняем запрос или вызываем типовую функцию
УстановитьПривилегированныйРежим(Ложь);
Резюмируем: Для получения паспортных данных в ERP забудьте про СоздатьМенеджерЗаписи. Используйте либо прямой запрос к виртуальной таблице СрезПоследних с обязательной фильтрацией по виду документа, либо (что более профессионально) обращайтесь к методам общего модуля КадровыйУчет. Это гарантирует точность данных и стабильную работу вашей обработки.