При разработке внешних печатных форм (например, дополнительного соглашения к трудовому договору или кадрового приказа) часто возникает задача вывести текущий размер оклада сотрудника. Разработчики нередко пытаются получить эти данные напрямую из табличной части документа перемещения, однако такой подход часто приводит к получению пустых значений или некорректных сумм. Разберем по шагам, почему прямой запрос к документу может не работать, и рассмотрим надежные способы получения действующего оклада.
Проанализируем распространенную ошибку: обращение напрямую к табличной части ОсновныеНачисления документа КадровоеПеремещениеОрганизаций.
ВЫБРАТЬ
КадровоеПеремещениеОрганизацийОсновныеНачисления.Показатель1 КАК ОкладДоп,
КадровоеПеремещениеОрганизацийОсновныеНачисления.ВидРасчета,
КадровоеПеремещениеОрганизацийОсновныеНачисления.Сотрудник,
КадровоеПеремещениеОрганизацийОсновныеНачисления.Ссылка
ИЗ
Документ.КадровоеПеремещениеОрганизаций.ОсновныеНачисления КАК КадровоеПеремещениеОрганизацийОсновныеНачисления
ГДЕ
КадровоеПеремещениеОрганизацийОсновныеНачисления.ВидРасчета = &ВидРасчета
И КадровоеПеремещениеОрганизацийОсновныеНачисления.Сотрудник = &Сотрудник
И КадровоеПеремещениеОрганизацийОсновныеНачисления.Ссылка = &Ссылка
Выясним причины, по которым данный запрос часто не дает нужного результата в коде модуля:
&Ссылка нередко передается не единичная ссылка, а МассивОбъектов. Если в секции ГДЕ используется знак = вместо оператора В (&Ссылка), запрос возвращает пустую выборку без вызова исключений.Показатель1 заполняется только тогда, когда оклад изменяется непосредственно этим документом. Если начисление не менялось (действие Не изменять), колонка может быть пустой, хотя сотрудник фактически продолжает получать оклад.&ВидРасчета запрос вернет пустоту, если у работника назначен смежный вид начисления (например, «Оклад по часам» вместо «Оклад по дням» или начисление по индивидуальному тарифу).Рассмотрим классический подход для конфигураций на обычных формах. В них плановые начисления сотрудников фиксируются в периодическом регистре сведений ПлановыеНачисленияРаботниковОрганизаций. Для получения актуальной тарифной ставки на дату кадрового события выполним запрос к виртуальной таблице СрезПоследних.
ВЫБРАТЬ
ПлановыеНачисления.Сотрудник КАК Сотрудник,
ПлановыеНачисления.Показатель1 КАК РазмерОклада,
ПлановыеНачисления.ВидРасчета КАК ВидРасчета
ИЗ
РегистрСведений.ПлановыеНачисленияРаботниковОрганизаций.СрезПоследних(
&Период,
Сотрудник = &Сотрудник
) КАК ПлановыеНачисления
ГДЕ
ПлановыеНачисления.Показатель1 <> 0
И (ПлановыеНачисления.ВидРасчета = &ВидРасчета ИЛИ &ВидРасчета = НЕОПРЕДЕЛЕНО)
Разберем важные нюансы этого запроса:
&Период необходимо передавать дату документа или дату вступления изменений в силу. Если передать пустую дату, будет возвращено самое последнее состояние на текущий момент, что исказит печатную форму задним числом.Прекратить. Чтобы не вывести отмененный оклад, убедимся, что показатель отличен от нуля, либо добавим проверку реквизита действия.В современных конфигурациях на базе управляемых форм механизм хранения начислений значительно сложнее: используются тарифные группы, формулы и регистры периодических показателей. Прямые запросы к таблицам в таком случае крайне не рекомендуются. Посмотрим, как получить оклад через типовую функцию общего модуля КадровыйУчет.
МассивСотрудников = Новый Массив;
МассивСотрудников.Добавить(СсылкаНаДокумент.Сотрудник);
КадровыеДанные = "ОкладТариф,ТарифнаяСтавка";
ТаблицаДанных = КадровыйУчет.КадровыеДанныеСотрудников(
Истина,
МассивСотрудников,
КадровыеДанные,
СсылкаНаДокумент.ДатаДействия
);
Если ТаблицаДанных.Количество() > 0 Тогда
СтрокаДанных = ТаблицаДанных[0];
ТекущийОклад = СтрокаДанных.ТарифнаяСтавка;
КонецЕсли;
Преимущества использования типового метода: