Как ограничить чтение элементов справочника Номенклатура в 1С при использовании производительного режима RLS?

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

Ограничение прав доступа на уровне записей (RLS) в современных конфигурациях 1С, работающих на базе БСП (Библиотека стандартных подсистем), — это сложная архитектурная задача. Особенно остро проблема встает, когда требуется не просто запретить редактирование, а полностью скрыть определенные элементы справочника Номенклатура от глаз пользователя. Рассмотрим, с какими трудностями мы можем столкнуться, разберем причины возникновения ошибок и проанализируем наиболее эффективные пути решения этой задачи.

Анализ проблемы производительного режима RLS

В современных версиях БСП используется так называемый «Производительный режим» управления доступом. Его ключевая особенность заключается в том, что система не вычисляет права «на лету» при каждом запросе, а использует заранее рассчитанные данные, хранящиеся в специальных регистрах (например, РегистрСведений.КлючиДоступаКОбъектам). Когда мы пытаемся ограничить чтение базового справочника, такого как Номенклатура, мы вмешиваемся в работу фундаментального узла системы.

Разберем типичную ситуацию: вы настроили ограничения, и на первый взгляд все работает — в списке справочника лишние позиции исчезли. Однако при попытке найти товар в документе или ввести его название в поле ввода, система выдает критическую ошибку: «У пользователя недостаточно прав на исполнение операции над базой данных». Выясним, почему это происходит.

Причина ошибки в обработчиках получения данных выбора

Проанализируем работу платформы в момент интерактивного подбора. В большинстве типовых решений (УНФ, ERP, КА) для справочника Номенклатура переопределен стандартный поиск. Он выполняется в процедуре ОбработкаПолученияДанныхВыбора в модуле менеджера справочника.

Основная проблема заключается в том, что разработчики типовых конфигураций часто используют прямые запросы к базе данных для ускорения поиска, но при этом опускают ключевое слово РАЗРЕШЕННЫЕ. Логика проста: номенклатура считается базовой нормативно-справочной информацией (НСИ), которая должна быть доступна всем хотя бы на чтение. Рассмотрим пример проблемного кода, который часто встречается в типовых решениях:


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

Чтобы исправить эту ситуацию, нам необходимо использовать механизм расширений конфигурации. Мы должны перехватить выполнение этой процедуры и добавить в текст запроса заветное слово РАЗРЕШЕННЫЕ. Однако, проанализировав конфигурацию, мы увидим, что таких мест могут быть сотни: отчеты, обработки подбора, динамические списки с произвольными запросами и экспортные функции в общих модулях.

Проблема «Битых ссылок» и целостности данных

Посмотрим на ситуацию с точки зрения пользователя, который открывает старый документ (например, «Заказ покупателя»), в котором выбрана номенклатура, теперь ставшая для него запрещенной. Вместо понятного названия товара он увидит надпись «Объект не найден <...>».

Это не просто эстетическая проблема. Проанализируем последствия:

  1. Невозможность перепроведения: Если в коде проведения документа (или в подписках на события) есть обращение к реквизитам этой номенклатуры через точку (Строка.Номенклатура.СтавкаНДС), система выдаст ошибку прав доступа, и документ не будет проведен.
  2. Ошибки в отчетах: Группировки по номенклатуре в отчетах превратятся в кашу из «Объектов не найденных», что сделает отчетность бесполезной для данного пользователя.
  3. Дублирование данных: Если пользователь не видит элемент в справочнике, он с большой вероятностью создаст его дубль, что приведет к деградации качества базы данных.

Альтернативный подход: Ограничение доступа к Спецификациям

Часто задача скрыть номенклатуру продиктована желанием защитить интеллектуальную собственность — состав изделия. Рассмотрим более рациональный путь, предложенный в обсуждении. Вместо того чтобы «ломать» всю систему, ограничивая базовый справочник Номенклатура, сосредоточимся на справочнике Спецификации.

Спецификации значительно проще ограничивать по следующим причинам:

Реализация через «костыль» с дополнительным реквизитом

Если же скрыть номенклатуру жизненно необходимо, разберем вариант с добавлением собственного признака доступа. Допустим, мы добавили в справочник реквизит СекретнаяНоменклатура (тип Булево).

Чтобы это заработало в производительном режиме RLS, нам потребуется выполнить следующие шаги:

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

Рассмотрим пример кода, который может потребоваться для принудительного обновления прав после программного изменения реквизита:


// Пример вызова обновления ключей доступа для конкретного объекта
УправлениеДоступом.ОбновитьКлючиДоступа(СсылкаНаНоменклатуру);

Итоговые рекомендации

Проанализировав все за и против, мы приходим к выводу, что полное скрытие номенклатуры на чтение в типовых решениях — это крайняя мера, ведущая к значительным затратам на поддержку.

Рекомендуемая стратегия действий:

Помните, что использование RLS на чтение для справочников с десятками тысяч записей неизбежно приведет к замедлению работы системы, так как SQL-серверу придется выполнять сложные соединения с таблицами прав при каждом обращении к данным.

← На главную