Каждый программист и системный администратор, обслуживающий программу «1С:Зарплата и управление персоналом 3.1», рано или поздно сталкивается с классической проблемой: кадровый специалист утверждает, что программа неверно рассчитывает остатки отпусков по конкретному сотруднику. Кадровик показывает свою таблицу в Excel, где остаток сходится до дня, а в стандартных отчетах 1С цифра отличается, например, на 2, 3 или более дней.
Попытки проанализировать движения документов приводят технического специалиста к независимому регистру сведений Заработанные права на отпуска (в некоторых релизах — Заработанные права на отпуск). Обнаруживается странная вещь: у регистра нет документов-регистраторов, записи в нем появляются «сами по себе», а ручные корректировки бесследно исчезают. В этой статье мы подробно разберем, как устроен этот регистр, по каким алгоритмам он заполняется, почему возникают расхождения с ручным учетом кадровика и как исправить ошибки расчета.
Для начала разберем архитектуру хранения данных в системе. Программа 1С:ЗУП 3.1 по умолчанию не хранит готовые остатки отпусков в базе данных «раз и навсегда». Вместо этого расчет остатка на любую произвольную дату происходит динамически по формуле:
Остаток отпуска = Начальный остаток (из ввода остатков) + Заработанные дни за время работы - Фактически использованные дни (из регистра накопления «Фактические отпуска»)
Поскольку расчет заработанных прав «с нуля» требует от процессора колоссальных ресурсов (нужно проанализировать всю кадровую историю сотрудника с момента его приема: все кадровые переводы, отпуска без сохранения оплаты, декреты, прогулы и т.д.), разработчики фирмы 1С создали регистр сведений Заработанные права на отпуска как механизм кэширования.
Этот регистр является независимым и непериодическим. Записи в него вносятся не документами, а непосредственно программным кодом в момент обращения к функциям расчета. Когда вы открываете отчет или справку, система сначала проверяет наличие готового расчета в этом «кэше». Если данные там есть и они актуальны, программа мгновенно строит отчет. Если данных нет или произошли изменения в кадровых документах, система запускает процедуру фонового пересчета, обновляет кэш в регистре и выдает результат пользователю.
Проанализируем программный код и выясним, в какие моменты система обращается к перезаполнению записей регистра. Запись данных происходит при вызове процедур общего модуля ОстаткиОтпусков. Основными триггерами для обновления кэша являются:
Если мы обратимся к конфигуратору, то увидим, что за расчет и запись отвечает процедура РасчетЗаработанныхОтпусков из общего модуля ОстаткиОтпусков. Упрощенная схема ее работы выглядит следующим образом:
Процедура РасчетЗаработанныхОтпусков(Сотрудник, ДатаРасчета) Экспорт
// Очистка кэша по сотруднику перед проведением нового расчета
НаборЗаписей = РегистрыСведений.ЗаработанныеПраваНаОтпуска.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Сотрудник.Установить(Сотрудник);
НаборЗаписей.Записать();
// Вычисление заработанных прав по кадровой истории
ТаблицаРезультатов = СформироватьТаблицуПрав(Сотрудник, ДатаРасчета);
// Запись новых актуальных данных в регистр-кэш
Для Каждого СтрокаТаблицы Из ТаблицаРезультатов Цикл
НоваяЗапись = НаборЗаписей.Добавить();
ЗаполнитьЗначенияСвойств(НоваяЗапись, СтрокаТаблицы);
КонецЦикла;
НаборЗаписей.Записать();
КонецПроцедуры
Именно поэтому любые попытки вручную отредактировать записи в этом регистре обречены на провал: при первом же формировании отчета или проведении отпуска программа полностью очистит ваши ручные записи и запишет те данные, которые она рассчитала по своему внутреннему алгоритму.
Если кадровый специалист утверждает, что программа «ошибается», в 99% случаев проблема кроется не в программном сбое, а в деталях методологии учета. Рассмотрим основные причины нестыковок между расчетом 1С и ручным расчетом в Excel:
Если у вас возникло обоснованное подозрение, что в регистре «зависли» некорректные или устаревшие данные (например, после обновления релиза или группового перепроведения документов), вы можете безопасно очистить кэш для принудительного пересчета. Разберем этот процесс по шагам:
Заработанные права на отпуска. Вы также можете быстро перейти к нему, нажав комбинацию клавиш Shift + F11 и вставив навигационную ссылку: e1cib/list/РегистрСведений.ЗаработанныеПраваНаОтпуска.Ctrl + A) и нажмите клавишу Delete. Подтвердите удаление записей. Обратите внимание: это абсолютно безопасно для информационной базы, так как регистр является техническим кэшем. Вы не потеряете кадровые документы или данные о фактических отпусках.Если после удаления записей из регистра и переформирования отчетов цифры остатков не изменились и по-прежнему расходятся с данными кадровика, это означает, что сам алгоритм 1С считает именно так на основании введенных в базу документов. В этом случае причину нужно искать в первичных данных:
Прием на работу или последние документы Кадровый перевод по данному сотруднику. Нажмите на ссылку «Редактировать» рядом с правами на отпуск на вкладке «Главное». Убедитесь, что там не заданы ошибочные дополнительные дни отпуска или не продублирован основной отпуск.Ввод остатков отпусков или Начальная штатная расстановка. Ошибки в этих документах — самая частая причина неверных расчетов. Если в документе ввода остатков неверно указаны рабочие годы, за которые вводятся остатки, или допущена опечатка в количестве дней, вся последующая цепочка автоматических расчетов программы будет выдавать неверный результат.Проанализировав указанные настройки и проведя сверку рабочих лет сотрудника с учетом всех периодов отсутствия, вы сможете аргументированно объяснить кадровому специалисту логику расчета программы или оперативно исправить допущенные при вводе документов ошибки. Для детальной сверки положенных, использованных дней и остатков за период можно использовать отчет по неиспользованным, положенным и фактическим отпускам.