Как установить жесткий запрет на прием и перевод сотрудников сверх штатного расписания в 1С:ЗУП

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

В процессе ведения кадрового учета в программе 1С:Зарплата и Управление Персоналом (1С:ЗУП) многие компании сталкиваются с проблемой человеческого фактора. Кадровые специалисты нередко игнорируют предупреждения системы о нехватке свободных ставок в штатном расписании и проводят документы приема или перевода «в обход» установленных лимитов. В результате этого штатное расписание искажается, а руководство компании обоснованно требует от ИТ-отдела настроить жесткую блокировку таких операций.

В этой статье мы подробно разберем, почему штатные механизмы контроля 1С:ЗУП позволяют пользователям нарушать лимиты ставок, и рассмотрим практические технические варианты реализации жесткого блокирующего запрета с примерами программного кода.

---

Анализ типового механизма контроля в 1С:ЗУП

Для начала проанализируем, как работает стандартный механизм контроля штатного расписания, предусмотренный разработчиками фирмы «1С». В настройках кадрового учета (раздел «Настройка» — «Кадровый учет» — «Настройка штатного расписания») присутствует флаг Автоматическая проверка кадровых документов на соответствие штатному расписанию.

При включении этой опции программа начинает анализировать наличие свободных ставок при проведении таких документов, как:

Однако этот контроль является информационным, а не блокирующим. Если программа обнаруживает превышение количества ставок, она выводит специальное диалоговое окно с предупреждением, но одновременно предоставляет пользователю кнопку «Провести, несмотря на несоответствие» (или аналогичную команду). Нажав ее, кадровик без труда завершает проведение документа в обход всех правил. Типовой роли, которая могла бы заблокировать доступ к этой кнопке для рядового сотрудника, в стандартной конфигурации 1С:ЗУП не существует.

---

Вариант 1. Организационное решение в 1С:ЗУП КОРП (Согласование документов)

Если в вашей организации используется версия 1С:ЗУП КОРП, проблему можно попытаться решить без вмешательства в программный код конфигурации. Для этого мы можем задействовать встроенные механизмы процессов согласования.

Рассмотрим, как настроить данный процесс по шагам:

  1. Активируем опцию согласования кадровых документов в настройках программы.
  2. Для кадровиков настраиваем права таким образом, чтобы они могли создавать документы ПриемНаРаботу и КадровыйПеревод только в статусе «Черновик» (не проведен).
  3. При попытке завершить оформление документ отправляется на согласование ответственному лицу (например, руководителю планово-экономического отдела или главному кадровику).
  4. Согласующий сотрудник проверяет соответствие штатному расписанию и только после этого утверждает документ, переводя его в статус, разрешающий фактическое проведение.

Этот способ хорош тем, что он не требует программирования, однако он существенно усложняет и затягивает цепочку согласования документов в компании.

---

Вариант 2. Разработка расширения (Блокировка кнопки на форме)

Перейдем к техническим методам решения проблемы. Самый очевидный способ, который часто выбирают начинающие программисты — это перехват формы документа через расширение конфигурации и программное отключение видимости или доступности кнопки «Провести, несмотря на несоответствие».

Выясним, почему этот способ не является надежным на 100%. Дело в том, что форму документа действительно можно доработать, скрыв назойливую кнопку. Но опытный или просто любопытный пользователь сможет провести документ в обход формы:

Тем не менее, этот метод можно использовать как первый контур защиты в дополнение к серверным проверкам.

---

Вариант 3. Жесткая программная блокировка проведения на сервере (Рекомендуемый способ)

Чтобы полностью исключить лазейки для пользователей, мы должны реализовать жесткую проверку непосредственно в транзакции проведения документа на уровне сервера. Сделать это наиболее корректно с помощью создания Расширения конфигурации.

Проанализируем архитектуру проверки штатного расписания в 1С:ЗУП. В типовой конфигурации проверка выполняется перед записью или в процессе проведения документов. Система формирует таблицу ошибок и предупреждений. Наша задача — перехватить эту таблицу и, если в ней содержатся записи о превышении лимита ставок, принудительно установить параметр Отказ = Истина.

Рассмотрим пример реализации такого алгоритма в расширении для документа ПриемНаРаботу. Создадим обработчик в модуле объекта документа или воспользуемся подпиской на событие ОбработкаПроведения.

Посмотрим на пример программного кода, который можно внедрить в расширение:


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

КонецПроцедуры

Разберем детально, как работает этот код:

  1. Процедура выполняется &После основного проведения документа в рамках одной транзакции.
  2. Мы используем типовую функцию ПроверитьДокументНаСоответствиеШР из общего модуля, чтобы не писать собственные сложные запросы по анализу регистров штатного расписания и занятых ставок. Это гарантирует, что логика проверки полностью совпадает со стандартной.
  3. Если функция возвращает ошибки с типом ПревышениеСтавок, система выводит пользователю информативное сообщение в окно сообщений и присваивает параметру Отказ значение Истина. При этом транзакция проведения откатывается.

Преимущество данного подхода заключается в том, что он срабатывает всегда, независимо от того, откуда именно пользователь пытается провести документ — из формы самого документа, из списка или программно с помощью внешней обработки. Лазейка для игнорирования лимитов закрывается полностью.

---

Резюме

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

Наиболее эффективным и безопасным решением является создание небольшого расширения, которое перехватывает процедуру проведения кадровых документов на сервере и жестко блокирует транзакцию, если лимит ставок превышен. Это гарантирует железную дисциплину кадровой службы и корректность данных в вашей информационной системе.

← На главную