Как получить текущий оклад или тарифную ставку сотрудника во внешней печатной форме 1С?

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

При разработке внешних печатных форм кадровых документов и справок часто возникает задача вывести актуальную заработную плату (оклад или часовую тарифную ставку) сотрудника. Если обращаться напрямую к реквизитам документа-основания (например, СсылкаНаОбъект.ТарифнаяСтавка в документе «Прием на работу»), программа вернет лишь начальное значение, зафиксированное на дату оформления договора. Если после этого происходили кадровые переводы, индексации или изменения оплаты труда, эти данные окажутся устаревшими.

Разберем по шагам, почему возникает эта проблема и какими способами можно получить актуальный оклад сотрудника на нужную дату в современных конфигурациях 1С (ЗУП 3.1, ERP 2, КА 2).

Причины некорректного вывода данных:

  1. Обращение к статичным реквизитам: реквизиты документа хранят состояние условий труда только на момент его проведения.
  2. Смена архитектуры конфигураций: регистр ПлановыеНачисленияРаботниковОрганизаций использовался в устаревшей редакции ЗУП 2.5. В ЗУП 3.1 структура хранения начислений полностью изменена на интервальные регистры сведений.
  3. Периодичность показателей: оклады и надбавки хранятся в виде периодических показателей расчета зарплаты, привязанных к сотруднику и действующим плановым начислениям.

Способ 1. Использование типового программного интерфейса (рекомендуемый)

В конфигурациях на базе подсистемы «Зарплата и кадры» разработчики платформы реализовали специальный программный интерфейс, который скрывает сложность запросов к интервальным регистрам, автоматически учитывает ограничения прав доступа (RLS) и возвращает срез кадровых данных на указанную дату.

Рассмотрим пример получения актуального оклада и тарифной ставки через общий модуль КадровыйУчет:


// Формируем список сотрудников для получения данных
СписокСотрудников = Новый Массив;
СписокСотрудников.Добавить(СсылкаНаОбъект.Сотрудник);

// Запрашиваем требуемые поля через запятую
// Доступные поля: "ОкладТариф", "ТекущаяТарифнаяСтавка", "СовокупнаяТарифнаяСтавка", "ФОТ"
КадровыеПоля = "ОкладТариф, ТекущаяТарифнаяСтавка";
ДатаСреза = СсылкаНаОбъект.Дата; // или ТекущаяДатаСеанса()

ТаблицаДанных = КадровыйУчет.КадровыеДанныеСотрудников(
    Истина, 
    СписокСотрудников, 
    КадровыеПоля, 
    ДатаСреза
);

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

// Формирование строки для печатной формы
СтрокаТарифОклад = "" + ТекущийОклад + " (" + ЧислоПрописью(ТекущийОклад, "Л = ru_RU; ДП = Ложь", ", , , , , , , , 0") + ") рублей";
СтруктураДанных.Вставить("ТарифОклад", СтрокаТарифОклад);

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

Способ 2. Получение данных из регистра оперативных сведений

Если печатная форма формируется без привязки к исторической дате и требуется узнать строго текущую ставку сотрудника на текущий момент времени, проанализируем обращение к специализированному регистру сведений ТекущиеКадровыеДанныеСотрудников.


Запрос = Новый Запрос;
Запрос.ТекстComma = 
    "ВЫБРАТЬ
    |	КадровыеДанные.ТекущийОкладТариф КАК Оклад,
    |	КадровыеДанные.ТекущаяТарифнаяСтавка КАК ТарифнаяСтавка,
    |	КадровыеДанные.ТекущийФОТ КАК ФОТ
    |ИЗ
    |	РегистрСведений.ТекущиеКадровыеДанныеСотрудников КАК КадровыеДанные
    |ГДЕ
    |	КадровыеДанные.Сотрудник = &Сотрудник";

Запрос.УстановитьПараметр("Сотрудник", СсылкаНаОбъект.Сотрудник);

Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
    ТекущийОклад = Выборка.Оклад;
КонецЕсли;

Важно: этот регистр содержит данные только на текущий момент и не поддерживает срез на произвольную дату в прошлом.

Способ 3. Прямой запрос к периодическим показателям расчета

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


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

Запрос.УстановитьПараметр("Период", СсылкаНаОбъект.Дата);
Запрос.УстановитьПараметр("Сотрудник", СсылкаНаОбъект.Сотрудник);
Запрос.УстановитьПараметр("ПоказательОклад", Справочники.ПоказателиРасчетаЗарплаты.Оклад);

РезультатЗапроса往往 = Запрос.Выполнить();
Выборка = РезультатЗапроса往往.Выбрать();

Если Выборка.Следующий() Тогда
    ТекущийОклад = Выборка.РазмерОклада;
КонецЕсли;

Посмотрим на практические рекомендации при заполнении макетов печатных форм:

  1. При формировании печатной формы передавайте в срез данных дату самого документа (СсылкаНаОбъект.Дата), чтобы при повторной печати старых документов отображалась ставка, действовавшая именно в тот расчетный период.
  2. Для формирования суммы прописью с дробной частью и валютой можно использовать как встроенную функцию ЧислоПрописью(), так и экспортные методы подсистемы БСП, такие как ОбщегоНазначенияБПВызовСервера.СформироватьСуммуПрописью().
← На главную