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