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