В конфигурации 1С:Зарплата и управление персоналом 3.1 часто возникает задача вывести в печатную форму или отчет значение «реального оклада» сотрудника — для этого подойдёт конструктор печатных форм и отчетов для 1С:ЗУП. Под этим термином обычно подразумевается Фонд Оплаты Труда (ФОТ) — итоговая сумма всех плановых начислений с учетом занимаемой ставки. Например, если оклад по должности составляет 100 000 рублей, но сотрудник принят на 0.5 ставки, его ФОТ будет равен 50 000 рублей.
Сложность заключается в том, что в экранных формах документов «Прием на работу» или «Кадровый перевод» (поможет автоматическое формирование дополнительных соглашений в 1С:ЗУП) расчет этого значения часто выполняется на стороне клиента с использованием сложных алгоритмов. Разберем, как получить это же значение на сервере максимально эффективно и правильно с точки зрения архитектуры ЗУП.
Самый простой и рекомендуемый способ — использование экспортных функций типовых модулей. В ЗУП 3.1 существует мощный механизм получения кадровых данных, который оптимизирован для работы с большими массивами сотрудников. Для получения ФОТ идеально подходит функция КадровыйУчет.КадровыеДанныеСотрудников.
Рассмотрим пример кода, который позволяет получить ФОТ на определенную дату:
// Подготовим массив сотрудников и список нужных полей
МассивСотрудников = Новый Массив;
МассивСотрудников.Добавить(СсылкаНаСотрудника);
СписокПолей = "ФОТ"; // Можно добавить другие поля, например "Физлицо, Должность"
ДатаСреза = ТекущаяДата();
// Получаем таблицу данных
ТаблицаДанных = КадровыйУчет.КадровыеДанныеСотрудников(Истина, МассивСотрудников, СписокПолей, ДатаСреза);
Если ТаблицаДанных.Количество() > 0 Тогда
ТекущийФОТ = ТаблицаДанных[0].ФОТ;
// Используем полученное значение в печатной форме
КонецЕсли;
Этот метод хорош тем, что он автоматически учитывает все актуальные записи в регистрах и возвращает готовое числовое значение. Важно помнить: функция возвращает данные из регистров сведений, поэтому документ, установивший этот ФОТ, должен быть проведен.
Если вам необходимо получить данные запросом (например, для сложного отчета или при работе внутри СКД), следует обращаться к специализированным регистрам. В ЗУП 3.1 информация о ФОТ разделена:
Проанализируем ситуацию: для получения одной цифры «реального оклада» лучше использовать ПлановыйФОТИтоги. Разберем пример запроса:
ВЫБРАТЬ
ПлановыйФОТИтогиСрезПоследних.ФОТ КАК РеальныйОклад
ИЗ
РегистрСведений.ПлановыйФОТИтоги.СрезПоследних(&Период, Сотрудник = &Сотрудник) КАК ПлановыйФОТИтогиСрезПоследних
Однако прямое обращение к виртуальным таблицам СрезПоследних в сложных запросах может замедлять работу системы. Профессиональный подход подразумевает использование инструментов типовой конфигурации для создания временных таблиц.
Если ваша задача требует высокой производительности (например, формирование массовой печатной формы), воспользуйтесь методом создания временных таблиц среза последних. Это позволит системе эффективно обработать данные в памяти SQL-сервера.
Рассмотрим по шагам, как это реализовать в коде:
// 1. Создаем таблицу с отборами (сотрудники и даты)
СотрудникиДаты = Новый ТаблицаЗначений;
СотрудникиДаты.Колонки.Добавить("Сотрудник", Новый ОписаниеТипов("СправочникСсылка.Сотрудники"));
СотрудникиДаты.Колонки.Добавить("Период", Новый ОписаниеТипов("Дата"));
НоваяСтрока = СотрудникиДаты.Добавить();
НоваяСтрока.Сотрудник = НужныйСотрудник;
НоваяСтрока.Период = ДатаОтчета;
// 2. Инициализируем менеджер временных таблиц и запрос
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
// 3. Вызываем функцию формирования ВТ
ПараметрыПостроения = ЗарплатаКадрыОбщиеНаборыДанных.ПараметрыПостроенияДляСоздатьВТИмяРегистраСрез();
ЗарплатаКадрыОбщиеНаборыДанных.СоздатьВТИмяРегистраСрезПоследних(
"ПлановыйФОТИтоги",
Запрос.МенеджерВременныхТаблиц,
Истина,
ЗарплатаКадрыОбщиеНаборыДанных.ОписаниеФильтраДляСоздатьВТИмяРегистра(СотрудникиДаты, "Сотрудник"),
ПараметрыПостроения
);
// 4. Теперь данные доступны в ВТ "ВТПлановыйФОТИтогиСрезПоследних"
Запрос.Текст = "ВЫБРАТЬ ФОТ ИЗ ВТПлановыйФОТИтогиСрезПоследних";
Результат = Запрос.Выполнить().Выгрузить();
Бывают случаи, когда печатную форму нужно сформировать в еще не проведенном документе «Прием на работу» — для этой задачи есть печать трудовых договоров и соглашений по шаблонам. В этом случае данные в регистрах еще не появились или не обновились. Выясним причину: регистры обновляются только в момент проведения.
В такой ситуации данные нужно брать из табличной части Начисления самого документа. Каждая строка начисления содержит реквизит ВкладВФОТ. Сумма этих вкладов и составляет итоговый ФОТ.
Разберем алгоритм получения ФОТ из объекта документа:
Функция ПолучитьФОТИзОбъекта(ДокументОбъект) Экспорт
ИтоговыйФОТ = 0;
Для Каждого СтрокаНачисления Из ДокументОбъект.Начисления Цикл
// Суммируем вклад в ФОТ только тех строк, которые активны
ИтоговыйФОТ = ИтоговыйФОТ + СтрокаНачисления.ВкладВФОТ;
КонецЦикла;
Возврат ИтоговыйФОТ;
КонецФункции
Обратите внимание: если вы меняете показатели (например, сумму оклада) в форме, расчет ВкладВФОТ обычно происходит при изменении этих показателей. Если вы работаете программно, может потребоваться вызов типовой процедуры пересчета, такой как РассчитатьФОТ в модуле документа.
При работе с ФОТ в ЗУП 3.1 следует учитывать несколько критически важных факторов, которые могут влиять на результат:
ПлановыйФОТИтоги, ни в ВкладВФОТ. Для более глубокого изучения состава выплат можно использовать анализ начислений и удержаний по сотрудникам со страховыми взносами.Проанализировав вышеперечисленные способы, можно сделать вывод: для разовых печатных форм идеален Способ 1 через КадровыеДанныеСотрудников. Для сложных отчетов с большим объемом данных лучше использовать Способ 3 с временными таблицами. А для оперативной работы в формах документов — суммирование по табличной части Начисления. В итоговых сверках также поможет полный свод начислений, удержаний и выплат.