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