При разработке печатных форм в 1С часто возникает задача вывода дополнительных кадровых данных, таких как должность или табельный номер, на дату документа. Нередко программисты сталкиваются с тем, что данные не выводятся или возвращают значение NULL. Давайте разберем, как правильно построить запрос и устранить типичные ошибки.
Первая и самая частая проблема — это избыточность условий связи в блоке ЛЕВОЕ СОЕДИНЕНИЕ. Когда вы связываете таблицу документа с виртуальной таблицей СрезПоследних регистра сведений, важно не перегружать условие ПО.
Рассмотрим исходный запрос, в котором возникала ошибка:
ВЫБРАТЬ
ВРПСотрудники.Сотрудник,
КадроваяИсторияСотрудниковСрезПоследних.Должность
ИЗ
Документ.ВРП.Сотрудники КАК ВРПСотрудники
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КадроваяИсторияСотрудников.СрезПоследних(&ДатаКон, ) КАК КадроваяИсторияСотрудниковСрезПоследних
ПО ВРПСотрудники.Сотрудник = КадроваяИсторияСотрудниковСрезПоследних.Сотрудник
И ВРПСотрудники.Ссылка.Организация = КадроваяИсторияСотрудниковСрезПоследних.Организация
И ВРПСотрудники.Ссылка.Подразделение = КадроваяИсторияСотрудниковСрезПоследних.Подразделение
Разберем ошибку: Если вы уже соединяете таблицы по полю Сотрудник, добавление условий по Организация и Подразделение делает запрос слишком жестким. Если в регистре кадровой истории эти данные не совпадают с данными в документе (например, из-за особенностей учета или структуры метаданных), соединение не произойдет, и мы получим пустой результат. Для большинства типовых конфигураций достаточно связи по ссылке на справочник Сотрудники.
Часто возникает вопрос: почему табельный номер не выводится? Важно понимать архитектуру вашей конфигурации. В современных решениях, таких как 1С:ЗУП 3.1, табельный номер не всегда является реквизитом справочника Сотрудники. Он хранится в регистрах сведений, отвечающих за кадровый учет (например, РаботникиОрганизации или КадроваяИсторияСотрудников).
Если в вашем регистре сведений нет табельного номера, следуйте данному алгоритму:
ЛЕВОЕ СОЕДИНЕНИЕ.Сотрудник.Чтобы данные были актуальными на дату формирования печатной формы, необходимо строго соблюдать работу с параметрами виртуальных таблиц:
Период в виртуальную таблицу СрезПоследних.Период не передан, 1С по умолчанию возьмет текущее время выполнения запроса, что приведет к получению неактуальных или пустых данных.&ДатаКон передавайте дату документа или дату, на которую формируется форма.Давайте вместе проанализируем, как должен выглядеть исправленный запрос для получения корректных данных:
ВЫБРАТЬ
ВРПСотрудники.Сотрудник,
КадроваяИстория.Должность,
КадровыеДанные.ТабельныйНомер
ИЗ
Документ.ВРП.Сотрудники КАК ВРПСотрудники
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КадроваяИсторияСотрудников.СрезПоследних(&ДатаКон, ) КАК КадроваяИстория
ПО ВРПСотрудники.Сотрудник = КадроваяИстория.Сотрудник
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ТабельныеНомераСотрудников.СрезПоследних(&ДатаКон, ) КАК КадровыеДанные
ПО ВРПСотрудники.Сотрудник = КадровыеДанные.Сотрудник
ГДЕ
ВРПСотрудники.Ссылка = &Ссылка
Важное примечание: Если после того, как запрос стал выдавать корректные данные в консоли запросов, они все равно не появляются в печатной форме, проверьте:
Работая сообща с отладчиком и конструктором запросов, вы быстро локализуете проблему. Главное — помнить, что запрос должен быть максимально простым, а связи — логически обоснованными.