В процессе ведения кадрового учета в программе 1С:Зарплата и Управление Персоналом (1С:ЗУП) многие компании сталкиваются с проблемой человеческого фактора. Кадровые специалисты нередко игнорируют предупреждения системы о нехватке свободных ставок в штатном расписании и проводят документы приема или перевода «в обход» установленных лимитов. В результате этого штатное расписание искажается, а руководство компании обоснованно требует от ИТ-отдела настроить жесткую блокировку таких операций.
В этой статье мы подробно разберем, почему штатные механизмы контроля 1С:ЗУП позволяют пользователям нарушать лимиты ставок, и рассмотрим практические технические варианты реализации жесткого блокирующего запрета с примерами программного кода.
---
Для начала проанализируем, как работает стандартный механизм контроля штатного расписания, предусмотренный разработчиками фирмы «1С». В настройках кадрового учета (раздел «Настройка» — «Кадровый учет» — «Настройка штатного расписания») присутствует флаг Автоматическая проверка кадровых документов на соответствие штатному расписанию.
При включении этой опции программа начинает анализировать наличие свободных ставок при проведении таких документов, как:
ПриемНаРаботу (или ПриемНаРаботуСписком);КадровыйПеревод (или КадровыйПереводСписком).Однако этот контроль является информационным, а не блокирующим. Если программа обнаруживает превышение количества ставок, она выводит специальное диалоговое окно с предупреждением, но одновременно предоставляет пользователю кнопку «Провести, несмотря на несоответствие» (или аналогичную команду). Нажав ее, кадровик без труда завершает проведение документа в обход всех правил. Типовой роли, которая могла бы заблокировать доступ к этой кнопке для рядового сотрудника, в стандартной конфигурации 1С:ЗУП не существует.
---
Если в вашей организации используется версия 1С:ЗУП КОРП, проблему можно попытаться решить без вмешательства в программный код конфигурации. Для этого мы можем задействовать встроенные механизмы процессов согласования.
Рассмотрим, как настроить данный процесс по шагам:
ПриемНаРаботу и КадровыйПеревод только в статусе «Черновик» (не проведен).Этот способ хорош тем, что он не требует программирования, однако он существенно усложняет и затягивает цепочку согласования документов в компании.
---
Перейдем к техническим методам решения проблемы. Самый очевидный способ, который часто выбирают начинающие программисты — это перехват формы документа через расширение конфигурации и программное отключение видимости или доступности кнопки «Провести, несмотря на несоответствие».
Выясним, почему этот способ не является надежным на 100%. Дело в том, что форму документа действительно можно доработать, скрыв назойливую кнопку. Но опытный или просто любопытный пользователь сможет провести документ в обход формы:
Ctrl + Shift + B или выбрав команду «Провести» из контекстного меню);Тем не менее, этот метод можно использовать как первый контур защиты в дополнение к серверным проверкам.
---
Чтобы полностью исключить лазейки для пользователей, мы должны реализовать жесткую проверку непосредственно в транзакции проведения документа на уровне сервера. Сделать это наиболее корректно с помощью создания Расширения конфигурации.
Проанализируем архитектуру проверки штатного расписания в 1С:ЗУП. В типовой конфигурации проверка выполняется перед записью или в процессе проведения документов. Система формирует таблицу ошибок и предупреждений. Наша задача — перехватить эту таблицу и, если в ней содержатся записи о превышении лимита ставок, принудительно установить параметр Отказ = Истина.
Рассмотрим пример реализации такого алгоритма в расширении для документа ПриемНаРаботу. Создадим обработчик в модуле объекта документа или воспользуемся подпиской на событие ОбработкаПроведения.
Посмотрим на пример программного кода, который можно внедрить в расширение:
&После("ОбработкаПроведения")
Процедура Расш1_ОбработкаПроведенияПосле(Отказ, РежимПроведения)
// Если документ уже не проводится из-за других ошибок, выходим из процедуры
Если Отказ Тогда
Возврат;
КонецЕсли;
// Проверим, включен ли вообще контроль штатного расписания в константах системы
Если Не ПолучитьФункциональнуюОпцию("ИспользоватьКонтрольШтатногоРасписания") Тогда
Возврат;
КонецЕсли;
// Вызываем проверку соответствия штатному расписанию.
// В типовой ЗУП для этого существует специализированный общий модуль.
ТаблицаНесоответствий = ПроверкаШтатногоРасписанияИнтеграция.ПроверитьДокументНаСоответствиеШР(ЭтотОбъект);
Если ТаблицаНесоответствий.Количество() > 0 Тогда
Для Каждого СтрокаНесоответствия Из ТаблицаНесоответствий Цикл
// Фильтруем сообщения, нас интересует именно превышение количества свободных ставок
Если СтрокаНесоответствия.ВидНесоответствия = Перечисления.ВидыНесоответствийШтатномуРасписанию.ПревышениеСтавок Тогда
// Выводим жесткое сообщение об ошибке для пользователя
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
НСтр("ru = 'Внимание! Проведение документа заблокировано: недостаточно свободных ставок по выбранной позиции штатного расписания!'"),
ЭтотОбъект,
"Организация"
);
// Устанавливаем признак отказа в проведении документа
Отказ = Истина;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Разберем детально, как работает этот код:
&После основного проведения документа в рамках одной транзакции.ПроверитьДокументНаСоответствиеШР из общего модуля, чтобы не писать собственные сложные запросы по анализу регистров штатного расписания и занятых ставок. Это гарантирует, что логика проверки полностью совпадает со стандартной.ПревышениеСтавок, система выводит пользователю информативное сообщение в окно сообщений и присваивает параметру Отказ значение Истина. При этом транзакция проведения откатывается.Преимущество данного подхода заключается в том, что он срабатывает всегда, независимо от того, откуда именно пользователь пытается провести документ — из формы самого документа, из списка или программно с помощью внешней обработки. Лазейка для игнорирования лимитов закрывается полностью.
---
Мы выяснили, что в типовой конфигурации 1С:ЗУП (включая КОРП) возможность превышать лимиты штатного расписания оставлена разработчиками намеренно для обеспечения гибкости учета. Однако в реальной практике это часто приводит к беспорядку в кадровых данных.
Наиболее эффективным и безопасным решением является создание небольшого расширения, которое перехватывает процедуру проведения кадровых документов на сервере и жестко блокирует транзакцию, если лимит ставок превышен. Это гарантирует железную дисциплину кадровой службы и корректность данных в вашей информационной системе.