Приветствуем вас! При работе с конфигурациями «1С:Управление производственным предприятием» редакции 1.3 или «1С:Зарплата и управление персоналом» редакции 2.5 разработчики и кадровые аналитики часто сталкиваются с загадочным поведением механизма расчета остатков отпусков. Наиболее распространенная проблема заключается в следующем: в одной информационной базе отчет «Справка по отпуску» формируется корректно, а в другой аналогичной базе данные по фактическим отпускам сотрудника «исчезают» из расчета, хотя все кадровые документы проведены.
В этой статье мы подробно разберем, как устроен этот механизм изнутри, почему таблицы НачальныеОстатки и ФактическиеОтпуска могут конфликтовать между собой, и как восстановить правильное отображение дней отпуска в программе.
Давайте рассмотрим ситуацию, описанную на техническом форуме. Разработчик сравнил поведение двух информационных баз с помощью отладчика. Точкой анализа стала процедура ИсходныеДанныеДляРасчетаОстатков() общего модуля ОстаткиОтпусков. Результаты выгрузки временных таблиц из пакета запросов оказались диаметрально противоположными:
НачальныеОстатки (выгрузка 10-го результата запроса) пуста. При этом таблица ФактическиеОтпуска (выгрузка 13-го результата запроса) содержит все необходимые записи о фактически использованных днях отпуска. Итоговая справка отображает верные данные.НачальныеОстатки заполнена данными. Однако таблица ФактическиеОтпуска возвращается абсолютно пустой. В результате в справке по отпуску сотрудника данные за определенные периоды отсутствуют.Выясним причину такого расхождения. Для этого нам потребуется погрузиться в архитектуру и логику работы программного кода системы 1С.
Основная задача процедуры ИсходныеДанныеДляРасчетаОстатков() — собрать воедино всю историю права сотрудника на ежегодный отпуск, а также сведения о том, когда и сколько дней он фактически использовал. Расчет базируется на сопоставлении двух ключевых источников:
ОстаткиОтпусковОрганизаций (в режиме пользователя — «Остатки отпусков прошлых лет»). Он хранит информацию о накопленных, но не использованных днях отпуска на определенную дату (дату ввода остатков).ФактическиеОтпускаОрганизаций. В этот регистр записываются сведения о фактическом использовании дней отпуска на основании кадровых или расчетных документов.Почему же заполненная таблица НачальныеОстатки «вырезает» данные из таблицы ФактическиеОтпуска? В коде типового запроса реализована жесткая логика исключения двойного учета дней отпуска. Проанализируем ее:
Если для сотрудника введены начальные остатки, система считывает поле ДатаАктуальности (дата, на которую зафиксированы остатки отпусков). Запрос спроектирован так, что при получении данных из регистра накопления ФактическиеОтпускаОрганизаций все записи, период которых меньше или равен дате актуальности начальных остатков, автоматически отсекаются.
Разработчики фирмы «1С» заложили следующую логику: если пользователь вручную зафиксировал начальный остаток (например, 14 дней на 31.12.2023), то в этой цифре уже учтены все отпуска, отгулянные сотрудником до 31.12.2023. Соответственно, если система начнет дополнительно вычитать из этого остатка фактические отпуска за предыдущие года, произойдет занижение остатка (двойное вычитание). Поэтому старые фактические отпуска отбрасываются.
Таким образом, в Базе 2 введенные начальные остатки с более поздней датой актуальности заблокировали вывод фактических отпусков. В то время как в Базе 1 отсутствие начальных остатков позволило системе рассчитать всю историю с самого момента приема сотрудника на работу.
Прежде чем вносить изменения в программный код или конфигурацию, давайте выполним аудит данных в проблемной базе. Это позволит решить проблему стандартными пользовательскими средствами.
Шаг 1. Проверяем справочник «Остатки отпусков организаций»
Перейдите в меню «Операции» — «Справочники» — «Остатки отпусков организаций». Найдите проблемного сотрудника и проанализируйте табличную часть:
ФактическиеОтпуска.Шаг 2. Проверяем настройки учетной политики (Кадровый учет)
Важно выяснить, какие именно документы в вашей базе делают движения по регистру ФактическиеОтпускаОрганизаций. Перейдем в настройки параметров учета:
Вкладка «Кадровый учет» содержит важную настройку: «Остатки отпусков будут уменьшаться...».
Убедитесь, что в обеих базах эти настройки идентичны. Если в некорректной базе настройка сбилась, фактические отпуска просто не будут регистрироваться в базе данных при проведении документов другого типа.
Шаг 3. Анализируем регистр накопления «Фактические отпуска организаций»
Через «Операции» — «Регистры накопления» откройте регистр «Фактические отпуска организаций» и установите отбор по нашему сотруднику. Проверьте:
Для программистов 1С рассмотрим, как выглядит схематичный фрагмент логики отсечения данных в пакете запросов общего модуля ОстаткиОтпусков. Понимание этой структуры поможет вам при отладке сложных кастомных отчетов.
// Схематичный пример формирования таблицы фактических отпусков с учетом начальных остатков
ВЫБРАТЬ
ФактическиеОтпуска.Сотрудник,
ФактическиеОтпуска.ВидЕжегодногоОтпуска,
ФактическиеОтпуска.КоличествоДней,
ФактическиеОтпуска.Период
ПОМЕСТИТЬ ВТ_ФактическиеОтпуска
ИЗ
РегистрНакопления.ФактическиеОтпускаОрганизаций КАК ФактическиеОтпуска
ГДЕ
ФактическиеОтпуска.Сотрудник В (&МассивСотрудников)
И (НЕ ФактическиеОтпуска.Сотрудник В
(ВЫБРАТЬ
Остатки.Сотрудник
ИЗ
Справочник.ОстаткиОтпусковОрганизаций КАК Остатки
ГДЕ
Остатки.ДатаАктуальности >= ФактическиеОтпуска.Период))
Как мы видим из этой упрощенной схемы запроса, если в справочнике существует запись с датой актуальности, превышающей или равной периоду фактического отпуска, эта запись просто исключается из результирующего набора временной таблицы. Именно это явление и наблюдал автор темы на форуме в Базе 2.
В зависимости от того, по какой методологии ведется учет в вашей компании, выберите один из двух путей исправления ситуации:
Вариант А. Полный расчет «с нуля» (Рекомендуется)
Если вы хотите, чтобы программа самостоятельно вычисляла все остатки и фактические отпуска с самого первого дня работы сотрудника в компании на основании проведенных документов:
НачальныеОстатки станет пустой, а в ТЗ ФактическиеОтпуска попадут абсолютно все записи за всю историю работы.Вариант Б. Использование точки фиксации (Начальные остатки)
Если расчет за старые периоды вести автоматически невозможно (например, база ведется не с начала работы сотрудника, либо старые данные были перенесены свернутыми):
Проведя такой анализ и выбрав подходящий метод настройки, вы легко устраните расхождения между базами и добьетесь корректного формирования справки по отпуску сотрудника.