Как в 1С:Бухгалтерия 3.0 ограничить доступ к конкретному контрагенту для определенных пользователей?

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

В практике сопровождения 1С:Бухгалтерия предприятия 3.0 (БП 3.0) часто возникает специфическая задача: необходимо скрыть одного или нескольких контрагентов от основной массы пользователей, оставив доступ только ограниченному кругу лиц (например, руководству или главному бухгалтеру). При этом ограничение должно работать везде: в списках справочника, в документах и, что самое важное, в отчетах.

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

Способ 1. Использование встроенного механизма RLS (Ограничение на уровне записей)

Проанализируем самый правильный с точки зрения архитектуры 1С метод — использование механизма RLS (Row Level Security). В БП 3.0 этот функционал реализован через Библиотеку стандартных подсистем (БСП) и позволяет настраивать права доступа к конкретным записям справочников.

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

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

Выясним причину, почему этот способ считается приоритетным. Механизм RLS в БП 3.0 работает системно: если пользователю запрещен доступ к контрагенту, он не увидит его ни в справочнике, ни в Оборотно-сальдовой ведомости. Система автоматически добавит условия в запросы к базе данных. Для проверки назначенных прав и профилей подойдёт отчет по ограничениям пользователей и группам доступа.

Способ 2. Ограничение через механизм расширений

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

1. Скрытие из формы списка

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


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

2. Исключение из подбора в документах

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


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

Важные нюансы и последствия использования RLS

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

Рекомендация по выбору решения

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

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

← На главную