Как реализовать динамическое ограничение списка номенклатуры через RLS при вводе артикула?

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

В процессе разработки учетных систем на платформе 1С:Предприятие 8.3 часто возникает задача упрощения интерфейса для конечного пользователя. Типичный пример: врач в клинике или узкоспециализированный менеджер, работающий всего с парой позиций из огромного прайс-листа, насчитывающего десятки тысяч наименований. Стандартный поиск и выбор номенклатуры превращаются в «пляски с бубном», когда среди сотен «Приемов терапевта» нужно найти именно свой. Рассмотрим, как реализовать механизм, при котором пользователь видит только «свою» номенклатуру, но может мгновенно расширить этот список, просто введя точный артикул товара.

Анализ концепции динамического ограничения

Традиционный подход RLS (Record Level Security) предназначен для жесткого разграничения прав доступа. Однако мы проанализируем ситуацию, где RLS выступает инструментом эргономики. Суть идеи заключается в следующем: создается вспомогательный регистр сведений ДоступнаяНоменклатура, в котором хранятся связи Пользователь — Номенклатура. В настройках прав доступа для справочника Номенклатура прописывается условие, которое разрешает чтение только тех элементов, которые присутствуют в этом регистре для текущего пользователя.

Главная сложность — как наполнять этот регистр? Мы разберем способ автоматического добавления прав «на лету». Если пользователь вводит в поле ввода полный артикул, система должна найти этот элемент в привилегированном режиме и, если он найден, добавить его в список разрешенных. Таким образом, список доступных позиций растет органически по мере работы пользователя.

Реализация через событие ОбработкаПолученияДанныхВыбора

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

Разберем по шагам логику внутри этого события:

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

Рассмотрим пример кода в модуле менеджера:


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

Настройка RLS в роли пользователя

После того как механизм наполнения регистра готов, нам необходимо настроить само ограничение. В роли, назначенной пользователю, для объекта Справочник.Номенклатура на право Чтение прописываем ГДЕ-условие.

Проанализируем текст запроса для ограничения доступа:


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

Важный момент: использование оператора В (ВЫБРАТЬ...) может негативно сказаться на производительности, если справочник или регистр содержат миллионы записей. Для оптимизации убедитесь, что в регистре сведений ДоступнаяНоменклатура измерениями являются Пользователь и Номенклатура, причем Пользователь стоит первым в списке измерений для корректного использования индексов.

Риски и особенности эксплуатации

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

  1. Отчеты и проведение документов. Если ограничение действует на чтение, то в отчетах пользователь увидит только те позиции, которые он «активировал». Это может привести к некорректным итогам в глазах пользователя. Для решения этой проблемы отчеты часто переводят в привилегированный режим исполнения.
  2. Программный поиск. Любой программный код, исполняемый от имени пользователя (например, заполнение по умолчанию), будет спотыкаться об это ограничение. Будьте готовы использовать УстановитьПривилегированныйРежим(Истина) в модулях объектов.
  3. Форма выбора. Если пользователь нажмет кнопку «Показать все», он увидит пустой или сильно усеченный список. Событие ОбработкаПолученияДанныхВыбора работает только при вводе текста в поле. Для полноценной работы придется также настраивать параметры выбора или динамический список в самой форме выбора справочника.
  4. Кэширование прав. Платформа 1С кэширует результаты запросов RLS. При добавлении новой записи в регистр прав обновление видимости может произойти не мгновенно, хотя в последних версиях платформы 8.3 этот механизм работает достаточно оперативно.

Альтернативные варианты реализации

Выясним, существуют ли более простые способы решения задачи, не прибегая к RLS:

1. Использование избранного и истории выбора

В современных управляемых формах платформа автоматически сохраняет историю последних выбранных элементов. Для многих пользователей этого достаточно. Также можно обучить сотрудников пользоваться механизмом «Избранное» (звездочка в заголовке формы или элемента), что позволяет быстро находить нужные позиции без программирования.

2. Настройка динамических списков

Вместо RLS можно наложить фильтр непосредственно на динамический список в форме выбора. Это «мягкое» ограничение, которое не мешает работе системы в целом, но скрывает «лишнее» в интерфейсе. В этом случае в ПриСозданииНаСервере формы выбора можно программно устанавливать отбор по тому же регистру сведений.

3. Шаблоны и АРМ

Для врачей и других специалистов с узким кругом задач эффективнее создать специализированное рабочее место (АРМ). На такой форме можно разместить кнопки для быстрого выбора самых популярных услуг. Это полностью снимает проблему поиска в справочнике Номенклатура.

Подведем итог: использование динамического RLS через артикул — это мощный инструмент кастомизации интерфейса под нужды пользователя. Он позволяет совместить строгость ограничений и гибкость поиска, однако требует внимательного отношения к производительности системы и корректности работы отчетов.

← На главную