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