Как в типовом отчете по зарплате настроить отбор по сотрудникам, у которых есть определенное начисление?

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

В процессе работы с программами на платформе «1С:Предприятие 8.3» (такими как «1С:Зарплата и управление персоналом 3.1», «1С:ERP Управление предприятием 2.5» или «1С:Комплексная автоматизация 2.5») пользователи часто сталкиваются с необходимостью кастомизации стандартных отчетов. Типичный пример — отчет «Полный свод начислений, удержаний и выплат» (который по сути является одним из вариантов отчета «Анализ зарплаты по сотрудникам»).

Задача состоит в следующем: необходимо сформировать сводный отчет по начислениям компании, но исключить из него все данные тех сотрудников, у которых за отчетный период отсутствует определенное начисление (например, Оклад). При этом сам отчет должен оставаться сводным — то есть детальные строки по сотрудникам выводиться не должны, а общие суммы (например, по районному коэффициенту, северной надбавке или премиям) должны рассчитываться только по «окладникам».

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

В чем заключается техническая сложность в СКД?

Давайте проанализируем ситуацию. В регистре расчета начисления хранятся построчно по каждому сотруднику и каждому виду расчета. Например, у сотрудника Иванова за май есть три строки начислений:

  1. Оклад — 50 000 руб.
  2. Районный коэффициент — 10 000 руб.
  3. Северная надбавка — 15 000 руб.

У сотрудника Петрова за этот же период есть только две строки:

  1. Северная надбавка — 12 000 руб.
  2. Премия — 5 000 руб.

Если мы установим обычный отбор на уровне отчета с условием Вид расчета Равно Оклад, то СКД просто отсечет все строки, где вид расчета не равен окладу. В результате в отчет попадет только строка Иванова с окладом 50 000 руб. Его же районный коэффициент и северная надбавка будут отброшены, а Петров пропадет из отчета полностью. Мы получим отчет, состоящий только из одной строки «Оклад».

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

Выясним, какими способами можно решить эту задачу.

Способ 1. Использование механизма «Группы сотрудников» (Штатный обходной путь)

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

Разберем процесс настройки по шагам:

  1. Перейдем в раздел Кадры (или Настройки) — Группы сотрудников.
  2. Создадим новую группу и назовем ее, например, «Сотрудники на окладе».
  3. Настроим заполнение группы:
    • Если в компании оклад привязан к конкретным подразделениям или должностям, мы можем настроить **автоматическое заполнение** группы по этим критериям.
    • Если состав сотрудников меняется динамически, мы можем раз в месяц сформировать простой детальный отчет «Анализ зарплаты» с отбором по виду расчета Оклад, скопировать полученный список сотрудников в буфер обмена и вставить его в нашу группу через кнопку Подбор — Вставить из буфера обмена.
  4. В самом отчете «Полный свод начислений, удержаний и выплат» откроем панель настроек и добавим отбор:
    Сотрудник В группе "Сотрудники на окладе".

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

Способ 2. Использование дополнительных реквизитов

Если наличие или отсутствие оклада определяется кадровыми условиями или свойствами самого сотрудника, мы можем задействовать механизм дополнительных реквизитов, которые СКД умеет читать напрямую из базы данных.

Рассмотрим порядок действий:

  1. В режиме «1С:Предприятие» перейдем в раздел Администрирование — Общие настройки — Дополнительные реквизиты и сведения.
  2. Для справочника Сотрудники (или Физические лица) добавим новый дополнительный реквизит с типом значения Булево (Да/Нет) и назовем его, например, СпособОплатыОклад.
  3. В карточках сотрудников, которые должны попадать в отчет, установим этот флаг в значение Да.
  4. Откроем отчет «Полный свод...», перейдем в настройки (вкладка Фильтры или в расширенных настройках на вкладку Отбор).
  5. Добавим новый отбор. В окне выбора поля раскроем поле Сотрудник, найдем в списке наш дополнительный реквизит СпособОплатыОклад (Сотрудники) и установим условие:
    Сотрудник.СпособОплатыОклад Равно Да.

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

Способ 3. Настройка отбора на уровне скрытой группировки в СКД

Этот метод представляет собой продвинутую настройку компоновки данных. Он позволяет решить задачу внутри СКД без изменения кода конфигурации, используя отборы на уровне группировок.

Выполним настройку по шагам:

  1. В форме отчета нажмем кнопку Еще — Прочие — Изменить вариант отчета....
  2. В открывшемся окне настройки структуры нам необходимо изменить иерархию. По умолчанию сводный отчет не содержит группировки по сотрудникам. Мы добавим группировку Сотрудник на самый верхний уровень, а уже внутрь нее перенесем всю существующую структуру таблиц свода.
  3. Выделим созданную группировку Сотрудник и перейдем на вкладку Отбор в нижней части окна (обратите внимание: это должен быть отбор именно для этой конкретной группировки, а не общий отбор отчета).
  4. Для реализации отбора нам понадобится «Пользовательское поле». Создадим новое пользовательское поле-выражение с именем ЕстьОклад. В поле выражения детальных записей пропишем условие:
    
    Выбор 
        Когда ВидРасчета = Значение(ПланВидовРасчета.Начисления.Оклад) 
            Тогда 1 
        Иначе 0 
    Конец
    
  5. В отборе группировки Сотрудник установим условие:
    Сумма(ЕстьОклад) Больше 0. Это отсечет тех сотрудников, у которых за период нет ни одной строки с окладом.
  6. Чтобы отчет визуально оставался сводным и не содержал детальных строк по каждому сотруднику, выделим группировку Сотрудник, перейдем на вкладку Параметры вывода и для свойства Расположение группировок укажем значение Нет.

При таком подходе СКД произведет внутреннюю группировку и фильтрацию данных по сотрудникам в оперативной памяти, но на экран выведет только сгруппированные по видам расчета суммы, исключив «черный список» сотрудников.

Способ 4. Программная доработка через расширение (Решение для разработчика)

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

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


ВЫБРАТЬ РАЗЛИЧНЫЕ
    РегистрНачисления.Сотрудник КАК Сотрудник
ПОМЕСТИТЬ ВТ_СотрудникиСОтбором
ИЗ
    РегистрРасчета.Начисления КАК РегистрНачисления
ГДЕ
    РегистрНачисления.ПериодРегистрации МЕЖДУ &НачалоПериода И &КонецПериода
    И РегистрНачисления.ВидРасчета = &ВыбранныйВидРасчета
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ОсновнаяТаблица.ВидРасчета КАК ВидРасчета,
    ОсновнаяТаблица.Сотрудник КАК Сотрудник,
    СУММА(ОсновнаяТаблица.Результат) КАК Результат
ИЗ
    РегистрРасчета.Начисления КАК ОсновнаяТаблица
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_СотрудникиСОтбором КАК ФильтрСотрудников
        ПО ОсновнаяТаблица.Сотрудник = ФильтрСотрудников.Сотрудник
ГДЕ
    ОсновнаяТаблица.ПериодРегистрации МЕЖДУ &НачалоПериода И &КонецПериода
ГРУППИРОВАТЬ ПО
    ОсновнаяТаблица.ВидРасчета,
    ОсновнаяТаблица.Сотрудник

В этом запросе мы сначала во временную таблицу ВТ_СотрудникиСОтбором выбираем только тех сотрудников, у которых за указанный период расчета есть запись с нужным видом расчета (передается через параметр &ВыбранныйВидРасчета). Затем с помощью ВНУТРЕННЕЕ СОЕДИНЕНИЕ мы отсекаем всех остальных сотрудников из выборки основного пакета данных.

Параметр &ВыбранныйВидРасчета выводится на форму отчета в область быстрых настроек, что позволяет пользователю в один клик менять фильтрующее начисление.

Резюме

Мы подробно рассмотрели четыре различных подхода к решению сложной задачи фильтрации в СКД. Для большинства пользователей оптимальным и самым быстрым решением без программирования станет Способ 1 (Группы сотрудников) или Способ 2 (Дополнительные реквизиты). Если же требуется полная динамика и автоматический расчет «на лету» без ручных действий со справочниками, рекомендуется использовать Способ 3 (Отборы на уровне группировок СКД) или полноценную программную доработку запроса через расширение конфигурации (Способ 4).

← На главную