При работе с разграничением прав доступа в конфигурации «Зарплата и управление персоналом 2.5» (особенно в базах с внедренными отраслевыми решениями, такими как БИТ.ФИНАНС) разработчики часто сталкиваются с ситуацией, когда стандартный запрос к табличной части справочника возвращает пустой результат или неполную выборку. Рассмотрим подробнее, почему так происходит и как правильно извлекать данные о принадлежности групп доступа пользователей к группам доступа физических лиц.
Проанализируем ситуацию: разработчику необходимо отобрать все элементы справочника ГруппыДоступаФизическихЛиц, в табличной части которых указана конкретная группа пользователей. На первый взгляд, задача решается простейшим запросом к табличной части:
ВЫБРАТЬ
ГруппыДоступаФизическихЛицбит_ГруппыПользователей.Ссылка КАК ГруппаДоступаФизЛиц,
ГруппыДоступаФизическихЛицбит_ГруппыПользователей.Группа КАК ГруппаПользователей
ИЗ
Справочник.ГруппыДоступаФизическихЛиц.бит_ГруппыПользователей КАК ГруппыДоступаФизическихЛицбит_ГруппыПользователей
ГДЕ
ГруппыДоступаФизическихЛицбит_ГруппыПользователей.Группа = &Группа
УПОРЯДОЧИТЬ ПО
ГруппыДоступаФизическихЛицбит_ГруппыПользователей.Ссылка.Наименование
Однако на практике выясняется, что часть групп доступа физических лиц, в которых визуально (в интерфейсе) выбрана группа пользователей, не попадает в выборку. Выясним причину этого «магического» исчезновения данных.
Разберем архитектурную особенность ЗУП 2.5 и систем на базе «БИТ». В конфигурациях на обычных формах механизм RLS (Record Level Security) — ограничение доступа на уровне записей — работает крайне медленно, если обращаться напрямую к табличным частям справочников. Для оптимизации производительности система использует «плоские» таблицы — регистры сведений.
В рассматриваемом случае данные в табличной части бит_ГруппыПользователей часто служат лишь для визуального отображения в форме элемента. Реальная же привязка прав хранится в регистре сведений ПраваДоступаПользователей (или аналогичном регистре из подсистемы БИТ). Проанализируем ситуацию: если данные были занесены в регистр программно или при переносе данных, они могут не отобразиться в табличной части справочника, если не была вызвана процедура синхронизации. И наоборот — визуально данные есть, но запрос к табличной части их не видит из-за особенностей записи объекта.
Решение: Вместо обращения к справочнику следует использовать запрос к регистру сведений. Рассмотрим пример:
ВЫБРАТЬ
ПраваДоступаПользователей.ОбъектДоступа КАК ГруппаДоступаФизЛиц,
ПраваДоступаПользователей.Пользователь КАК ГруппаПользователей
ИЗ
РегистрСведений.ПраваДоступаПользователей КАК ПраваДоступаПользователей
ГДЕ
ПраваДоступаПользователей.Пользователь = &Группа
И ПраваДоступаПользователей.ОбъектДоступа ССЫЛКА Справочник.ГруппыДоступаФизическихЛиц
Посмотрим на ситуацию со стороны данных. Часто в базе возникают дубли справочников ГруппыПользователей или Пользователи с идентичными наименованиями. Если в параметре запроса &Группа передается ссылка на один элемент, а в табличной части справочника фактически выбрана другая ссылка (хотя текст в поле одинаковый), запрос ничего не найдет.
Проанализируем шаги для диагностики этой проблемы:
УникальныйИдентификатор() (GUID) для группы из параметра и для значения в «проблемной» строке табличной части.Группа.= не подтянет элементы, входящие в группы. В этом случае используйте В ИЕРАРХИИ.Наличие префикса бит_ в названии табличной части однозначно указывает на кастомизацию от компании «Первый Бит». В таких решениях часто реализован механизм автоматического заполнения прав. Рассмотрим, как это работает: при записи группы доступа физических лиц срабатывает подписка на событие, которая транслирует данные из табличной части в регистр. Если в какой-то момент произошел сбой или данные в регистр попали в обход формы (через ОбменДанными.Загрузка = Истина), возникнет рассинхрон.
Выясним причину, почему данные могут «пихаться» в форму только для отображения: это делается для того, чтобы пользователь видел сводную информацию по правам, которые могут наследоваться из разных источников (например, напрямую из профиля пользователя или из настроек прав групп). В этом случае табличная часть вообще может быть пустой в базе данных (в таблице SQL), а заполняться только ПриЧтенииНаСервере.
Для получения гарантированно верного результата при работе с правами доступа в ЗУП 2.5 рекомендуем придерживаться следующего алгоритма:
ПраваДоступаПользователей или НазначениеГруппПользовательскихПрав), а не табличные части справочников.В ИЕРАРХИИ (&Группа) вместо прямого равенства.Таким образом, мы выяснили, что «пропажа» данных в запросе — это не магия, а следствие разделения хранения визуальных и функциональных данных в сложных конфигурациях 1С.