Проблема, при которой расчетный листок в типовой конфигурации «Зарплата и управление персоналом 3.1» начинает «врать», увеличивая суммы начислений, количество дней и часов в 2, 4, 8 или даже более раз, является довольно распространенной. Ситуация выглядит пугающе: в регистрах расчета всё верно, документы проведены правильно, но в отчете суммы по конкретному сотруднику превращаются в миллионы. Разберем детально, почему это происходит и как это исправить.
Расчетный листок в ЗУП 3.1 — это не просто выборка из регистра расчета. Это сложнейший отчет, построенный на системе компоновки данных (СКД), который собирает информацию из десятков таблиц: начислений, удержаний, выплат, а также многочисленных технических регистров сведений, хранящих кадровые состояния, тарифные ставки и плановый ФОТ.
Проанализируем ситуацию: когда в одном из таких вспомогательных регистров по сотруднику на один и тот же период (месяц формирования отчета) приходится две или более записи, запрос отчета выполняет соединение таблиц. Если условия соединения допускают пересечение периодов, происходит размножение строк. Например, если в таблице начислений 10 строк, а в таблице кадровых данных из-за ошибки записи нашлось 2 строки на этот же период, на выходе мы получим 20 строк. Суммы, дни и часы при этом суммируются в ресурсах СКД, что и дает эффект удвоения, учетверения и так далее по геометрической прогрессии.
Как показывает практика и обсуждения специалистов, чаще всего «мусорные» записи появляются в следующих регистрах:
Рассмотрим пример математической зависимости, выявленной опытным путем: если добавить в регистр ПлановыйФОТИтоги лишние записи, сумма в листке будет расти пропорционально квадрату количества записей (N²), так как соединения происходят многократно на разных этапах запроса.
Разберем по шагам, что нужно сделать, чтобы вернуть расчетный листок в нормальное состояние.
Прежде чем приступать к ручному удалению записей, попробуем воспользоваться штатным механизмом исправления. В конфигурациях на платформе 8.3 предусмотрена процедура пересчета служебных данных. Перейдите в раздел Администрирование — Обслуживание — Корректировка данных и найдите пункт Пересчет планового ФОТ. Выполните его для проблемного сотрудника. Это часто помогает очистить регистр ПлановыйФОТИтоги от ошибочных записей, созданных программными сбоями.
Если автоматический пересчет не помог, проанализируем записи в регистрах через «Функции для технического специалиста». Нам нужно проверить:
Текущие кадровые данные сотрудниковТекущая тарифная ставка сотрудниковИщите записи, где один и тот же сотрудник фигурирует дважды с пересекающимися периодами. Часто такая ситуация возникает после использования обработки «Поиск и удаление дублей», когда ссылки были заменены, но записи в независимых регистрах не «схлопнулись» автоматически.
Этот регистр не имеет регистратора, поэтому его можно редактировать напрямую (хотя это крайняя мера). Рассмотрим ситуацию, когда ошибка возникает из-за разницы в датах окончания записей. Если дата окончания старой записи пересекается с датой начала новой хотя бы на одну секунду (например, 30.09.2023 23:59:59 и 30.09.2023 23:59:59), отчет может учетверить данные. Убедитесь, что записи идут строго последовательно.
Проанализируем ситуацию со стороны разработчика. Почему стандартный расчетный листок сложно отладить в консоли запросов? Дело в том, что формирование данных происходит программно через вызов процедур общего модуля. Типовой вызов выглядит так:
ОтчетРасчетныйЛисток = ЗарплатаКадрыОтчеты.ОтчетРасчетныйЛисток();
Результат = Отчеты.АнализНачисленийИУдержаний.РасчетныйЛисток(ФизическиеЛица, Организация, МесяцФормированияОтчета, ОтчетРасчетныйЛисток);
Внутри этого процесса создается ПроцессорКомпоновкиДанных, в который передаются внешние наборы данных. Основная сложность заключается в том, что запрос содержит около 3000 строк и активно использует временные таблицы, которые уничтожаются сразу после вывода данных. Чтобы «перехватить» такой запрос, рекомендуется модифицировать код в месте инициализации процессора вывода:
// В месте получения данных отчета
ПроцессорВывода.Вывести(ПроцессорКомпоновки, Истина);
// В этой точке можно выгрузить ДанныеОтчета (ДеревоЗначений) в таблицу и проанализировать структуру строк.
Если вы пытаетесь повторить формирование программно, как в примере ниже, данные могут быть верными, потому что вы не используете те же настройки или внешние наборы данных, что и типовой отчет:
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(НастройкиОтчета.Отбор, "ФизическоеЛицо", СписокСотрудников, ВидСравненияКомпоновкиДанных.ВСписке, , Истина);
ОтчетОбъект.КомпоновщикНастроек.ЗагрузитьНастройки(НастройкиОтчета);
// ... формирование макета и процессора ...
Различие в результатах между вашим кодом и типовым отчетом подтверждает, что проблема кроется в специфических параметрах или соединениях с кадровыми регистрами, которые типовой отчет подключает «под капотом» для формирования шапок, группировок и условий по ФОТ.
Выясним причину возникновения такого поведения системы: чаще всего это следствие некорректного переноса данных, неаккуратного удаления дублей или сбоев при проведении кадровых документов в обратном хронологическом порядке.
Для решения проблемы:
ПлановыйФОТИтоги на наличие пересекающихся записей по сотруднику.Текущие кадровые данные) на предмет дублей после объединения физлиц.МенеджерВременныхТаблиц, чтобы увидеть, в какой именно ВТ (например, ВТКадровыеДанныеСотрудников) происходит размножение строк.Важно помнить, что расчетный листок — это лицо работы бухгалтерии, и подобные «глюки» могут привести к реальным финансовым ошибкам при выплате зарплаты, если расчетчик не заметит аномалию вовремя. Поэтому контроль чистоты технических регистров в ЗУП 3.1 — важная часть администрирования системы.