Как ограничить видимость номенклатуры в 1С:ERP без использования RLS?

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

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

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

Способ 1. Программная установка отборов в формах через расширение конфигурации

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

Рассмотрим по шагам реализацию этого механизма:

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

Посмотрим на пример программной установки отбора на динамический список:


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

Важный момент: установка свойства РежимОтображения в значение Недоступный скрывает элемент отбора из пользовательских настроек формы, что не позволяет оператору сбросить фильтрацию самостоятельно.

Способ 2. Блокировка быстрого ввода по строке через ОбработкаПолученияДанныхВыбора

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

Разберем реализацию в модуле менеджера справочника Номенклатура:

  1. Подключимся к событию ОбработкаПолученияДанныхВыбора через аннотацию &Вместо или &Перед в расширении.
  2. Сформируем собственный запрос к базе с учетом необходимых ограничений по видам, группам или свойствам номенклатуры.
  3. Заполним результирующий список значений и передадим его платформе, отключив стандартную обработку.

Посмотрим на пример реализации перехвата ввода по строке:


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

Способ 3. Использование специализированных форм подбора и типового функционала ERP

Проанализируем специфику конфигурации 1С:ERP. Во многих складских и торговых документах (например, в Заказе клиента или Реализации товаров и услуг) подбор товаров выполняется через специализированную обработку ПодборТоваровВДокументПродажи. Наложение отборов только на стандартную форму выбора справочника не повлияет на эту форму.

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

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

Контроль целостности данных и закрытие обходных путей

Интерфейсные ограничения скрывают элементы в формах, но не исключают программного добавления данных. Выясним, какие пути обхода необходимо проконтролировать дополнительно:

  1. Сканирование штрихкодов: обработка событий торгового оборудования добавляет строки напрямую в табличную часть. Если требуется запретить сканирование определенных товаров для отдельных ролей, необходимо встроить проверку в обработчик заполнения по штрихкоду.
  2. Копирование строк и загрузка из внешних файлов: при вставке номенклатуры через буфер обмена пользователь может обойти экранные фильтры. Чтобы заблокировать запись некорректного документа, добавим проверку в событие ОбработкаПроверкиЗаполнения документа или общую подписку на событие ПередЗаписью.
  3. Отчеты предприятия: в подсистеме вариантов отчетов настроим типовые варианты с предустановленными и заблокированными отборами по номенклатуре, отключив для пользователей права на произвольное изменение структуры отчетов.

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

← На главную