При разработке отчетов в Система Компоновки Данных (СКД) или создании произвольных запросов в программных продуктах «1С:Зарплата и Управление Персоналом» (редакция 3.1) разработчики часто сталкиваются с задачей детализации расчета удержаний. В частности, требуется получить не просто итоговые суммы удержаний по исполнительным листам, но и входящую расчетную базу, а также исчисленный с нее НДФЛ по конкретным сотрудникам или физическим лицам.
В этой статье мы подробно разберем, как устроена связь между регистрами удержаний, проанализируем распространенные ошибки при написании запросов, рассмотрим правильный вариант соединения таблиц и изучим альтернативные штатные способы получения расчетной базы в ЗУП 3.1.
Чтобы понять принцип построения запроса, разберем структуру двух ключевых регистров, участвующих в расчете удержаний:
Удержания: хранит итоговые результаты расчета удержаний сотрудников. Каждая запись содержит информацию о сотруднике, физическом лице, виде расчета, периоде регистрации, документе-регистраторе, а также важный реквизит (или измерение) ИдентификаторСтроки.ЗначенияПоказателейУдержаний: является промежуточным регистром, в котором хранятся значения показателей, участвующих в формулах удержаний (например, «Расчетная база исполнительного листа» или «Исчисленный по исполнительному листу НДФЛ»). Измерениями регистра выступают РегистраторИзмерение, ИдентификаторСтроки и Показатель.Главный нюанс заключается в том, что в одном документе начисления (например, в документе Начисление зарплаты и взносов) может присутствовать сразу несколько сотрудников. Более того, у одного сотрудника может быть зафиксировано несколько исполнительных листов. Для того чтобы система «понимала», какое конкретно значение показателя относится к определенной строке расчетного листка, используется унікальный ключ — ИдентификаторСтроки.
Рассмотрим распространенную ошибку, с которой сталкиваются начинающие разработчики. В исходном запросе соединение таблиц часто записывают следующим образом:
ПО (ВложенныйЗапрос.РегистраторИзмерение = ВложенныйЗапрос1.Регистратор)
Проанализируем, к чему приводит такой подход. Если в документе начисления записано 10 строк удержаний по разным сотрудникам или исполнительным документам, соединение только по полю Регистратор свяжет каждую строку показателей со всеми 10 строками регистра расчета. В результате происходит декартово произведение (задвоение и размножение строк), а итоговые суммы в отчете становятся неверными.
Вторая распространенная ошибка — обращение к справочнику ПоказателиРасчетаЗарплаты по текстовому наименованию:
ВЫБОР
КОГДА ЗначенияПоказателейУдержаний.Показатель.Наименование = "Исчисленный по исполнительному листу НДФЛ"
ТОГДА ЗначенияПоказателейУдержаний.Значение
КОНЕЦ
Выясним причину, почему так делать не рекомендуется:
Разберем по шагам, как написать корректный запрос для связывания таблиц.
Шаг 1. Сгруппируем показатели из регистра сведений ЗначенияПоказателейУдержаний по полям РегистраторИзмерение и ИдентификаторСтроки. Для проверки показателей используем системную функцию ЗНАЧЕНИЕ(...).
Шаг 2. Подготовим выборку из регистра расчета Удержания с отбором по физическому лицу и периоду регистрации.
Шаг 3. Выполним ЛЕВОЕ СОЕДИНЕНИЕ по двум обязательным полям: по регистратору И по полю ИдентификаторСтроки.
Рассмотрим готовый пример правильного текста запроса:
ВЫБРАТЬ
ВложенныйЗапросПоказатели.РегистраторИзмерение КАК Регистратор,
ВложенныйЗапросПоказатели.ИдентификаторСтроки КАК ИдентификаторСтроки,
ВложенныйЗапросУдержания.ФизическоеЛицо КАК ФизическоеЛицо,
ВложенныйЗапросПоказатели.НДФЛ КАК НДФЛ,
ВложенныйЗапросПоказатели.Начислено КАК Начислено
ИЗ
(ВЫБРАТЬ
ЗначенияПоказателей.РегистраторИзмерение КАК РегистраторИзмерение,
ЗначенияПоказателей.ИдентификаторСтроки КАК ИдентификаторСтроки,
СУММА(ВЫБОР
КОГДА ЗначенияПоказателей.Показатель = ЗНАЧЕНИЕ(Справочник.ПоказателиРасчетаЗарплаты.ИсчисленныйПоИсполнительномуЛистуНДФЛ)
ТОГДА ЗначенияПоказателей.Значение
ИНАЧЕ 0
КОНЕЦ) КАК НДФЛ,
СУММА(ВЫБОР
КОГДА ЗначенияПоказателей.Показатель = ЗНАЧЕНИЕ(Справочник.ПоказателиРасчетаЗарплаты.РасчетнаяБазаИсполнительногоЛиста)
ТОГДА ЗначенияПоказателей.Значение
ИНАЧЕ 0
КОНЕЦ) КАК Начислено
ИЗ
РегистрСведений.ЗначенияПоказателейУдержаний КАК ЗначенияПоказателей
СГРУППИРОВАТЬ ПО
ЗначенияПоказателей.РегистраторИзмерение,
ЗначенияПоказателей.ИдентификаторСтроки) КАК ВложенныйЗапросПоказатели
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
Удержания.Регистратор КАК Регистратор,
Удержания.ИдентификаторСтроки КАК ИдентификаторСтроки,
Удержания.ФизическоеЛицо КАК ФизическоеЛицо
ИЗ
РегистрРасчета.Удержания КАК Удержания
ГДЕ
Удержания.ПериодРегистрации = &ПериодРегистрации
И Удержания.ФизическоеЛицо = &ФизическоеЛицо
СГРУППИРОВАТЬ ПО
Удержания.Регистратор,
Удержания.ИдентификаторСтроки,
Удержания.ФизическоеЛицо) КАК ВложенныйЗапросУдержания
ПО ВложенныйЗапросПоказатели.РегистраторИзмерение = ВложенныйЗапросУдержания.Регистратор
И ВложенныйЗапросПоказатели.ИдентификаторСтроки = ВложенныйЗапросУдержания.ИдентификаторСтроки
Обращение напрямую к регистру сведений ЗначенияПоказателейУдержаний относится к низкоуровневой работе с данными. В типовой конфигурации «1С:Зарплата и Управление Персоналом» существуют штатные механизмы, позволяющие получить базовые суммы проще и надежнее.
БазаУдержанияУ регистра расчета Удержания существует виртуальная таблица БазаУдержания. Она автоматически рассчитывает сумму начислений, входящих в базовый результат конкретного удержания, без необходимости вручную агрегировать показатели.
Рассмотрим пример запроса к виртуальной таблице базы:
ВЫБРАТЬ
УдержанияБаза.ФизическоеЛицо КАК ФизическоеЛицо,
УдержанияБаза.Регистратор КАК Регистратор,
УдержанияБаза.ВидРасчета КАК ВидРасчета,
СУММА(УдержанияБаза.РезультатБаза) КАК РасчетнаяБаза
ИЗ
РегистрРасчета.Удержания.БазаУдержания(&ПериодРегистрации, , , , ФизическоеЛицо = &ФизическоеЛицо) КАК УдержанияБаза
СГРУППИРОВАТЬ ПО
УдержанияБаза.ФизическоеЛицо,
УдержанияБаза.Регистратор,
УдержанияБаза.ВидРасчета
НачисленияУдержанияПоСотрудникамЕсли задача состоит в построении отчета, аналогичного отчетам «Полный свод начислений, удержаний и выплат» или «Расчетный листок», рекомендуется обращаться к регистру накопления НачисленияУдержанияПоСотрудникам. Данные в нем уже оптимизированы для построения отчетов на СКД и сгруппированы по сотрудникам, организациям и физическим лицам.
Выясним преимущества работы с регистром НачисленияУдержанияПоСотрудникам:
При связывании регистра расчета Удержания и регистра сведений ЗначенияПоказателейУдержаний обязательно указывайте два условия связи: по полю Регистратор (или РегистраторИзмерение) и по полю ИдентификаторСтроки. Также старайтесь избегать обращения к элементам справочников по их наименованию, заменяя их на конструкцию ЗНАЧЕНИЕ(...).
В случаях, когда требуется только получить величину базовых начислений, используйте виртуальную таблицу БазаУдержания или регистр накопления НачисленияУдержанияПоСотрудникам — это упростит структуру запроса и повысит стабильность работы вашего отчета.