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