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