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