Работа в системе 1С:Управление производственным предприятием 1.3 (УПП) часто сопряжена с нюансами, которые проистекают из архитектуры решения, заложенной еще в платформе 8.2 на обычных формах. Одной из таких особенностей является разделение кадрового и расчетного контуров. Пользователи часто сталкиваются с ситуацией, когда программа позволяет провести несколько кадровых приказов на один и тот же период для одного сотрудника, что в дальнейшем приводит к хаосу в остатках отпусков и регламентированной отчетности. В этой статье мы подробно разберем, почему так происходит, как работает штатный механизм контроля и какими способами можно внедрить проверку для кадровых документов.
Прежде чем переходить к доработкам, проанализируем возможности, которые предоставляет типовая конфигурация. В 1С:УПП 1.3 существует специальная настройка, которая регулирует пересечение периодов. Чтобы найти её, пройдем по следующему пути в интерфейсе:
Меню Операции — Обработка — Параметры учета. В открывшемся окне перейдем на закладку Расчет зарплаты. Здесь нас интересует флаг «Контролировать пересечение периодов начислений, регистрирующих норму времени».
Рассмотрим, на что именно влияет эта настройка. Данный флаг заставляет систему проверять записи в регистрах расчета (например, в основных начислениях сотрудников организаций). Когда бухгалтер пытается провести документ НачислениеОтпускаСотруднику, программа анализирует, не перекрывает ли период этого отпуска другие начисления, которые также «вытесняют» время или регистрируют его (например, Оклад или другой Отпуск). Если пересечение обнаружено, система выдаст ошибку и не даст провести расчетный документ.
Однако, как справедливо отмечают пользователи, эта настройка не распространяется на кадровые документы. Документ ОтпускаОрганизаций является чисто кадровым приказом. Он делает записи в регистры сведений, такие как СостояниеСотрудниковОрганизаций и ФактическиеОтпуска, но не взаимодействует с регистрами расчета в момент проведения. Именно поэтому кадровик может создать хоть десять приказов на один и тот же день, и система «промолчит».
Проанализируем последствия, к которым приводит бесконтрольное проведение кадровых отпусков:
ФактическиеОтпуска получает данные из кадровых приказов. Если периоды пересекаются, система может дважды или трижды «списать» дни из лимита сотрудника. В итоге в отчете по остаткам отпусков мы увидим некорректные цифры или даже отрицательные значения.Поскольку типовыми средствами запретить пересечение кадровых периодов невозможно, нам необходимо внести небольшие изменения в конфигурацию. Наиболее корректный способ с точки зрения чистоты кода — использование Подписки на событие. Это позволит нам внедрить проверку, не снимая документ с поддержки и не меняя его внутренний модуль.
Выполним следующие шаги для реализации контроля:
1. Создадим новый общий модуль (например, КадровыйУчетСобытия) и установим ему свойства Сервер, Внешнее соединение.
2. Создадим объект Подписка на событие. Назовем её КонтрольПересеченияОтпусковПередЗаписью. В качестве источника выберем ДокументОбъект.ОтпускаОрганизаций. Событие — ПередЗаписью.
3. В обработчике подписки напишем алгоритм, который будет проверять наличие пересекающихся периодов в регистре сведений СостояниеСотрудниковОрганизаций.
Рассмотрим пример программного кода, который можно использовать в обработчике:
Процедура КонтрольПересеченияОтпусковПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
Если РежимПроведения = РежимПроведенияДокумента.Проведение Тогда
Для Каждого СтрокаТЧ Из Источник.РаботникиОрганизации Цикл
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СостояниеСотрудниковОрганизаций.Период КАК ДатаНачала,
| СостояниеСотрудниковОрганизаций.ДатаПо КАК ДатаОкончания,
| СостояниеСотрудниковОрганизаций.Регистратор
|ИЗ
| РегистрСведений.СостояниеСотрудниковОрганизаций КАК СостояниеСотрудниковОрганизаций
|ГДЕ
| СостояниеСотрудниковОрганизаций.Сотрудник = &Сотрудник
| И СостояниеСотрудниковОрганизаций.Регистратор <> &Регистратор
| И (СостояниеСотрудниковОрганизаций.Состояние = ЗНАЧЕНИЕ(Перечисление.СостоянияРабочегоВремени.Отпуск)
| ИЛИ СостояниеСотрудниковОрганизаций.Состояние = ЗНАЧЕНИЕ(Перечисление.СостоянияРабочегоВремени.ОтпускПоБеременностиИРодам))
| И НЕ (СостояниеСотрудниковОрганизаций.ДатаПо < &НачалоПериода
| ИЛИ СостояниеСотрудниковОрганизаций.Период > &КонецПериода)";
Запрос.УстановитьПараметр("Сотрудник", СтрокаТЧ.Сотрудник);
Запрос.УстановитьПараметр("Регистратор", Источник.Ссылка);
Запрос.УстановитьПараметр("НачалоПериода", СтрокаТЧ.ДатаНачала);
Запрос.УстановитьПараметр("КонецПериода", СтрокаТЧ.ДатаОкончания);
РезультатЗапроса = Запрос.Выполнить();
Если НЕ РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Сотрудник " + СтрокаТЧ.Сотрудник + " уже находится в отпуске в этот период! " +
"Документ пересечения: " + Выборка.Регистратор;
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
1. Мы проверяем, что документ именно проводится, а не просто записывается. Это важно, так как черновики не должны блокировать работу.
2. Проходим циклом по табличной части РаботникиОрганизации, так как в одном приказе может быть список сотрудников.
3. Выполняем запрос к регистру сведений СостояниеСотрудниковОрганизаций. Это ключевой регистр, где хранится информация о том, кто и когда был в отпуске, на больничном или в командировке.
4. В условии запроса мы используем классическую формулу проверки пересечения отрезков времени: НЕ (Конец1 < Начало2 ИЛИ Начало1 > Конец2). Это позволяет отловить любое наложение дат, даже на один день.
5. Мы обязательно исключаем сам текущий регистратор из проверки (Регистратор <> &Регистратор), чтобы при перепроведении документа система не находила саму себя.
6. Если запрос возвращает данные, мы выводим информативное сообщение пользователю с указанием «виновного» документа и устанавливаем Отказ = Истина, что прерывает транзакцию проведения.
Если вы не хотите вносить изменения в конфигурацию, можно рассмотреть административные методы или использование дополнительных отчетов:
СостояниеСотрудниковОрганизаций. Добавьте группировку по сотруднику и периоду. Это позволит HR-менеджеру раз в неделю проводить аудит на наличие двойных записей.НачислениеОтпускаСотруднику, в котором контроль работает штатно, то вероятность ошибки в кадровом приказе снижается, так как кадровик может использовать механизм «Создать на основании».Справка по отпуску поможет выявить аномалии. Если у сотрудника внезапно образовался огромный «минус» по дням, это явный признак пересечения кадровых приказов.Подводя итог, можно сказать, что в 1С:УПП 1.3 отсутствие контроля пересечений в кадровых документах — это не ошибка, а особенность системы, ориентированной на гибкость. Однако для поддержания порядка в базе данных рекомендуется внедрение программной проверки через подписку на события, так как это наиболее надежный способ предотвратить ошибки человеческого фактора на этапе ввода данных.