Почему фактические отпуска не попадают в расчет остатков в 1С:УПП 1.3 и ЗУП 2.5?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

Приветствуем вас! При работе с конфигурациями «1С:Управление производственным предприятием» редакции 1.3 или «1С:Зарплата и управление персоналом» редакции 2.5 разработчики и кадровые аналитики часто сталкиваются с загадочным поведением механизма расчета остатков отпусков. Наиболее распространенная проблема заключается в следующем: в одной информационной базе отчет «Справка по отпуску» формируется корректно, а в другой аналогичной базе данные по фактическим отпускам сотрудника «исчезают» из расчета, хотя все кадровые документы проведены.

В этой статье мы подробно разберем, как устроен этот механизм изнутри, почему таблицы НачальныеОстатки и ФактическиеОтпуска могут конфликтовать между собой, и как восстановить правильное отображение дней отпуска в программе.

Анализируем симптомы проблемы

Давайте рассмотрим ситуацию, описанную на техническом форуме. Разработчик сравнил поведение двух информационных баз с помощью отладчика. Точкой анализа стала процедура ИсходныеДанныеДляРасчетаОстатков() общего модуля ОстаткиОтпусков. Результаты выгрузки временных таблиц из пакета запросов оказались диаметрально противоположными:

Выясним причину такого расхождения. Для этого нам потребуется погрузиться в архитектуру и логику работы программного кода системы 1С.

Как работает алгоритм «ИсходныеДанныеДляРасчетаОстатков»

Основная задача процедуры ИсходныеДанныеДляРасчетаОстатков() — собрать воедино всю историю права сотрудника на ежегодный отпуск, а также сведения о том, когда и сколько дней он фактически использовал. Расчет базируется на сопоставлении двух ключевых источников:

  1. Справочник ОстаткиОтпусковОрганизаций (в режиме пользователя — «Остатки отпусков прошлых лет»). Он хранит информацию о накопленных, но не использованных днях отпуска на определенную дату (дату ввода остатков).
  2. Регистр накопления ФактическиеОтпускаОрганизаций. В этот регистр записываются сведения о фактическом использовании дней отпуска на основании кадровых или расчетных документов.

«Правило отсечения»: Ключевой нюанс логики запроса

Почему же заполненная таблица НачальныеОстатки «вырезает» данные из таблицы ФактическиеОтпуска? В коде типового запроса реализована жесткая логика исключения двойного учета дней отпуска. Проанализируем ее:

Если для сотрудника введены начальные остатки, система считывает поле ДатаАктуальности (дата, на которую зафиксированы остатки отпусков). Запрос спроектирован так, что при получении данных из регистра накопления ФактическиеОтпускаОрганизаций все записи, период которых меньше или равен дате актуальности начальных остатков, автоматически отсекаются.

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

Таким образом, в Базе 2 введенные начальные остатки с более поздней датой актуальности заблокировали вывод фактических отпусков. В то время как в Базе 1 отсутствие начальных остатков позволило системе рассчитать всю историю с самого момента приема сотрудника на работу.

Разберем по шагам: что проверить в режиме «1С:Предприятие»

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

Шаг 1. Проверяем справочник «Остатки отпусков организаций»

Перейдите в меню «Операции» — «Справочники» — «Остатки отпусков организаций». Найдите проблемного сотрудника и проанализируйте табличную часть:

Шаг 2. Проверяем настройки учетной политики (Кадровый учет)

Важно выяснить, какие именно документы в вашей базе делают движения по регистру ФактическиеОтпускаОрганизаций. Перейдем в настройки параметров учета:

Вкладка «Кадровый учет» содержит важную настройку: «Остатки отпусков будут уменьшаться...».

Убедитесь, что в обеих базах эти настройки идентичны. Если в некорректной базе настройка сбилась, фактические отпуска просто не будут регистрироваться в базе данных при проведении документов другого типа.

Шаг 3. Анализируем регистр накопления «Фактические отпуска организаций»

Через «Операции» — «Регистры накопления» откройте регистр «Фактические отпуска организаций» и установите отбор по нашему сотруднику. Проверьте:

Технический разбор запроса

Для программистов 1С рассмотрим, как выглядит схематичный фрагмент логики отсечения данных в пакете запросов общего модуля ОстаткиОтпусков. Понимание этой структуры поможет вам при отладке сложных кастомных отчетов.


// Схематичный пример формирования таблицы фактических отпусков с учетом начальных остатков
ВЫБРАТЬ
    ФактическиеОтпуска.Сотрудник,
    ФактическиеОтпуска.ВидЕжегодногоОтпуска,
    ФактическиеОтпуска.КоличествоДней,
    ФактическиеОтпуска.Период
ПОМЕСТИТЬ ВТ_ФактическиеОтпуска
ИЗ
    РегистрНакопления.ФактическиеОтпускаОрганизаций КАК ФактическиеОтпуска
ГДЕ
    ФактическиеОтпуска.Сотрудник В (&МассивСотрудников)
    И (НЕ ФактическиеОтпуска.Сотрудник В
                (ВЫБРАТЬ
                    Остатки.Сотрудник
                ИЗ
                    Справочник.ОстаткиОтпусковОрганизаций КАК Остатки
                ГДЕ
                    Остатки.ДатаАктуальности >= ФактическиеОтпуска.Период))

Как мы видим из этой упрощенной схемы запроса, если в справочнике существует запись с датой актуальности, превышающей или равной периоду фактического отпуска, эта запись просто исключается из результирующего набора временной таблицы. Именно это явление и наблюдал автор темы на форуме в Базе 2.

Рекомендации по исправлению данных

В зависимости от того, по какой методологии ведется учет в вашей компании, выберите один из двух путей исправления ситуации:

Вариант А. Полный расчет «с нуля» (Рекомендуется)

Если вы хотите, чтобы программа самостоятельно вычисляла все остатки и фактические отпуска с самого первого дня работы сотрудника в компании на основании проведенных документов:

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

Вариант Б. Использование точки фиксации (Начальные остатки)

Если расчет за старые периоды вести автоматически невозможно (например, база ведется не с начала работы сотрудника, либо старые данные были перенесены свернутыми):

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

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

← На главную