Разработка кадровых отчетов, содержащих информацию о стаже, — одна из классических задач при автоматизации HR-процессов на платформе 1С. Часто начинающие разработчики сталкиваются с тем, что данные о стаже либо выводятся некорректно, либо приводят к «размножению» строк отчета. Давайте разберем по шагам, как правильно настроить такой отчет.
Прежде чем приступать к настройке Системы компоновки данных (СКД), важно уяснить, как именно хранятся данные. В регистре СтажиФизическихЛиц нет готового «стажа на сегодня». Там хранится историческая запись: дата, на которую стаж был зафиксирован, и его длительность. Фактическое значение стажа на любую текущую дату рассчитывается динамически как разность между датой отчета и зафиксированной датой отсчета.
Если вы добавили данные о стаже в основной запрос к сотрудникам, вы неизбежно получите дублирование строк. Это происходит потому, что у одного сотрудника может быть несколько видов стажа (общий, страховой, северный и т.д.). В результате левого соединения к каждой строке сотрудника добавляется несколько записей из регистра.
Чтобы избежать этой ошибки, воспользуемся архитектурой СКД:
Представления_СтажиСотрудников.Сотрудник или ФизическоеЛицо.При использовании виртуальных таблиц вида Представления_... во внешних отчетах конфигурации ЗУП 3.1, вы можете столкнуться с тем, что отчет выдает ошибку или возвращает пустой результат. Это происходит из-за отсутствия программной инициализации механизмов 1С. Чтобы исправить это, в модуле объекта вашего отчета добавьте вызов метода в процедуру ПриКомпоновкеРезультата:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
ЗарплатаКадрыОбщиеНаборыДанных.ЗаполнитьОбщиеИсточникиДанныхОтчета(ЭтотОбъект);
КонецПроцедуры
Эта строка «подключает» внутренние алгоритмы ЗУП, которые знают, как правильно расшифровывать данные о стажах.
Частой ошибкой является попытка использования кода Запрос.УстановитьПараметр(). В СКД управление параметрами происходит через КомпоновщикНастроек. Если вам необходимо программно задать, например, дату отчета, используйте такой подход:
ПараметрПериод = Новый ПараметрКомпоновкиДанных("Период");
ЗначениеПараметра = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(ПараметрПериод);
Если ЗначениеПараметра <> Неопределено Тогда
ЗначениеПараметра.Значение = ТекущаяДата();
ЗначениеПараметра.Использование = Истина;
КонецЕсли;
Если вы хотите добиться максимальной точности без ручных манипуляций с датами в запросах (которые могут ошибаться при високосных годах или интервалах), используйте типовой функционал платформы. В общих модулях 1С, таких как КадровыйУчет, существуют функции типа ПолучитьДанныеОСтажахСотрудников().
Рекомендуем следующий алгоритм:
Это самый надежный путь, так как вы используете те же алгоритмы, что и стандартные отчеты фирмы «1С». При таком подходе вероятность ошибок в расчетах стажа практически исключена.