Как правильно вывести должность и табельный номер сотрудника в печатную форму документа?

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

При разработке печатных форм в 1С часто возникает задача вывода дополнительных кадровых данных, таких как должность или табельный номер, на дату документа. Нередко программисты сталкиваются с тем, что данные не выводятся или возвращают значение NULL. Давайте разберем, как правильно построить запрос и устранить типичные ошибки.

Анализ причин отсутствия данных в запросе

Первая и самая частая проблема — это избыточность условий связи в блоке ЛЕВОЕ СОЕДИНЕНИЕ. Когда вы связываете таблицу документа с виртуальной таблицей СрезПоследних регистра сведений, важно не перегружать условие ПО.

Рассмотрим исходный запрос, в котором возникала ошибка:


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

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

Как получить табельный номер

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

Если в вашем регистре сведений нет табельного номера, следуйте данному алгоритму:

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

Правила работы с виртуальной таблицей СрезПоследних

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

Пошаговая инструкция по исправлению

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


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

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

  1. Имена параметров в макете: совпадают ли они с именами полей в выборке запроса?
  2. Правильность обхода результата запроса: выводите ли вы область макета в цикле обхода выборки?
  3. Отладчик: поставьте точку останова в модуле и посмотрите содержимое переменной, содержащей результат запроса.

Работая сообща с отладчиком и конструктором запросов, вы быстро локализуете проблему. Главное — помнить, что запрос должен быть максимально простым, а связи — логически обоснованными.

← На главную