Как правильно получить оклад сотрудника в запросе для внешней печатной формы в 1С

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

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

Почему запрос к табличной части документа возвращает пустой результат или работает с ошибками

Проанализируем распространенную ошибку: обращение напрямую к табличной части ОсновныеНачисления документа КадровоеПеремещениеОрганизаций.


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

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

  1. Несоответствие типов параметров: в процедурах печати внешних обработок в параметр &Ссылка нередко передается не единичная ссылка, а МассивОбъектов. Если в секции ГДЕ используется знак = вместо оператора В (&Ссылка), запрос возвращает пустую выборку без вызова исключений.
  2. Особенности заполнения документа: в кадровом перемещении реквизит Показатель1 заполняется только тогда, когда оклад изменяется непосредственно этим документом. Если начисление не менялось (действие Не изменять), колонка может быть пустой, хотя сотрудник фактически продолжает получать оклад.
  3. Жесткая привязка к виду расчета: при отборе по конкретному значению &ВидРасчета запрос вернет пустоту, если у работника назначен смежный вид начисления (например, «Оклад по часам» вместо «Оклад по дням» или начисление по индивидуальному тарифу).
  4. Статус документа: выборка напрямую из табличных частей может выбирать данные непроведенных или помеченных на удаление документов.

Способ 1. Получение оклада срезом последних из регистра сведений (для конфигураций ЗУП 2.5, УПП 1.3, КА 1.1)

Рассмотрим классический подход для конфигураций на обычных формах. В них плановые начисления сотрудников фиксируются в периодическом регистре сведений ПлановыеНачисленияРаботниковОрганизаций. Для получения актуальной тарифной ставки на дату кадрового события выполним запрос к виртуальной таблице СрезПоследних.


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

Разберем важные нюансы этого запроса:

  1. Передача даты: в параметр &Период необходимо передавать дату документа или дату вступления изменений в силу. Если передать пустую дату, будет возвращено самое последнее состояние на текущий момент, что исказит печатную форму задним числом.
  2. Проверка активности начисления: при отмене планового начисления в регистр записывается действие Прекратить. Чтобы не вывести отмененный оклад, убедимся, что показатель отличен от нуля, либо добавим проверку реквизита действия.
  3. Комбинированная выборка: если печатная форма должна формироваться до проведения документа, данные о новом окладе берем из объекта документа, а если там изменений не было — обращаемся к срезу последних регистра.

Способ 2. Использование типового программного интерфейса (для конфигураций ЗУП 3.1, ERP 2, КА 2)

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


МассивСотрудников = Новый Массив;
МассивСотрудников.Добавить(СсылкаНаДокумент.Сотрудник);

КадровыеДанные = "ОкладТариф,ТарифнаяСтавка";
ТаблицаДанных = КадровыйУчет.КадровыеДанныеСотрудников(
    Истина, 
    МассивСотрудников, 
    КадровыеДанные, 
    СсылкаНаДокумент.ДатаДействия
);

Если ТаблицаДанных.Количество() > 0 Тогда
    СтрокаДанных = ТаблицаДанных[0];
    ТекущийОклад = СтрокаДанных.ТарифнаяСтавка;
КонецЕсли;

Преимущества использования типового метода:

  1. Универсальность: метод автоматически определяет действующий вид тарифной ставки сотрудника вне зависимости от того, оклад ли это по дням, по часам или совокупная тарифная ставка.
  2. Учет всех кадровых событий: функция учитывает индексации, временные переводы и графики работы на переданную дату.
  3. Поддержка прав доступа: вызов метода корректно работает в контексте ограничений RLS и возвращает стандартизированную структуру данных.
← На главную