Каким образом можно скрыть элементы справочника в базе 1С?

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

В процессе эксплуатации учетных систем, особенно таких нагруженных, как 1С:Управление торговлей 11.4, часто возникает задача ограничить видимость определенных элементов справочника (например, Номенклатура или Контрагенты) для конкретных пользователей. Это может быть связано с конфиденциальностью данных, выводом старых позиций из оборота или спецификой работы различных отделов. Рассмотрим подробно, как решить эту задачу, начиная от штатных средств конфигурации и заканчивая программными методами через расширения.

Метод 1. Использование штатного функционала «Группы доступа номенклатуры»

Прежде чем приступать к программированию, проанализируем типовые возможности конфигурации УТ 11.4. Разработчики 1С уже предусмотрели механизм ограничения доступа на уровне записей (RLS), который можно настроить в пользовательском режиме.

Разберем по шагам, как активировать и настроить этот механизм:

  1. Перейдем в раздел НСИ и администрирование — Настройка пользователей и прав.
  2. Установим флаг Ограничивать доступ на уровне записей.
  3. В справочнике Группы доступа номенклатуры создадим группы (например, «Скрытая номенклатура» и «Общая номенклатура»).
  4. В карточке каждого товара в поле Группа доступа укажем соответствующее значение.
  5. Настроим Профили групп доступа. Для тех ролей, которым не нужно видеть определенный товар, мы просто не включаем нужную группу доступа в разрешенные значения.

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

Метод 2. Программная фильтрация в формах списка через расширение

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

Создадим расширение и добавим в него форму списка нужного справочника. Нам необходимо наложить фильтр на ДинамическийСписок. Самый надежный способ — использовать Фиксированные настройки компоновщика настроек. Проанализируем пример кода в обработчике ПриСозданииНаСервере:


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

Этот метод хорош тем, что он «жестко» фиксирует отбор. Даже если пользователь нажмет кнопку «Настроить список» и попытается сбросить фильтры, фиксированные настройки останутся в силе.

Метод 3. Ограничение через обработчик получения данных выбора

Рассмотрим ситуацию, о которой упоминалось в обсуждении: пользователь может не видеть товар в списке, но может начать вводить его наименование прямо в поле ввода документа (так называемый «быстрый поиск»). Чтобы закрыть эту лазейку, нам нужно вмешаться в работу модуля менеджера справочника.

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


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

Использование этого метода гарантирует, что «нежелательные» элементы не появятся в выпадающем списке при наборе текста в документах.

Риски и последствия скрытия элементов

Разберем ситуацию, которая часто становится сюрпризом для разработчика: что произойдет с уже существующими документами и отчетами? Проанализируем возможные проблемы:

  1. «Бьющиеся» ссылки: Если мы скрыли элемент через RLS, то в старых документах, где этот элемент уже выбран, пользователь увидит надпись Объект не найден (8...:...). Это может напугать бухгалтерию или складских работников, создав иллюзию повреждения базы данных.
  2. Расхождения в отчетах: Представим отчет по остаткам на складах. Если часть номенклатуры скрыта, общая сумма остатков может не совпадать с суммой по видимым строкам. Пользователь видит общую сумму 1000 рублей, но сложив видимые позиции, получает 800 рублей. Это вызывает закономерные вопросы и недоверие к системе.
  3. Сложность отладки: При возникновении ошибок (например, не проводится документ из-за нехватки остатка скрытого товара) программисту будет сложнее диагностировать причину, так как в интерфейсе пользователя «проблемного» товара просто нет.

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

Выясним, какой путь выбрать в зависимости от задачи:

Если задача стоит глобально (полный запрет доступа к данным в любом месте системы), используйте RLS и Группы доступа номенклатуры. Это наиболее корректный с точки зрения безопасности путь, поддерживаемый фирмой 1С.

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

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

← На главную