Как в ЗУП 3.1 программно получить реальный оклад (ФОТ) сотрудника на сервере?

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

В конфигурации 1С:Зарплата и управление персоналом 3.1 часто возникает задача вывести в печатную форму или отчет значение «реального оклада» сотрудника — для этого подойдёт конструктор печатных форм и отчетов для 1С:ЗУП. Под этим термином обычно подразумевается Фонд Оплаты Труда (ФОТ) — итоговая сумма всех плановых начислений с учетом занимаемой ставки. Например, если оклад по должности составляет 100 000 рублей, но сотрудник принят на 0.5 ставки, его ФОТ будет равен 50 000 рублей.

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

Способ 1: Использование типового программного интерфейса (API)

Самый простой и рекомендуемый способ — использование экспортных функций типовых модулей. В ЗУП 3.1 существует мощный механизм получения кадровых данных, который оптимизирован для работы с большими массивами сотрудников. Для получения ФОТ идеально подходит функция КадровыйУчет.КадровыеДанныеСотрудников.

Рассмотрим пример кода, который позволяет получить ФОТ на определенную дату:


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

СписокПолей = "ФОТ"; // Можно добавить другие поля, например "Физлицо, Должность"
ДатаСреза = ТекущаяДата();

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

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

Этот метод хорош тем, что он автоматически учитывает все актуальные записи в регистрах и возвращает готовое числовое значение. Важно помнить: функция возвращает данные из регистров сведений, поэтому документ, установивший этот ФОТ, должен быть проведен.

Способ 2: Получение данных через регистр «Плановый ФОТ итоги»

Если вам необходимо получить данные запросом (например, для сложного отчета или при работе внутри СКД), следует обращаться к специализированным регистрам. В ЗУП 3.1 информация о ФОТ разделена:

  1. Регистр сведений «Плановый ФОТ» — хранит детализацию в разрезе каждого начисления (оклад, надбавки, премии), аналогично тому, как выводятся плановые начисления сотрудников в специализированных отчетах.
  2. Регистр сведений «Плановый ФОТ итоги» — хранит уже агрегированную сумму по всем плановым начислениям сотрудника.

Проанализируем ситуацию: для получения одной цифры «реального оклада» лучше использовать ПлановыйФОТИтоги. Разберем пример запроса:


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

Однако прямое обращение к виртуальным таблицам СрезПоследних в сложных запросах может замедлять работу системы. Профессиональный подход подразумевает использование инструментов типовой конфигурации для создания временных таблиц.

Способ 3: Оптимизированное получение данных через временные таблицы

Если ваша задача требует высокой производительности (например, формирование массовой печатной формы), воспользуйтесь методом создания временных таблиц среза последних. Это позволит системе эффективно обработать данные в памяти SQL-сервера.

Рассмотрим по шагам, как это реализовать в коде:


// 1. Создаем таблицу с отборами (сотрудники и даты)
СотрудникиДаты = Новый ТаблицаЗначений;
СотрудникиДаты.Колонки.Добавить("Сотрудник", Новый ОписаниеТипов("СправочникСсылка.Сотрудники"));
СотрудникиДаты.Колонки.Добавить("Период", Новый ОписаниеТипов("Дата"));

НоваяСтрока = СотрудникиДаты.Добавить();
НоваяСтрока.Сотрудник = НужныйСотрудник;
НоваяСтрока.Период = ДатаОтчета;

// 2. Инициализируем менеджер временных таблиц и запрос
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;

// 3. Вызываем функцию формирования ВТ
ПараметрыПостроения = ЗарплатаКадрыОбщиеНаборыДанных.ПараметрыПостроенияДляСоздатьВТИмяРегистраСрез();
ЗарплатаКадрыОбщиеНаборыДанных.СоздатьВТИмяРегистраСрезПоследних(
    "ПлановыйФОТИтоги", 
    Запрос.МенеджерВременныхТаблиц, 
    Истина, 
    ЗарплатаКадрыОбщиеНаборыДанных.ОписаниеФильтраДляСоздатьВТИмяРегистра(СотрудникиДаты, "Сотрудник"), 
    ПараметрыПостроения
);

// 4. Теперь данные доступны в ВТ "ВТПлановыйФОТИтогиСрезПоследних"
Запрос.Текст = "ВЫБРАТЬ ФОТ ИЗ ВТПлановыйФОТИтогиСрезПоследних";
Результат = Запрос.Выполнить().Выгрузить();

Способ 4: Получение ФОТ из объекта документа (до проведения)

Бывают случаи, когда печатную форму нужно сформировать в еще не проведенном документе «Прием на работу» — для этой задачи есть печать трудовых договоров и соглашений по шаблонам. В этом случае данные в регистрах еще не появились или не обновились. Выясним причину: регистры обновляются только в момент проведения.

В такой ситуации данные нужно брать из табличной части Начисления самого документа. Каждая строка начисления содержит реквизит ВкладВФОТ. Сумма этих вкладов и составляет итоговый ФОТ.

Разберем алгоритм получения ФОТ из объекта документа:


Функция ПолучитьФОТИзОбъекта(ДокументОбъект) Экспорт
    ИтоговыйФОТ = 0;
    Для Каждого СтрокаНачисления Из ДокументОбъект.Начисления Цикл
        // Суммируем вклад в ФОТ только тех строк, которые активны
        ИтоговыйФОТ = ИтоговыйФОТ + СтрокаНачисления.ВкладВФОТ;
    КонецЦикла;
    Возврат ИтоговыйФОТ;
КонецФункции

Обратите внимание: если вы меняете показатели (например, сумму оклада) в форме, расчет ВкладВФОТ обычно происходит при изменении этих показателей. Если вы работаете программно, может потребоваться вызов типовой процедуры пересчета, такой как РассчитатьФОТ в модуле документа.

Важные технические нюансы

При работе с ФОТ в ЗУП 3.1 следует учитывать несколько критически важных факторов, которые могут влиять на результат:

Проанализировав вышеперечисленные способы, можно сделать вывод: для разовых печатных форм идеален Способ 1 через КадровыеДанныеСотрудников. Для сложных отчетов с большим объемом данных лучше использовать Способ 3 с временными таблицами. А для оперативной работы в формах документов — суммирование по табличной части Начисления. В итоговых сверках также поможет полный свод начислений, удержаний и выплат.

← На главную