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