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