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

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

Часто в работе с 1С возникает задача: нам необходимо, чтобы некоторые элементы справочника были доступны только определенным пользователям или группам, или же, наоборот, чтобы часть элементов была скрыта для всех без исключения. Например, мы хотим скрыть устаревшие позиции номенклатуры или служебные записи, которые не должны отображаться в пользовательских формах.

Для решения этой задачи мы обратимся к мощному механизму 1С — Ограничению доступа на уровне записей (RLS). RLS позволяет нам ограничивать доступ не просто ко всему объекту метаданных (например, ко всему справочнику), но и к его отдельным частям – конкретным элементам, строкам табличных частей или документам. Это ключевое отличие от обычных ролей, которые определяют общие права на использование объектов конфигурации, но не на конкретные данные внутри них.

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

Решение проблемы с помощью RLS: пошаговая настройка

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

  1. Открываем конфигурацию в режиме Конфигуратор. Это наш основной инструмент для внесения изменений в структуру и логику работы системы.
  2. Находим ветку "Роли". В дереве объектов конфигурации, расположенном слева, мы увидим ветку Роли. Именно здесь хранятся все определения прав доступа в нашей информационной базе.
  3. Централизованное редактирование ограничений. Вместо того чтобы открывать каждую роль по отдельности и настраивать ограничения для нее (что может быть очень трудоемко, особенно если ролей много), мы воспользуемся более удобным способом. Щелкнем правой кнопкой мыши по самой ветке "Роли".
  4. Выбираем пункт "Открыть все роли". В контекстном меню, которое появится, выберем первый пункт, который обычно называется "Открыть все роли" или "Редактировать ограничения доступа всех ролей" (точное название может немного варьироваться в зависимости от версии платформы 1С). Этот инструмент значительно упрощает процесс, позволяя нам работать с ограничениями централизованно по всем ролям сразу.
  5. Находим целевой справочник. В открывшемся окне мы увидим список всех ролей и объектов конфигурации. Найдем наш целевой справочник, для элементов которого мы хотим установить ограничения.
  6. Настраиваем право "Чтение". Для выбранного справочника мы увидим различные права (Чтение, Добавление, Изменение, Удаление и т.д.). Нас интересует право Чтение, так как именно оно определяет видимость данных. Установим флажок для права "Чтение" (если он еще не установлен для всех ролей, к которым мы хотим применить ограничение) и затем нажмем кнопку "Настроить ограничение доступа" (или аналогичную кнопку рядом с полем "Чтение").
  7. Формируем условие RLS. В открывшемся окне мы будем формировать условие RLS. Это условие пишется на языке запросов 1С и определяет, какие записи справочника будут доступны пользователю. Например, если мы хотим скрыть элементы, помеченные на удаление, условие может выглядеть так:
    
    #Если &НаСервере Тогда
        ГДЕ НЕ Ссылка.ПометкаУдаления
    #КонецЕсли
    

    Давайте разберем этот пример. Условие ГДЕ НЕ Ссылка.ПометкаУдаления означает, что будут выбраны только те элементы справочника, у которых реквизит ПометкаУдаления имеет значение Ложь (то есть, они не помечены на удаление). Конструкция #Если &НаСервере Тогда ... #КонецЕсли обеспечивает выполнение этого условия на сервере 1С, что является стандартной практикой для RLS.

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

    
    #Если &НаСервере Тогда
        ГДЕ Ссылка.ВидНоменклатуры = &ПараметрВидНоменклатуры
    #КонецЕсли
    

    В этом случае, нам потребуется использовать параметры сеанса или другие механизмы для передачи значения &ПараметрВидНоменклатуры в условие RLS. Это позволяет создавать динамические ограничения, зависящие от текущего пользователя или других условий.

  8. Сохраняем изменения и обновляем базу данных. После того как условие RLS сформировано, сохраним изменения в конфигурации (через меню "Конфигурация" -> "Сохранить конфигурацию базы данных"). Затем обновим базу данных, чтобы изменения вступили в силу (через меню "Конфигурация" -> "Обновить конфигурацию базы данных").
  9. Проверяем результат. Теперь, когда пользователи войдут в систему, они будут видеть только те элементы справочника, которые соответствуют нашему условию RLS. Остальные элементы будут для них невидимы в формах, отчетах и не могут быть получены никаким запросом.

Подробнее о механизме RLS в 1С: принципы и особенности

Давайте углубимся в понимание RLS, чтобы использовать его максимально эффективно и осознанно.

Принцип работы RLS

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

Отличие RLS от ролей

Важно понимать разницу. Если роли определяют общие права на использование объектов конфигурации целиком (например, право на Чтение всего справочника Номенклатура), то RLS позволяет нам ограничить доступ к *части* данных внутри этих объектов. Например, мы можем разрешить пользователю видеть справочник Номенклатура, но только те элементы, которые относятся к определенной группе или складу.

Использование параметров сеанса

Для настройки динамических условий RLS очень удобно использовать параметры сеанса. Значения этих параметров устанавливаются при запуске сеанса пользователя (например, при входе в систему) и хранятся до его завершения. Это позволяет нам применять ограничения, которые зависят от текущего пользователя, его настроек или других условий, определенных в начале сеанса.

Объединение ролей и RLS

Если пользователю назначено несколько ролей, и каждая из этих ролей имеет настроенные ограничения доступа RLS на один и тот же объект, то эти ограничения суммируются по логическому условию "ИЛИ". То есть, если хотя бы одна роль разрешает доступ к записи, то пользователь эту запись увидит. Для упрощения управления и предотвращения нежелательных эффектов рекомендуется по возможности использовать одну роль с установленными ограничениями доступа для ограничиваемых объектов, либо тщательно продумывать логику пересечения прав.

Стандартные шаблоны RLS (БСП)

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

Производительный режим RLS

Механизм RLS может работать в двух режимах: стандартном и производительном. Производительный режим нацелен на повышение скорости выполнения запросов с ограничениями доступа за счет предварительного расчета прав доступа и их хранения в специальных таблицах (например, КлючиДоступа, КлючиДоступаКОбъектам, КлючиДоступаПользователей). Это делает фрагменты запросов в ролях более простыми и статичными, обеспечивая лучшую скорость работы. Однако, изменения в правах доступа вступают в силу с некоторой задержкой из-за необходимости предварительного расчета. Для использования производительного режима конфигурация должна быть на базе БСП 3.0.1 или выше, и должны быть включены соответствующие константы.

Влияние на производительность

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

Возможные ошибки и доработки

Некорректно написанные условия RLS могут приводить к ошибкам типа "Объект не найден" для пользователей, что может быть ошибочно воспринято как "битая ссылка". В сложных системах с большим количеством пользователей и объектов поддержка RLS может быть трудоемкой, поскольку шаблоны и роли могут накладываться друг на друга и конфликтовать. Иногда требуется доработка RLS, например, для расширения типовых ограничений доступа на другие реквизиты объекта или добавления новых ограничений к типовым объектам.

Ограничение доступа к полям (реквизитам)

Механизм RLS в основном оперирует записями (элементами, документами) целиком, а не отдельными реквизитами. Прямое ограничение чтения значения конкретного реквизита (например, скрытие поля "Оклад" в справочнике "Сотрудники") только с помощью RLS является сложной задачей и может потребовать особых подходов, таких как выборочное предоставление прав на чтение только определенных полей (Ссылка, Наименование) через метаданные, что не всегда удобно и применимо.

Почему "Пометка удаления" не является полноценным решением для ограничения видимости

На форумах иногда встречается идея использовать "Пометку удаления" как способ скрыть элементы. Давайте проанализируем эту ситуацию.

Действительно, мы можем настроить параметры выбора в формах таким образом, чтобы они не показывали элементы, помеченные на удаление. Например, в параметрах выбора для поля ввода мы можем указать: НеПомеченныеНаУдаление.

Однако, это не является полноценным механизмом ограничения видимости. Вот почему:

  1. Ограничивает только формы выбора: Такой подход работает только в тех местах, где явно настроены параметры выбора. Если пользователь откроет весь справочник, сформирует отчет или выполнит произвольный запрос, он все равно увидит все элементы, включая помеченные на удаление.
  2. Не влияет на программный доступ: Программный код сможет получить доступ к помеченным на удаление элементам без каких-либо препятствий.
  3. Не является механизмом безопасности: "Пометка удаления" – это служебный признак для последующего удаления объекта, а не механизм контроля доступа. Он не предназначен для обеспечения конфиденциальности или безопасности данных.

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

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

← К списку