При настройке прав доступа на уровне записей (RLS) в типовых конфигурациях 1С (в частности, в конфигурациях на обычных формах, таких как Управление торговлей 10.3) разработчики часто сталкиваются с ситуацией: стандартный отчет, например Ведомость по товарам на складах, продолжает выводить количественные остатки по всем складам, но наименования недоступных складов заменяются на <Объект не найден> с указанием внутреннего идентификатора GUID.
Проанализируем причины такого поведения платформы 1С:Предприятие и разберем по шагам, как корректно ограничить доступ к данным и скрыть остатки по чужим складам и организациям.
Подобное поведение возникает из-за раздельной обработки прав RLS на уровне справочников и регистров накопления:
ТоварыНаСкладах) не наложено жесткое условие RLS или шаблон условия составлен некорректно, платформа успешно считывает все числовые остатки и ссылки на склады из таблицы итогов.Склады. Так как у текущего пользователя нет прав на чтение конкретного элемента справочника, платформа возвращает NULL или пустую ссылку, что в отчетах трансформируется в системную строку <Объект не найден> [GUID].Склад.Владелец в шаблонах RLS для регистра накопления формирует неявные левые соединения. При обращении к виртуальным таблицам остатков в режиме РАЗРЕШЕННЫЕ такое условие может работать не так, как ожидается, не отсекая сами итоговые записи регистра.Рассмотрим прямое решение проблемы через штатный механизм разграничения прав доступа. Если справочник Склады доработан и содержит реквизит Владелец (или привязку к организации), необходимо настроить ограничение на чтение самого справочника через типовой шаблон видов объектов доступа.
Для роли пользователя на право Чтение справочника Склады зададим условие с использованием стандартного шаблона:
#ТаблицаОсновогоВидаОбъектаДоступа("Организации", "Владелец", "")
Разберем параметры данного шаблона:
"Организации") — наименование вида объекта доступа, по которому настраиваются права в профилях пользователей."Владелец") — имя реквизита справочника, в котором хранится ссылка на организацию-владельца.Чтобы исключить сами записи движений и остатков из выборки регистра накопления ТоварыНаСкладах, проанализируем настройку RLS на право Чтение для таблицы регистра. Если прямого измерения Организация в регистре нет, используем проверку вхождения склада в список разрешенных элементов через подзапрос к справочнику:
ГДЕ Склад В
(ВЫБРАТЬ
ТаблицаСкладов.Ссылка
ИЗ
Справочник.Склады КАК ТаблицаСкладов)
Посмотрим, как это работает на практике: при обращении к регистру ТоварыНаСкладах платформа выполняет подзапрос к справочнику Склады. Так как на справочник уже наложен RLS, подзапрос вернет только доступные текущему пользователю склады. Все записи по остальным складам будут автоматически отфильтрованы на уровне СУБД, и строки с <Объект не найден> перестанут попадать в отчет.
Если конфигурация поддерживает учет товаров в разрезе юридических лиц, разберем типовой архитектурный подход. В типовых решениях складской учет (физическое наличие на складах) и финансовый/организационный учет разделены:
ТоварыНаСкладах предназначен для количественного учета по местам хранения без привязки к организациям.ТоварыОрганизаций содержит прямое измерение Организация.Для разграничения прав пользователей по организациям рекомендуется использовать отчеты, построенные на базе регистра ТоварыОрганизаций (например, Ведомость по товарам организаций). Ограничение RLS по прямому измерению Организация работает максимально быстро и не требует разыменования ссылок через точку, что существенно снижает нагрузку на СУБД при формировании отчетов.
При проверке настроек ограничений обратим внимание на следующие ключевые нюансы: