Как вывести паспортные данные сотрудника во внешней печатной форме 1С?

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

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

Разбор основной ошибки: почему запрос выводит «не того» сотрудника

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


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |    ПриемНаРаботу.Сотрудник КАК Сотрудник
    |ИЗ
    |    Документ.ПриемНаРаботу КАК ПриемНаРаботу";

Причина ошибки очевидна: в запросе отсутствует секция ГДЕ. Без явного указания фильтра по ссылке конкретного документа система выбирает все записи из таблицы. Поскольку печатная форма обычно ожидает одно значение, она берет первую строку из результата выборки. Чтобы исправить это, нам необходимо передать в запрос параметр &Ссылка.

Работа с параметром МассивОбъектов в механизме БСП

В современных конфигурациях 1С (ЗУП 3.1, БП 3.0, ERP), построенных на базе Библиотеки стандартных подсистем (БСП), внешняя печатная форма получает данные через процедуру Печать. В эту процедуру платформа автоматически передает параметр МассивОбъектов. Это массив ссылок на документы, которые пользователь выбрал для печати (даже если выбран всего один документ). Рассмотрим, как правильно использовать этот массив в коде:


// В процедуре Печать (или функции СведенияОВнешнейОбработке)
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |    ПриемНаРаботу.Ссылка КАК Ссылка,
    |    ПриемНаРаботу.ФизическоеЛицо КАК ФизическоеЛицо,
    |    ПриемНаРаботу.Сотрудник КАК Сотрудник
    |ИЗ
    |    Документ.ПриемНаРаботу КАК ПриемНаРаботу
    |ГДЕ
    |    ПриемНаРаботу.Ссылка В (&МассивОбъектов)";

Запрос.УстановитьПараметр("МассивОбъектов", МассивОбъектов);
РезультатЗапроса = Запрос.Выполнить();

Использование оператора В (&МассивОбъектов) вместо = &Ссылка является более универсальным и правильным подходом, так как позволяет корректно обрабатывать групповую печать нескольких документов из списка.

Получение паспортных данных из регистра сведений

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

Важный момент: никогда не выполняйте запрос к регистру сведений внутри цикла обхода сотрудников. Это создает избыточную нагрузку на сервер (проблема N+1). Правильнее будет использовать Левое Соединение прямо в основном запросе.

Проанализируем пример комплексного запроса:


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

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

Выборка = Запрос.Выполнить().Выбрать();

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

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

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

Посмотрим на пример заполнения параметров макета:


Пока Выборка.Следующий() Цикл
    ОбластьМакета = Макет.ПолучитьОбласть("ДанныеСотрудника");
    
    // Ручное формирование строки, если нет доступа к типовым функциям
    ПаспортСтрокой = "Паспорт: серия " + Выборка.Серия + " № " + Выборка.Номер + 
                     ", выдан " + Выборка.КемВыдан + " " + Формат(Выборка.ДатаВыдачи, "ДФ=dd.MM.yyyy");
    
    ОбластьМакета.Параметры.ПаспортныеДанные = ПаспортСтрокой;
    ТабличныйДокумент.Вывести(ОбластьМакета);
КонецЦикла;

Рекомендации по отладке внешних форм

Если при попытке обращения к Объект.Ссылка или ЭтотОбъект.Ссылка вы получаете ошибку «Переменная не определена», выясним причину. В модуле объекта внешней печатной формы нет переменной Объект. Ссылка на документ всегда должна приходить извне — либо через МассивОбъектов в процедуре печати, либо через реквизит обработки, если вы тестируете её через «Файл - Открыть».

Для эффективной разработки рекомендуем использовать следующий алгоритм:

  1. Проверяйте логику запроса в Консоли запросов, подставляя реальную ссылку на документ в параметры.
  2. Убедитесь, что у пользователя, под которым запускается печать, есть права на чтение регистра ДокументыФизическихЛиц. Если прав нет, данные будут пустыми. В таких случаях код получения данных можно обернуть в УстановитьПривилегированныйРежим(Истина).
  3. Всегда используйте ЛЕВОЕ СОЕДИНЕНИЕ, чтобы, если у сотрудника вдруг не заведен паспорт в системе, сам документ всё равно вывелся на печать (пусть и с пустыми полями паспорта), а не исчез из выборки вовсе.

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

← На главную