В процессе разработки учетных систем на платформе 1С:Предприятие 8.3 часто возникает задача упрощения интерфейса для конечного пользователя. Типичный пример: врач в клинике или узкоспециализированный менеджер, работающий всего с парой позиций из огромного прайс-листа, насчитывающего десятки тысяч наименований. Стандартный поиск и выбор номенклатуры превращаются в «пляски с бубном», когда среди сотен «Приемов терапевта» нужно найти именно свой. Рассмотрим, как реализовать механизм, при котором пользователь видит только «свою» номенклатуру, но может мгновенно расширить этот список, просто введя точный артикул товара.
Традиционный подход RLS (Record Level Security) предназначен для жесткого разграничения прав доступа. Однако мы проанализируем ситуацию, где RLS выступает инструментом эргономики. Суть идеи заключается в следующем: создается вспомогательный регистр сведений ДоступнаяНоменклатура, в котором хранятся связи Пользователь — Номенклатура. В настройках прав доступа для справочника Номенклатура прописывается условие, которое разрешает чтение только тех элементов, которые присутствуют в этом регистре для текущего пользователя.
Главная сложность — как наполнять этот регистр? Мы разберем способ автоматического добавления прав «на лету». Если пользователь вводит в поле ввода полный артикул, система должна найти этот элемент в привилегированном режиме и, если он найден, добавить его в список разрешенных. Таким образом, список доступных позиций растет органически по мере работы пользователя.
Основным инструментом для перехвата ввода пользователя в управляемых формах является обработчик ОбработкаПолученияДанныхВыбора в модуле менеджера справочника Номенклатура. Проанализируем, как должен выглядеть код для реализации нашей задачи.
Разберем по шагам логику внутри этого события:
RLS.ДоступнаяНоменклатура.RLS уже не будет скрывать найденный элемент.Рассмотрим пример кода в модуле менеджера:
Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
ТекстПоиска = Параметры.СтрокаПоиска;
Если ЗначениеЗаполнено(ТекстПоиска) Тогда
УстановитьПривилегированныйРежим(Истина);
// Пытаемся найти номенклатуру по артикулу (точное совпадение)
СсылкаНаНоменклатуру = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", ТекстПоиска);
Если Не СсылкаНаНоменклатуру.Пустая() Тогда
// Записываем в регистр разрешенных элементов
МенеджерЗаписи = РегистрыСведений.ДоступнаяНоменклатура.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Пользователь = Пользователи.ТекущийПользователь();
МенеджерЗаписи.Номенклатура = СсылкаНаНоменклатуру;
МенеджерЗаписи.Прочитать();
Если Не МенеджерЗаписи.Выбран() Тогда
МенеджерЗаписи.Пользователь = Пользователи.ТекущийПользователь();
МенеджерЗаписи.Номенклатура = СсылкаНаНоменклатуру;
МенеджерЗаписи.Записать();
КонецЕсли;
КонецЕсли;
УстановитьПривилегированныйРежим(Ложь);
КонецЕсли;
КонецПроцедуры
После того как механизм наполнения регистра готов, нам необходимо настроить само ограничение. В роли, назначенной пользователю, для объекта Справочник.Номенклатура на право Чтение прописываем ГДЕ-условие.
Проанализируем текст запроса для ограничения доступа:
Номенклатура ГДЕ Ссылка В (
ВЫБРАТЬ
Т.Номенклатура
ИЗ
РегистрСведений.ДоступнаяНоменклатура КАК Т
ГДЕ
Т.Пользователь = &ТекущийПользователь
)
Важный момент: использование оператора В (ВЫБРАТЬ...) может негативно сказаться на производительности, если справочник или регистр содержат миллионы записей. Для оптимизации убедитесь, что в регистре сведений ДоступнаяНоменклатура измерениями являются Пользователь и Номенклатура, причем Пользователь стоит первым в списке измерений для корректного использования индексов.
Рассмотрим подводные камни, с которыми можно столкнуться при использовании динамического RLS:
УстановитьПривилегированныйРежим(Истина) в модулях объектов.ОбработкаПолученияДанныхВыбора работает только при вводе текста в поле. Для полноценной работы придется также настраивать параметры выбора или динамический список в самой форме выбора справочника.RLS. При добавлении новой записи в регистр прав обновление видимости может произойти не мгновенно, хотя в последних версиях платформы 8.3 этот механизм работает достаточно оперативно.Выясним, существуют ли более простые способы решения задачи, не прибегая к RLS:
В современных управляемых формах платформа автоматически сохраняет историю последних выбранных элементов. Для многих пользователей этого достаточно. Также можно обучить сотрудников пользоваться механизмом «Избранное» (звездочка в заголовке формы или элемента), что позволяет быстро находить нужные позиции без программирования.
Вместо RLS можно наложить фильтр непосредственно на динамический список в форме выбора. Это «мягкое» ограничение, которое не мешает работе системы в целом, но скрывает «лишнее» в интерфейсе. В этом случае в ПриСозданииНаСервере формы выбора можно программно устанавливать отбор по тому же регистру сведений.
Для врачей и других специалистов с узким кругом задач эффективнее создать специализированное рабочее место (АРМ). На такой форме можно разместить кнопки для быстрого выбора самых популярных услуг. Это полностью снимает проблему поиска в справочнике Номенклатура.
Подведем итог: использование динамического RLS через артикул — это мощный инструмент кастомизации интерфейса под нужды пользователя. Он позволяет совместить строгость ограничений и гибкость поиска, однако требует внимательного отношения к производительности системы и корректности работы отчетов.