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