Как в 1С:ЗУП 3.1 получить периодические показатели расчета зарплаты для отчета на СКД?

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

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

Анализ архитектуры хранения показателей

Для начала проанализируем, где именно система хранит значения показателей. В современных версиях ЗУП 3.1 (начиная с версии 3.1.3) реализована концепция интервальных регистров. В отличие от обычных регистров сведений, где фиксируется только момент изменения данных, интервальные регистры хранят уже готовые периоды действия того или иного значения.

Ключевым объектом для нашей задачи является регистр сведений ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудниковИнтервальный. Рассмотрим его структуру подробнее:

Использование этого регистра значительно упрощает построение запросов в Системе компоновки данных (СКД). Нам больше не нужно строить сложные вложенные запросы для поиска "среза последних" на каждую дату. Достаточно наложить условие, что интересующая нас дата (например, дата отчета) входит в интервал между ДатаНачала и ДатаОкончания.

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

Если нам необходимо получить таблицу значений с показателями программно (например, для последующей передачи в набор данных "Объект" в СКД), следует обратиться к общим модулям конфигурации. Рассмотрим функцию, упомянутую экспертами:


// Пример получения таблицы значений с показателями
Результат = ЗарплатаКадрыРасширенный.ЗначенияПоказателейДействующихНачисленийСотрудников(СотрудникиДаты);

Этот метод удобен, если нужно получить данные "здесь и сейчас" в коде. Однако для тяжелых отчетов с большим количеством колонок (например, 89 колонок, как в запросе автора темы) такой подход может быть избыточным из-за необходимости объединять наборы данных в памяти.

Способ 2: Работа с временными таблицами в СКД

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

Мы можем использовать функцию РасчетЗарплатыРасширенный.СоздатьВТЗначенийПоказателейДляРасчетаЗарплаты. Этот метод позволяет создать временную таблицу в контексте выполнения запроса. Выполним следующие шаги:

  1. В модуле объекта отчета переопределим процедуру ПриКомпоновкеРезультата.
  2. Вызовем программное формирование временной таблицы с показателями.
  3. Передадим МенеджерВременныхТаблиц в ПроцессорКомпоновкиДанных.

В тексте запроса СКД мы можем обращаться к этой таблице как к существующей, например:


ВЫБРАТЬ
    ВТ_Показатели.Сотрудник,
    ВТ_Показатели.Показатель,
    ВТ_Показатели.Значение
ИЗ
    ВТ_Показатели КАК ВТ_Показатели

Система автоматически подставит данные из менеджера временных таблиц при выполнении компоновки.

Способ 3: Прямое обращение к интервальным регистрам в СКД

Посмотрим на ситуацию со стороны производительности. Если отчет строится на конкретную дату, самый надежный и простой способ — прямое соединение с интервальным регистром в схеме компоновки. Рассмотрим пример построения запроса:


ВЫБРАТЬ
    Сотрудники.Ссылка КАК Сотрудник,
    Показатели.Значение КАК Оклад
ИЗ
    Справочник.Сотрудники КАК Сотрудники
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудниковИнтервальный КАК Показатели
        ПО Сотрудники.Ссылка = Показатели.Сотрудник
        И Показатели.Показатель = &ПоказательОклад
        И &ДатаОтчета МЕЖДУ Показатели.ДатаНачала И Показатели.ДатаОкончания
ГДЕ
    Сотрудники.ВАрхиве = ЛОЖЬ

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

Разворачивание показателей в колонки (Динамика)

Поскольку показателей может быть много (Оклад, Премия, Надбавка и т.д.), прописывать каждый из них отдельной колонкой в запросе нерационально. Проанализируем, как это реализовано в типовых отчетах, таких как ИсторияИзмененийОплатыТруда.

Рекомендуем использовать механизм "Таблица" в настройках СКД:

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

Оптимизация и решение проблемы "пустышек"

Выясним причину возможных расхождений. Иногда показатель может быть назначен в плановом порядке (через приказ), а иногда — разово. Регистр ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудниковИнтервальный хранит именно плановые показатели. Если вам нужно видеть значения в связке с конкретными видами расчета (например, какой оклад соответствует начислению "Оклад по дням"), лучше использовать регистр ПлановыеНачисленияИнтервальный.

Важные советы:

Таким образом, комбинируя работу с интервальными регистрами и программными функциями общего модуля ЗарплатаКадрыРасширенный, можно создать гибкий и производительный отчет любой сложности для нужд кадровой службы или бухгалтерии.

← На главную