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