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