Как вывести виды стажа сотрудника во внешнем отчете СКД в 1С:ЗУП 3.1?

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

Разработка кадровых отчетов, содержащих информацию о стаже, — одна из классических задач при автоматизации HR-процессов на платформе 1С. Часто начинающие разработчики сталкиваются с тем, что данные о стаже либо выводятся некорректно, либо приводят к «размножению» строк отчета. Давайте разберем по шагам, как правильно настроить такой отчет.

Понимание логики регистра сведений «Стажи физических лиц»

Прежде чем приступать к настройке Системы компоновки данных (СКД), важно уяснить, как именно хранятся данные. В регистре СтажиФизическихЛиц нет готового «стажа на сегодня». Там хранится историческая запись: дата, на которую стаж был зафиксирован, и его длительность. Фактическое значение стажа на любую текущую дату рассчитывается динамически как разность между датой отчета и зафиксированной датой отсчета.

Решение проблемы дублирования строк

Если вы добавили данные о стаже в основной запрос к сотрудникам, вы неизбежно получите дублирование строк. Это происходит потому, что у одного сотрудника может быть несколько видов стажа (общий, страховой, северный и т.д.). В результате левого соединения к каждой строке сотрудника добавляется несколько записей из регистра.

Чтобы избежать этой ошибки, воспользуемся архитектурой СКД:

  1. Создайте два независимых набора данных. Первый — основной запрос по сотрудникам (ФИО, подразделение и т.д.). Второй — запрос к виртуальной таблице Представления_СтажиСотрудников.
  2. Перейдите на вкладку «Связи наборов данных». Установите связь по полю Сотрудник или ФизическоеЛицо.
  3. В настройках структуры отчета выведите стажи как подчиненную группировку внутри сотрудника. Благодаря этому основная информация о сотруднике будет выведена один раз, а виды стажа расположатся под ним в виде вложенного списка.

Инициализация общих наборов данных

При использовании виртуальных таблиц вида Представления_... во внешних отчетах конфигурации ЗУП 3.1, вы можете столкнуться с тем, что отчет выдает ошибку или возвращает пустой результат. Это происходит из-за отсутствия программной инициализации механизмов 1С. Чтобы исправить это, в модуле объекта вашего отчета добавьте вызов метода в процедуру ПриКомпоновкеРезультата:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    ЗарплатаКадрыОбщиеНаборыДанных.ЗаполнитьОбщиеИсточникиДанныхОтчета(ЭтотОбъект);
КонецПроцедуры

Эта строка «подключает» внутренние алгоритмы ЗУП, которые знают, как правильно расшифровывать данные о стажах.

Работа с параметрами в СКД

Частой ошибкой является попытка использования кода Запрос.УстановитьПараметр(). В СКД управление параметрами происходит через КомпоновщикНастроек. Если вам необходимо программно задать, например, дату отчета, используйте такой подход:


ПараметрПериод = Новый ПараметрКомпоновкиДанных("Период");
ЗначениеПараметра = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(ПараметрПериод);
Если ЗначениеПараметра <> Неопределено Тогда
    ЗначениеПараметра.Значение = ТекущаяДата();
    ЗначениеПараметра.Использование = Истина;
КонецЕсли;

Альтернативный способ: использование объектных методов

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

Рекомендуем следующий алгоритм:

  1. Сформируйте таблицу сотрудников в коде модуля отчета.
  2. Передайте её в функцию расчета стажа типового модуля.
  3. Полученную таблицу значений используйте как «Набор данных — Объект» в СКД.

Это самый надежный путь, так как вы используете те же алгоритмы, что и стандартные отчеты фирмы «1С». При таком подходе вероятность ошибок в расчетах стажа практически исключена.

← На главную