Как программно проверить количество дней в графике отпусков в 1С:ЗУП?

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

В типовой конфигурации 1С:Зарплата и управление персоналом 8 (редакция 3.1) документ ГрафикОтпусков позволяет планировать периоды отдыха сотрудников. Однако на практике часто возникает задача ограничить ввод данных: например, проконтролировать, чтобы суммарное количество дней основного отпуска не превышало положенные 28 дней за год, даже если отпуск разделен на несколько частей. Рассмотрим, как реализовать такую проверку программно, учитывая технические особенности платформы и требования Трудового кодекса РФ.

Анализ задачи и выбор механизма проверки

Прежде всего, проанализируем структуру документа. В табличной части Сотрудники один и тот же человек может встречаться в нескольких строках, если его отпуск разбит на части (например, 14 дней зимой и 14 дней летом). Простая проверка текущей строки не даст результата — нам необходимо агрегировать данные по каждому сотруднику в пределах всего документа.

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

  1. ПередЗаписью (BeforeWrite): подходит, если мы хотим полностью заблокировать запись документа при нарушении условий.
  2. ОбработкаПроверкиЗаполнения (FillCheckProcessing): более правильный с точки зрения UX метод. Он позволяет вывести сообщение об ошибке в стандартное окно сообщений с указанием конкретного поля или строки, где допущена ошибка.

Разберем по шагам, как написать код для обработки проверки заполнения.

Алгоритм суммирования дней по сотрудникам

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


&НаСервере
Процедура Расш1_ПередЗаписьюПеред(Отказ, РежимЗаписи, РежимПроведения)
    
    // Создаем таблицу для накопления данных
    ТЗ_Данные = ЭтотОбъект.Сотрудники.Выгрузить();
    ТЗ_Данные.Свернуть("Сотрудник, ВидОтпуска", "КоличествоДней");
    
    Для Каждого СтрокаИтог Из ТЗ_Данные Цикл
        
        // Получаем лимит дней для конкретного вида отпуска
        ЛимитДней = 28; // Значение по умолчанию
        
        Если СтрокаИтог.ВидОтпуска = Справочники.ВидыОтпусков.ОтпускПоИнвалидности Тогда
            ЛимитДней = 7;
        КонецЕсли;
        
        // Проверяем превышение
        Если СтрокаИтог.КоличествоДней > ЛимитДней Тогда
            ТекстСообщения = СтрШаблон("Сотрудник %1 превысил лимит отпуска (%2). Введено: %3", 
                СтрокаИтог.Сотрудник, ЛимитДней, СтрокаИтог.КоличествоДней);
            ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения, , , , Отказ);
        КонецЕсли;
        
    КонецЦикла;
    
КонецПроцедуры

Использование системных механизмов 1С:ЗУП

Рассмотрим подробнее, почему жесткое ограничение в 28 дней не всегда корректно. Выясним причину: в программе существуют разные категории сотрудников (педагоги, несовершеннолетние, «северяне»), у которых основной отпуск может быть значительно больше. Также сотрудник может использовать неиспользованные дни за прошлые периоды.

Чтобы проверка была «умной», рекомендуется использовать возможности общего модуля ОстаткиОтпусков. Посмотрим на функции, которые помогут получить реальные права сотрудника на отпуск:

Проанализируем ситуацию: если мы хотим проверить соответствие графика закону, нам нужно сравнивать сумму дней не с числом 28, а с количеством дней, указанным в регистре сведений НастройкиУчетаПоВидамОтпусков или в кадровых данных сотрудника.

Соблюдение правила «14 дней»

Согласно ст. 125 ТК РФ, при разделении отпуска хотя бы одна из его частей должна быть не менее 14 календарных дней. В типовом документе 1С:ЗУП уже есть встроенная проверка на это правило. Если вы пишете свой код, важно не мешать работе типовой функции ПроверитьНаличиеОбязательнойЧастиОтпуска(), которая вызывается при проведении.

Рекомендации по улучшению логики

Для создания действительно качественного инструмента контроля, выполним следующие шаги:

  1. Фильтрация по видам отпуска: Не суммируйте основной отпуск с дополнительными (за вредность, северные). Используйте свойство ЯвляетсяЕжегодным у справочника ВидыОтпусков.
  2. Учет рабочих лет: Если сотрудник планирует отпуск в январе за 2023 год и в июле за 2024 год, их суммирование в рамках «лимита 28» может быть ошибочным. Профессиональное решение требует анализа колонки ДатаНачала.
  3. Предупреждение вместо запрета: Поскольку график отпусков — это план, который составляется заранее, лучше выводить предупреждение (диалог с вопросом), а не жестко блокировать запись (устанавливать Отказ = Истина). Это позволит кадровику сохранить документ, если превышение лимита обосновано (например, накопленные дни за 2 года).

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

← На главную