Как добавить новый вид доступа RLS для справочника Статьи движения денежных средств в 1С:ERP

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

Ограничение доступа на уровне записей (RLS — Record Level Security) в современных типовых конфигурациях 1С, таких как ERP, Комплексная автоматизация или Управление торговлей, строится на базе БСП (Библиотеки стандартных подсистем). Использование стандартного механизма позволяет гибко управлять правами, однако добавление нового разреза (вида доступа), которого нет в коробке — например, ограничение по Статьям движения денежных средств (ДДС) — требует последовательного программирования как в конфигураторе, так и правильной настройки в режиме «1С:Предприятие».

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

Шаг 1. Регистрация нового типа в метаданных

Для того чтобы система БСП поняла, что новый справочник может выступать в качестве аналитики ограничения доступа, его необходимо добавить в соответствующий определяемый тип.

Выполним следующие действия в конфигураторе:

  1. Откроем дерево метаданных нашей конфигурации.
  2. Перейдем в ветку ОпределяемыеТипы и найдем тип ЗначениеДоступа.
  3. Этот тип является составным. Нам нужно открыть его свойства и установить флаг напротив нашего справочника — СправочникСсылка.СтатьиДвиженияДенежныхСредств.

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

Шаг 2. Регистрация вида доступа в программном коде БСП

После расширения типа данных необходимо зарегистрировать наш новый вид доступа в логике самой БСП. Для этого используется общий модуль УправлениеДоступомПереопределяемый.

Найдем в этом модуле процедуру ПриЗаполненииВидовДоступа и добавим описание нашего нового вида доступа. Рассмотрим пример кода:


Процедура ПриЗаполненииВидовДоступа(ВидыДоступа) Экспорт

    // Зарегистрируем новый вид доступа "Статьи движения ДС"
    ВидДоступа = ВидыДоступа.Добавить();
    ВидДоступа.Имя = "СтатьиДвиженияДенежныхСредств";
    ВидДоступа.Представление = НСтр("ru = 'Статьи движения денежных средств'");
    ВидДоступа.ТипЗначения   = Тип("СправочникСсылка.СтатьиДвиженияДенежныхСредств");
    
КонецПроцедуры

Благодаря этому коду система зарегистрирует новую аналитику, и она сможет отображаться в профилях групп доступа в пользовательском интерфейсе.

Шаг 3. Обновление параметров работы и запуск базы

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

Пропишем в параметрах запуска ярлыка или в конфигураторе на вкладке «Отладка» следующий ключ:

/С ЗапуститьОбновлениеИнформационнойБазы

После завершения процедуры обновления параметров системы в режиме «Предприятие» мы сможем зайти в меню Администрирование — Настройки пользователей и прав — Профили групп доступа, создать или открыть существующий профиль и увидеть на вкладке «Ограничения доступа» наш новый вид доступа: Статьи движения денежных средств. Здесь мы сможем настроить виды доступа, например, выбрав вариант «Все запрещены, исключения назначаются в группах доступа».

Шаг 4. Ограничение доступа к самому справочнику (настройка RLS в роли)

Теперь, когда пользовательские группы настроены, нам необходимо принудительно заставить систему фильтровать элементы справочника при открытии динамических списков или форм выбора.

Для этого создадим новую роль (или изменим существующую, которая дает доступ к чтению статей ДДС, например, мояРольДоступСтатьиДвиженияДС). У пользователя не должно быть других ролей, которые дают полное (неограниченное) чтение этого справочника. Помните важное правило RLS 1С: если хотя бы одна роль разрешает чтение без ограничений, то ограничения из других ролей действовать не будут!

Перейдем к настройке прав роли на чтение справочника СтатьиДвиженияДенежныхСредств. Нам нужно прописать ограничение доступа на уровне записей.

Рассмотрим два варианта решения этой задачи:

Вариант А. Использование стандартного шаблона БСП «ПоЗначениям»

Если в вашей роли на вкладке «Шаблоны ограничений» присутствует стандартный шаблон #ПоЗначениям, мы можем прописать лаконичную конструкцию для ограничения прав на чтение (поле <Прочие поля>):


#ПоЗначениям("Справочник.СтатьиДвиженияДенежныхСредств", "Чтение", "НеОграничиватьДоступКГруппам", "СтатьиДвиженияДенежныхСредств", "Ссылка", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "")

Разберем параметры этого шаблона по шагам:

Вариант Б. Использование прямого RLS-запроса (если шаблоны БСП недоступны)

Если в созданной вами роли отсутствуют стандартные шаблоны БСП или по каким-то причинам шаблонная сборка не отрабатывает, вы можете прописать прямой запрос ограничения прав на чтение. Ниже представлен проверенный практический пример такого запроса:


СтатьиДвиженияДенежныхСредств ГДЕ СтатьиДвиженияДенежныхСредств.Ссылка В
    (ВЫБРАТЬ
        СтатьиДвиженияДенежныхСредств.Ссылка КАК Ссылка
    ИЗ
        Справочник.СтатьиДвиженияДенежныхСредств КАК СтатьиДвиженияДенежныхСредств
    ГДЕ
        СтатьиДвиженияДенежныхСредств.ЭтоГруппа = ИСТИНА

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
        ГруппыДоступаЗначенияДоступа.ЗначениеДоступа
    ИЗ
        Справочник.ГруппыДоступа.ЗначенияДоступа КАК ГруппыДоступаЗначенияДоступа
    ГДЕ
        ГруппыДоступаЗначенияДоступа.Ссылка В
            (ВЫБРАТЬ
                ГруппыДоступаПользователи.Ссылка КАК ГруппаДоступа
            ИЗ
                Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи
            ГДЕ
                ГруппыДоступаПользователи.Пользователь = &АвторизованныйПользователь
                И ГруппыДоступаПользователи.Ссылка.Профиль В
                    (ВЫБРАТЬ
                        ПрофилиГруппДоступаРоли.Ссылка КАК Профиль
                    ИЗ
                        Справочник.ПрофилиГруппДоступа.Роли КАК ПрофилиГруппДоступаРоли
                    ГДЕ
                        ПрофилиГруппДоступаРоли.Role.Name = "мояРольДоступСтатьиДвиженияДС")))

Этот запрос проверяет принадлежность текущего авторизованного пользователя к группам доступа, у которых в настройках профиля (для роли мояРольДоступСтатьиДвиженияДС) прописаны разрешенные значения нашего справочника.

Шаг 5. Ограничение доступа к документам по статьям ДДС

После того как мы ограничили доступ к самому справочнику, возникнет логичный вопрос: пользователь не видит запрещенные статьи в справочнике, но по-прежнему может видеть документы (например, Платежное поручение или Списание с безналичных денежных средств), в которых эти статьи выбраны.

Выясним, как распространить RLS на документы:

  1. Перейдем в ту же роль мояРольДоступСтатьиДвиженияДС.
  2. Найдем нужный нам документ, права которого требуется ограничить (например, Документ.ПлатежноеПоручение).
  3. В правах на Чтение (в разделе ограничений) пропишем вызов шаблона, указав в качестве проверяемого реквизита поле документа, содержащее ссылку на статью ДДС.

Пример использования шаблона для документа:


#ПоЗначениям("Документ.ПлатежноеПоручение", "Чтение", "", "СтатьиДвиженияДенежныхСредств", "СтатьяДвиженияДенежныхСредств", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "")

Здесь система сопоставит значение в реквизите СтатьяДвиженияДенежныхСредств документа с правами текущего пользователя по виду доступа СтатьиДвиженияДенежныхСредств.

Аналогично, если вы используете прямой запрос без шаблонов, ограничение для документа будет выглядеть следующим образом:


ПлатежноеПоручение ГДЕ ПлатежноеПоручение.СтатьяДвиженияДенежныхСредств В
    (ВЫБРАТЬ
        ГруппыДоступаЗначенияДоступа.ЗначениеДоступа
    ИЗ
        Справочник.ГруппыДоступа.ЗначенияДоступа КАК ГруппыДоступаЗначенияДоступа
    ГДЕ
        ГруппыДоступаЗначенияДоступа.Ссылка В
...

Важные рекомендации по производительности

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

Таким образом, мы по шагам разобрали весь цикл внедрения нового вида доступа RLS в ERP: от описания типов в конфигураторе до прописывания условий ограничений на чтение таблиц баз данных.

← На главную