Почему 1С:ЗУП 3.1 неправильно считает остатки отпусков и как устроен регистр «Заработанные права на отпуска»

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом
← На главную

Каждый программист и системный администратор, обслуживающий программу «1С:Зарплата и управление персоналом 3.1», рано или поздно сталкивается с классической проблемой: кадровый специалист утверждает, что программа неверно рассчитывает остатки отпусков по конкретному сотруднику. Кадровик показывает свою таблицу в Excel, где остаток сходится до дня, а в стандартных отчетах 1С цифра отличается, например, на 2, 3 или более дней.

Попытки проанализировать движения документов приводят технического специалиста к независимому регистру сведений Заработанные права на отпуска (в некоторых релизах — Заработанные права на отпуск). Обнаруживается странная вещь: у регистра нет документов-регистраторов, записи в нем появляются «сами по себе», а ручные корректировки бесследно исчезают. В этой статье мы подробно разберем, как устроен этот регистр, по каким алгоритмам он заполняется, почему возникают расхождения с ручным учетом кадровика и как исправить ошибки расчета.

1. Техническая суть регистра: почему это «кэш»

Для начала разберем архитектуру хранения данных в системе. Программа 1С:ЗУП 3.1 по умолчанию не хранит готовые остатки отпусков в базе данных «раз и навсегда». Вместо этого расчет остатка на любую произвольную дату происходит динамически по формуле:

Остаток отпуска = Начальный остаток (из ввода остатков) + Заработанные дни за время работы - Фактически использованные дни (из регистра накопления «Фактические отпуска»)

Поскольку расчет заработанных прав «с нуля» требует от процессора колоссальных ресурсов (нужно проанализировать всю кадровую историю сотрудника с момента его приема: все кадровые переводы, отпуска без сохранения оплаты, декреты, прогулы и т.д.), разработчики фирмы 1С создали регистр сведений Заработанные права на отпуска как механизм кэширования.

Этот регистр является независимым и непериодическим. Записи в него вносятся не документами, а непосредственно программным кодом в момент обращения к функциям расчета. Когда вы открываете отчет или справку, система сначала проверяет наличие готового расчета в этом «кэше». Если данные там есть и они актуальны, программа мгновенно строит отчет. Если данных нет или произошли изменения в кадровых документах, система запускает процедуру фонового пересчета, обновляет кэш в регистре и выдает результат пользователю.

2. В какой момент и как заполняется регистр

Проанализируем программный код и выясним, в какие моменты система обращается к перезаполнению записей регистра. Запись данных происходит при вызове процедур общего модуля ОстаткиОтпусков. Основными триггерами для обновления кэша являются:

  1. Формирование отчетов. При открытии и формировании отчетов «Остатки отпусков», «Остатки отпусков (по сотрудникам)» или «Справка об остатках отпусков» система инициирует расчет.
  2. Запуск программы. При старте сеанса пользователя конфигурация может в фоновом режиме запускать проверку актуальности кэша для оптимизации последующей работы.
  3. Проведение расчетных документов. Оформление документов «Отпуск», «Увольнение», «Начисление зарплаты и взносов» (в части расчета резервов отпусков) также обращается к функциям общего модуля.
  4. Регламентные задания. Для видов отпусков, продолжительность которых зависит от стажа сотрудника, расчет выполняется регламентным заданием по расписанию.

Если мы обратимся к конфигуратору, то увидим, что за расчет и запись отвечает процедура РасчетЗаработанныхОтпусков из общего модуля ОстаткиОтпусков. Упрощенная схема ее работы выглядит следующим образом:


Процедура РасчетЗаработанныхОтпусков(Сотрудник, ДатаРасчета) Экспорт
    // Очистка кэша по сотруднику перед проведением нового расчета
    НаборЗаписей = РегистрыСведений.ЗаработанныеПраваНаОтпуска.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Сотрудник.Установить(Сотрудник);
    НаборЗаписей.Записать();
    
    // Вычисление заработанных прав по кадровой истории
    ТаблицаРезультатов = СформироватьТаблицуПрав(Сотрудник, ДатаРасчета);
    
    // Запись новых актуальных данных в регистр-кэш
    Для Каждого СтрокаТаблицы Из ТаблицаРезультатов Цикл
        НоваяЗапись = НаборЗаписей.Добавить();
        ЗаполнитьЗначенияСвойств(НоваяЗапись, СтрокаТаблицы);
    КонецЦикла;
    НаборЗаписей.Записать();
КонецПроцедуры

Именно поэтому любые попытки вручную отредактировать записи в этом регистре обречены на провал: при первом же формировании отчета или проведении отпуска программа полностью очистит ваши ручные записи и запишет те данные, которые она рассчитала по своему внутреннему алгоритму.

3. Почему кадровик видит другие цифры: разбираем логику расчета

Если кадровый специалист утверждает, что программа «ошибается», в 99% случаев проблема кроется не в программном сбое, а в деталях методологии учета. Рассмотрим основные причины нестыковок между расчетом 1С и ручным расчетом в Excel:

4. Как сбросить кэш регистра и пересчитать остатки по шагам

Если у вас возникло обоснованное подозрение, что в регистре «зависли» некорректные или устаревшие данные (например, после обновления релиза или группового перепроведения документов), вы можете безопасно очистить кэш для принудительного пересчета. Разберем этот процесс по шагам:

  1. Откройте главное меню программы и перейдите в раздел «Функции для технического специалиста» (в старых релизах этот пункт назывался «Все функции»). Если этот пункт меню не отображается, включите его через Настройки -> Параметры -> Режим технического специалиста.
  2. В открывшемся дереве объектов найдите раздел Регистры сведений и выберите регистр Заработанные права на отпуска. Вы также можете быстро перейти к нему, нажав комбинацию клавиш Shift + F11 и вставив навигационную ссылку: e1cib/list/РегистрСведений.ЗаработанныеПраваНаОтпуска.
  3. В списке записей регистра настройте отбор по «проблемному» сотруднику, используя стандартную панель поиска или команду «Найти».
  4. Выделите все найденные записи по сотруднику (используя комбинацию клавиш Ctrl + A) и нажмите клавишу Delete. Подтвердите удаление записей. Обратите внимание: это абсолютно безопасно для информационной базы, так как регистр является техническим кэшем. Вы не потеряете кадровые документы или данные о фактических отпусках.
  5. Перейдите в раздел «Кадры» -> «Кадровые отчеты» и сформируйте отчет «Справка об остатках отпусков» по данному сотруднику. В момент формирования отчета программа обнаружит отсутствие записей в кэше, заново обратится к первичным кадровым документам сотрудника, последовательно пересчитает всю историю его работы и запишет в регистр актуальные, «чистые» данные.

5. Что делать, если очистка кэша не решила проблему

Если после удаления записей из регистра и переформирования отчетов цифры остатков не изменились и по-прежнему расходятся с данными кадровика, это означает, что сам алгоритм 1С считает именно так на основании введенных в базу документов. В этом случае причину нужно искать в первичных данных:

Проанализировав указанные настройки и проведя сверку рабочих лет сотрудника с учетом всех периодов отсутствия, вы сможете аргументированно объяснить кадровому специалисту логику расчета программы или оперативно исправить допущенные при вводе документов ошибки. Для детальной сверки положенных, использованных дней и остатков за период можно использовать отчет по неиспользованным, положенным и фактическим отпускам.

← На главную