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