Как правильно получить класс условий труда в печатной форме для 1С:ЗУП 3.1?

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

При разработке внешних печатных форм или обработок в конфигурации «Зарплата и управление персоналом 3.1» (ЗУП) часто возникает задача вывести информацию о классе условий труда (специальной оценке условий труда — СОУТ). Однако программисты часто сталкиваются с ситуацией, когда запрос возвращает пустое значение, хотя в интерфейсе программы данные заполнены. Рассмотрим подробнее, почему это происходит и как правильно составить запрос для получения этих данных.

Анализ проблемы: почему данные не выбираются

Проанализируем ситуацию, описанную в теме. Автор пытается получить класс условий труда из регистра сведений КлассыУсловийТрудаПоДолжностям, используя левое соединение по наименованию должности. Это типичная ошибка, которая приводит к потере данных по нескольким причинам:

  1. Соединение по строке: Использование наименования (строкового поля) вместо ссылки (уникального идентификатора) крайне неэффективно и ненадежно. Любой лишний пробел или различие в регистре букв приведет к тому, что соединение не сработает.
  2. Составной тип данных: В регистре КлассыУсловийТрудаПоДолжностям измерение Должность имеет составной тип: он может ссылаться на справочники Должности, ШтатноеРасписание или УсловияТруда. В запросах 1С работа с составными типами требует особого внимания.
  3. Смена архитектуры: В современных версиях ЗУП 3.1 данные о вредности чаще привязываются не к «абстрактной» должности, а к конкретной позиции штатного расписания или даже к рабочему месту.

Решение №1: Правильное использование регистра КлассыУсловийТрудаПоДолжностям

Если в вашей информационной базе данные все же хранятся в этом регистре, необходимо переписать соединение в запросе. Выясним причину ошибки: когда мы пишем ВТ_ДолжностиФинал.НаименованиеДолжности = ВТ_УсловияТруда.НаименованиеДолжности, система пытается сравнить ссылки, но из-за составного типа измерения в регистре 1С может не сопоставить их корректно без явного приведения типа.

Рассмотрим пример правильного фрагмента запроса с использованием оператора ВЫРАЗИТЬ:


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

Важный момент: использование ВЫРАЗИТЬ позволяет системе четко понимать, какой тип данных мы сравниваем, что критически важно для составных полей.

Решение №2: Получение данных через Штатное расписание

Проанализируем более современный подход. В ЗУП 3.1 при включенном ведении штатного расписания класс условий труда обычно указывается в карточке позиции штатного расписания. Там есть поле Условия труда, которое ссылается на одноименный справочник, в котором, в свою очередь, указан КлассУсловийТруда.

Разберем по шагам, как добраться до этих данных в запросе:

  1. Получаем ссылку на ШтатноеРасписание из документа «Кадровый перевод».
  2. Обращаемся к реквизиту УсловияТруда этой позиции.
  3. Из справочника УсловияТруда выбираем поле КлассУсловийТруда.

Пример структуры запроса для такого случая:


|ВЫБРАТЬ
|    КадровыйПеревод.Сотрудник,
|    КадровыйПеревод.ДолжностьПоШтатномуРасписанию.УсловияТруда.КлассУсловийТруда КАК КлассУсловийТруда
|ИЗ
|    Документ.КадровыйПеревод КАК КадровыйПеревод
|ГДЕ
|    КадровыйПеревод.Ссылка В(&МассивОбъектов)

Этот способ является наиболее надежным для конфигураций, где ведется полноценный кадровый учет с использованием штатного расписания.

Решение №3: Обработка результатов запроса в коде 1С

После того как мы исправили запрос, нам нужно правильно обработать полученные данные в цикле формирования печатной формы. Посмотрим на пример кода, который позволит динамически менять макет в зависимости от установленной «вредности»:


Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    
    КлассТруда = ВыборкаДетальныеЗаписи.КлассУсловийТруда;
    
    // Сравниваем значение с предопределенным элементом перечисления
    Если КлассТруда = Перечисления.КлассыУсловийТрудаПоРезультатамСпециальнойОценки.Вредный1 Тогда
        Макет = ПолучитьМакет("МакетВредность3_1");
        СтрПараметры.Вставить("ТекстКласса", "3.1 (вредные условия 1 степени)");
    ИначеЕсли КлассТруда = Перечисления.КлассыУсловийТрудаПоРезультатамСпециальнойОценки.Вредный2 Тогда
        Макет = ПолучитьМакет("МакетВредность3_2");
        СтрПараметры.Вставить("ТекстКласса", "3.2 (вредные условия 2 степени)");
    Иначе
        // По умолчанию используем стандартный макет
        Макет = ПолучитьМакет("МакетСтандарт");
    КонецЕсли;
    
    // Вывод областей макета...
    Область = Макет.ПолучитьОбласть("Шапка");
    Область.Параметры.Заполнить(СтрПараметры);
    ТабДок.Вывести(Область);
    
КонецЦикла;

Совет: если отладчик показывает, что значение пустое, всегда проверяйте дату среза последних. Если дата документа (например, 01.01.2023) меньше даты проведения спецоценки (например, 15.01.2023), запрос на дату документа вернет пустое значение. Всегда учитывайте периодичность регистров сведений в ЗУП.

Рекомендации по отладке

Выясним причину, если данные все равно не появляются. Используйте следующие методы:

Таким образом, для успешного решения задачи необходимо отказаться от соединения по наименованиям, использовать ВЫРАЗИТЬ для составных типов и учитывать структуру хранения данных в ЗУП 3.1 через позиции штатного расписания. Для проверки и быстрой отладки подобных конструкций подойдёт консоль запросов с поддержкой программного интерфейса ЗУП.

← На главную