Почему в отчетах 1С:Управление торговлей при RLS появляется Объект не найден и как это исправить?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При настройке ограничений на уровне записей (RLS) по подразделениям, партнерам, складам и организациям в типовой конфигурации 1С:Управление торговлей 11.5 администраторы и разработчики часто сталкиваются с неожиданным поведением отчетов. Например, формируя ведомость по товарам или взаиморасчетам с группировкой по подразделению и клиенту, пользователь видит строки с группировкой <Объект не найден...>. Внутри этой группы выводятся клиенты, доступные пользователю, но относящиеся к документам чужого подразделения.

Рассмотрим подробно, почему платформа 1С:Предприятие ведет себя именно так, как устроен этот механизм изнутри и какими способами можно исключить чужие данные из отчетов.

Механизм возникновения ошибки и логика работы RLS

Проанализируем ситуацию с точки зрения архитектуры типовых конфигураций на базе БСП (Библиотеки стандартных подсистем). Проблема заключается в сочетании трех факторов:

  1. Разделение прав на регистры и справочники. Отчеты по складским остаткам и продажам строятся по таблицам регистров накопления. В целях оптимизации производительности разработчики типовых решений не накладывают RLS по подразделениям на многие учетные регистры либо накладывают его в усеченном виде. Если ограничить чтение самих регистров по всем разрезам, это приведет к критическому падению скорости проведения документов и расчета итогов.
  2. Проверка прав на разные поля справочника. В типовых ролях шаблон RLS для справочников (например, СтруктураПредприятия или Организации) устроен специфическим образом: для поля Ссылка ограничение не задано (пустая строка), а для раздела ПрочиеПоля (куда входит Наименование, Код и другие реквизиты) установлено жесткое условие ограничения доступа.
  3. Формирование строкового представления ссылки. Когда запрос отчета СКД обращается к регистру, платформа считывает запись движения, так как доступ к партнеру или организации разрешен. При выводе группировки по подразделению СКД группирует записи по реальному значению ссылки (по ее идентификатору GUID в базе данных). Однако при отрисовке отчета платформе необходимо получить строковое представление объекта. Платформа отправляет неявный запрос к справочнику за наименованием, натыкается на RLS для прочих полей и получает отказ в доступе. Не имея возможности прочитать наименование, система выводит системную заглушку <Объект не найден [GUID]>.

Способ 1. Устранение нежелательных строк через настройки СКД без доработок

Если конфигурацию необходимо оставить на полной поддержке без изменения кода, разберем по шагам обходной маневр с использованием особенностей поведения платформы при обращении к реквизитам через точку.

Когда запрос СКД обращается к реквизиту объекта через точку, срабатывает ограничение на уровне полей. Для недоступного по RLS объекта обращение к его реквизитам вернет значение NULL, что позволяет отсечь такие записи штатными фильтрами отчета.

  1. Откроем отчет и перейдем в режим изменения варианта (кнопка Настройки, затем переключатель в положение Расширенный).
  2. На вкладке Отборы добавим новый элемент отбора.
  3. В дереве полей раскроем поле Подразделение (или Подразделение документа в зависимости от отчета) и выберем реквизит Наименование (путь: Подразделение.Наименование).
  4. Установим вид сравнения Заполнено.
  5. Сохраним вариант отчета и назначим его стандартным для пользователей с ограниченными правами.

Посмотрим на результат: строки, у которых подразделение недоступно текущему пользователю по RLS, вернут NULL в поле Подразделение.Наименование и условие Заполнено не выполнится. В итоге платформа исключит такие движения из отчета целиком, а пользователь не увидит ни чужих реализаций, ни надписи <Объект не найден>.

Второй вариант штатной настройки — задать жесткий отбор вида Подразделение В списке (...), где перечислить только подразделения текущего пользователя, и заблокировать редактирование этого отбора в пользовательском интерфейсе.

Способ 2. Доработка отчета через расширение конфигурации

Если требуется гарантировать исключение записей на уровне логики отчета, чтобы пользователи не могли случайно сбросить отборы, применим доработку схемы компоновки данных в расширении.

Рассмотрим, как модифицировать запрос схемы отчета. Для исключения запрещенных элементов соединим основную таблицу регистра с таблицей справочника подразделений с использованием конструкции ВЫБРАТЬ РАЗРЕШЕННЫЕ:


ВЫБРАТЬ
    ТоварыНаСкладах.Номенклатура КАК Номенклатура,
    ТоварыНаСкладах.Склад КАК Склад,
    ТоварыНаСкладах.КоличествоОстаток КАК КоличествоОстаток,
    СтруктураПредприятия.Ссылка КАК Подразделение
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, ) КАК ТоварыНаСкладах
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СтруктураПредприятия КАК СтруктураПредприятия
        ПО ТоварыНаСкладах.Подразделение = СтруктураПредприятия.Ссылка

Поскольку используется ВНУТРЕННЕЕ СОЕДИНЕНИЕ со справочником подразделений, платформа применит ограничения RLS справочника ко всей выборке. Записи с чужими подразделениями будут отсечены СУБД еще на этапе формирования набора данных.

Также можно использовать программную установку фиксированного отбора в модуле отчета в обработчике ПриКомпоновкеРезультата:


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

Способ 3. Проверка актуальности ключей доступа БСП

При использовании производительного режима RLS в 1С:Управление торговлей 11.5 важно помнить о механизме ключей доступа. Если права были настроены недавно или изменялись группы доступа, данные в служебных регистрах могут быть не актуализированы.

Выясним причину возможного расхождения прав:

  1. Перейдем в раздел НСИ и администрирование — Настройки пользователей и прав — Группы доступа.
  2. Убедимся, что включен производительный режим работы RLS.
  3. Проверим состояние регламентных заданий:
    • Обновление ключей доступа
    • Обновление прав доступа (производительный режим)
  4. Если регламентные задания завершились с ошибками или отключены, выполним их ручной запуск для принудительного пересчета таблиц прав.

Таким образом, штатное поведение типовой 1С:УТ 11.5 с выводом <Объект не найден> является следствием компромисса между детальностью проверки прав и общей скоростью системы. Наиболее простым и быстрым решением для типовой базы без изменения конфигурации остается наложение отбора по реквизиту Подразделение.Наименование Заполнено в настройках варианта отчета.

← На главную