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

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

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

Разберем структуру табличных частей документа в ЗУП 3.1

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

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

Сформируем правильный запрос к табличным частям

Проанализируем ситуацию и составим запрос, который корректно объединит данные из обеих табличных частей. Для начала поместим данные о начислениях во временную таблицу, а затем присоединим к ней значения показателей.

Рассмотрим рабочий пример кода:


ВЫБРАТЬ
    КадровыйПереводНачисления.Начисление КАК Начисление,
    КадровыйПереводНачисления.Действие КАК Действие,
    КадровыйПереводНачисления.ИдентификаторСтрокиВидаРасчета КАК ИдентификаторСтрокиВидаРасчета,
    НачисленияПоказатели.Показатель КАК Показатель,
    КадровыйПереводНачисления.Ссылка КАК Ссылка
ПОМЕСТИТЬ ВТ_НачисленияИОсновныеПоказатели
ИЗ
    Документ.КадровыйПеревод.Начисления КАК КадровыйПереводНачисления
        ЛЕВОЕ СОЕДИНЕНИЕ ПланВидовРасчета.Начисления.Показатели КАК НачисленияПоказатели
        ПО КадровыйПереводНачисления.Начисление = НачисленияПоказатели.Ссылка
            И (НачисленияПоказатели.ОсновнойПоказатель)
ГДЕ
    КадровыйПереводНачисления.Ссылка = &Ссылка
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_НачисленияИОсновныеПоказатели.Начисление КАК Начисление,
    ВТ_НачисленияИОсновныеПоказатели.Действие КАК Действие,
    ВТ_НачисленияИОсновныеПоказатели.Показатель КАК Показатель,
    ЕСТЬNULL(КадровыйПереводПоказатели.Значение, 0) КАК Значение
ИЗ
    ВТ_НачисленияИОсновныеПоказатели КАК ВТ_НачисленияИОсновныеПоказатели
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.КадровыйПеревод.Показатели КАК КадровыйПереводПоказатели
        ПО ВТ_НачисленияИОсновныеПоказатели.ИдентификаторСтрокиВидаРасчета = КадровыйПереводПоказатели.ИдентификаторСтрокиВидаРасчета
            И ВТ_НачисленияИОсновныеПоказатели.Ссылка = КадровыйПереводПоказатели.Ссылка
            И ВТ_НачисленияИОсновныеПоказатели.Показатель = КадровыйПереводПоказатели.Показатель

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

Настроим фильтр по действию с начислением

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

Применим правильный подход и обратимся к значению перечисления через функцию ЗНАЧЕНИЕ(). Если мы хотим получить все начисления, кроме отмененных, добавим следующее условие в секцию ГДЕ нашего запроса:


ГДЕ 
    ВТ_НачисленияИОсновныеПоказатели.Действие <> ЗНАЧЕНИЕ(Перечисление.ДействияСНачислениямиИУдержаниями.Отменить)

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

  1. Утвердить — начисление назначается сотруднику впервые (или заново после отмены).
  2. Изменить — начисление уже действовало ранее, но текущим документом меняется размер его показателя (например, повышается оклад).
  3. НеИзменять — начисление продолжает действовать в прежнем размере, но для наглядности выводится в интерфейсе кадрового документа.

Если вам нужны только новые или измененные условия труда, целесообразно фильтровать записи так, чтобы исключить не только отмененные, но и те, где действие установлено как НеИзменять.

Альтернативный подход: лучшие практики работы с ЗУП 3.1

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

Для получения актуальных данных в ЗУП 3.1 рекомендуется использовать виртуальные таблицы регистров сведений:

Кроме того, разработчики 1С предоставляют мощный программный интерфейс (API). Вместо написания сложных многоэтажных запросов мы можем использовать готовые функции. Например, для получения действующих плановых начислений и их показателей на заданную дату оптимально применять функции из общего модуля КадровыйУчетРасширенный, такие как ТекущиеНачисленияСотрудника(). Эти функции под капотом сами правильно собирают данные из всех необходимых регистров, учитывая все кадровые движения.

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

← На главную