В процессе работы с программами на платформе «1С:Предприятие 8.3» (такими как «1С:Зарплата и управление персоналом 3.1», «1С:ERP Управление предприятием 2.5» или «1С:Комплексная автоматизация 2.5») пользователи часто сталкиваются с необходимостью кастомизации стандартных отчетов. Типичный пример — отчет «Полный свод начислений, удержаний и выплат» (который по сути является одним из вариантов отчета «Анализ зарплаты по сотрудникам»).
Задача состоит в следующем: необходимо сформировать сводный отчет по начислениям компании, но исключить из него все данные тех сотрудников, у которых за отчетный период отсутствует определенное начисление (например, Оклад). При этом сам отчет должен оставаться сводным — то есть детальные строки по сотрудникам выводиться не должны, а общие суммы (например, по районному коэффициенту, северной надбавке или премиям) должны рассчитываться только по «окладникам».
В этой статье мы подробно разберем, почему стандартный отбор «в лоб» не работает, проанализируем техническую сложность архитектуры СКД (Системы компоновки данных) и рассмотрим несколько эффективных способов решения этой задачи как стандартными средствами настройки, так и с помощью программной доработки.
Давайте проанализируем ситуацию. В регистре расчета начисления хранятся построчно по каждому сотруднику и каждому виду расчета. Например, у сотрудника Иванова за май есть три строки начислений:
Оклад — 50 000 руб.Районный коэффициент — 10 000 руб.Северная надбавка — 15 000 руб.У сотрудника Петрова за этот же период есть только две строки:
Северная надбавка — 12 000 руб.Премия — 5 000 руб.Если мы установим обычный отбор на уровне отчета с условием Вид расчета Равно Оклад, то СКД просто отсечет все строки, где вид расчета не равен окладу. В результате в отчет попадет только строка Иванова с окладом 50 000 руб. Его же районный коэффициент и северная надбавка будут отброшены, а Петров пропадет из отчета полностью. Мы получим отчет, состоящий только из одной строки «Оклад».
Нам же требуется получить так называемое полусоединение: сначала отобрать список сотрудников, у которых за период есть запись по виду расчета Оклад, а затем для этих сотрудников вывести абсолютно все их начисления, проигнорировав начисления тех, у кого оклада в периоде не было.
Выясним, какими способами можно решить эту задачу.
Это самый простой и надежный практический способ, не требующий изменения конфигурации или сложных манипуляций с СКД. Он отлично подходит, если состав сотрудников с окладом относительно стабилен или его можно легко определить по кадровым критериям.
Разберем процесс настройки по шагам:
Оклад, скопировать полученный список сотрудников в буфер обмена и вставить его в нашу группу через кнопку Подбор — Вставить из буфера обмена.Сотрудник В группе "Сотрудники на окладе".Преимущества метода: Отчет остается полностью типовым, его структура не меняется, а расчет итогов происходит корректно и быстро.
Если наличие или отсутствие оклада определяется кадровыми условиями или свойствами самого сотрудника, мы можем задействовать механизм дополнительных реквизитов, которые СКД умеет читать напрямую из базы данных.
Рассмотрим порядок действий:
Сотрудники (или Физические лица) добавим новый дополнительный реквизит с типом значения Булево (Да/Нет) и назовем его, например, СпособОплатыОклад.Да.Сотрудник, найдем в списке наш дополнительный реквизит СпособОплатыОклад (Сотрудники) и установим условие: Сотрудник.СпособОплатыОклад Равно Да.Этот способ позволяет автоматически фильтровать данные при формировании отчета без необходимости ежемесячного ручного обновления списков.
Этот метод представляет собой продвинутую настройку компоновки данных. Он позволяет решить задачу внутри СКД без изменения кода конфигурации, используя отборы на уровне группировок.
Выполним настройку по шагам:
Сотрудник на самый верхний уровень, а уже внутрь нее перенесем всю существующую структуру таблиц свода.Сотрудник и перейдем на вкладку Отбор в нижней части окна (обратите внимание: это должен быть отбор именно для этой конкретной группировки, а не общий отбор отчета).ЕстьОклад. В поле выражения детальных записей пропишем условие:
Выбор
Когда ВидРасчета = Значение(ПланВидовРасчета.Начисления.Оклад)
Тогда 1
Иначе 0
Конец
Сотрудник установим условие: Сумма(ЕстьОклад) Больше 0. Это отсечет тех сотрудников, у которых за период нет ни одной строки с окладом.Сотрудник, перейдем на вкладку Параметры вывода и для свойства Расположение группировок укажем значение Нет.При таком подходе СКД произведет внутреннюю группировку и фильтрацию данных по сотрудникам в оперативной памяти, но на экран выведет только сгруппированные по видам расчета суммы, исключив «черный список» сотрудников.
Если клиенту требуется максимально автоматизированное решение, где он может прямо на форме отчета выбирать любое начисление в качестве фильтра, стандартных возможностей настройки СКД будет недостаточно. В этом случае программисту необходимо разработать расширение конфигурации и модифицировать запрос схемы компоновки данных отчета.
Проанализируем пример схемы модификации запроса. Нам нужно добавить левое соединение или подзапрос по регистру расчета начислений. Создадим в расширении собственную схему компоновки данных для отчета:
ВЫБРАТЬ РАЗЛИЧНЫЕ
РегистрНачисления.Сотрудник КАК Сотрудник
ПОМЕСТИТЬ ВТ_СотрудникиСОтбором
ИЗ
РегистрРасчета.Начисления КАК РегистрНачисления
ГДЕ
РегистрНачисления.ПериодРегистрации МЕЖДУ &НачалоПериода И &КонецПериода
И РегистрНачисления.ВидРасчета = &ВыбранныйВидРасчета
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ОсновнаяТаблица.ВидРасчета КАК ВидРасчета,
ОсновнаяТаблица.Сотрудник КАК Сотрудник,
СУММА(ОсновнаяТаблица.Результат) КАК Результат
ИЗ
РегистрРасчета.Начисления КАК ОсновнаяТаблица
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_СотрудникиСОтбором КАК ФильтрСотрудников
ПО ОсновнаяТаблица.Сотрудник = ФильтрСотрудников.Сотрудник
ГДЕ
ОсновнаяТаблица.ПериодРегистрации МЕЖДУ &НачалоПериода И &КонецПериода
ГРУППИРОВАТЬ ПО
ОсновнаяТаблица.ВидРасчета,
ОсновнаяТаблица.Сотрудник
В этом запросе мы сначала во временную таблицу ВТ_СотрудникиСОтбором выбираем только тех сотрудников, у которых за указанный период расчета есть запись с нужным видом расчета (передается через параметр &ВыбранныйВидРасчета). Затем с помощью ВНУТРЕННЕЕ СОЕДИНЕНИЕ мы отсекаем всех остальных сотрудников из выборки основного пакета данных.
Параметр &ВыбранныйВидРасчета выводится на форму отчета в область быстрых настроек, что позволяет пользователю в один клик менять фильтрующее начисление.
Мы подробно рассмотрели четыре различных подхода к решению сложной задачи фильтрации в СКД. Для большинства пользователей оптимальным и самым быстрым решением без программирования станет Способ 1 (Группы сотрудников) или Способ 2 (Дополнительные реквизиты). Если же требуется полная динамика и автоматический расчет «на лету» без ручных действий со справочниками, рекомендуется использовать Способ 3 (Отборы на уровне группировок СКД) или полноценную программную доработку запроса через расширение конфигурации (Способ 4).