Почему не работает ограничение доступа (RLS) по подразделениям в 1С:Бухгалтерия предприятия КОРП и как это исправить?

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

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

Анализ проблемы: почему стандартные настройки не дают результата?

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

Выясним причину этого явления. Основная проблема заключается в архитектуре RLS (Row-Level Security) в БП КОРП. В отличие от таких тяжелых решений, как «1С:ERP» или «1С:Комплексная автоматизация», в «Бухгалтерии предприятия КОРП» механизм RLS по подразделениям реализован не полностью. Константы и элементы интерфейса заимствованы из БСП (Библиотеки стандартных подсистем), но в самих метаданных конфигурации (в ролях) отсутствуют шаблоны ограничений, которые бы использовали эти данные.

Проанализируем это с технической точки зрения. Чтобы ограничение заработало, в Конфигураторе у конкретной роли (например, ЧтениеДокументов) для объекта метаданных (например, Документ.РеализацияТоваровУслуг) на уровне права «Чтение» должен быть прописан запрос-шаблон. В БП КОРП такие шаблоны прописаны для разреза Организации, но практически полностью отсутствуют для разреза Подразделения. Таким образом, система «видит» ваше желание ограничить доступ, но не знает, по какому полю в базе данных это делать, так как в ролях нет соответствующей инструкции.

Проверка ролей и поиск «открытых» прав

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

Посмотрим, как проверить наличие таких ролей в Конфигураторе:

  1. Откроем Конфигуратор и найдем интересующий нас документ (например, ПоступлениеТоваровУслуг).
  2. Перейдем на вкладку «Права».
  3. Выберем роль, назначенную пользователю.
  4. Посмотрим на право «Чтение». Если в нижней части окна (Ограничение доступа к данным) пусто или прописаны шаблоны только по Организациям, то ограничение по подразделениям работать не будет.

Если вы видите, что в роли установлен доступ «Группы доступа не используются» или прописано только #ПоОрганизациям, это подтверждает, что данная роль дает полный доступ к подразделениям.

Решение №1: Использование обособленных подразделений (Методологическое)

Прежде чем приступать к программированию, рассмотрим вариант, не требующий изменения кода. В версии КОРП реализован полноценный учет по обособленным подразделениям. Если подразделение организации выделить на отдельный баланс, оно заводится в справочнике Организации как подчиненный элемент.

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

Решение №2: Доработка RLS через расширение конфигурации (Техническое)

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

Рассмотрим алгоритм действий программиста:

  1. Создадим новое расширение и добавим в него необходимые роли и документы.
  2. В ролях для права «Чтение» (и, если нужно, «Изменение») пропишем текст ограничения.
  3. Используем стандартный шаблон БСП #ПоПодразделениям, если он определен в конфигурации, либо напишем собственный запрос.

Пример логики запроса в шаблоне RLS для документа (упрощенно):


ГДЕ Подразделение В (ВЫБРАТЬ Значение ИЗ ТаблицаДоступаПользователя ГДЕ Тип = "Подразделения")
ИЛИ Подразделение = ЗНАЧЕНИЕ(Справочник.ПодразделенияОрганизаций.ПустаяСсылка)

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

Почему 1С оставила константу «для красоты»?

Как отмечают специалисты, константа Ограничивать доступ на уровне записей подразделения организаций была введена в БП КОРП в рамках унификации с другими конфигурациями на базе БСП и для реализации некоторых узкоспециализированных задач (например, для обмена данными или работы определенных внутренних механизмов в модулях учета зарплаты, которые в КОРП расширены). Однако полноценное «наполнение» всех бухгалтерских ролей шаблонами по подразделениям не было приоритетной задачей вендора, так как основным разрезом в бухгалтерии считается юридическое лицо (организация).

Итоги и рекомендации

Подведем итог нашему исследованию. Если вам требуется ограничить доступ по подразделениям в БП КОРП, выполните следующие шаги:

  1. Убедитесь, что пользователю не назначены «лишние» полные роли. Помните, что роль ПолныеПрава игнорирует любые RLS.
  2. Рассмотрите возможность перевода подразделений в статус обособленных (на балансе или вне баланса) через справочник Организации. Это самый стабильный и быстрый способ.
  3. Если первый вариант не подходит, подготовьте расширение. Вам потребуется добавить шаблоны ограничений в роли для всех ключевых документов (Реализации, Поступления, ПКО, РКО, Счета и т.д.).
  4. После внесения изменений в роли не забудьте запустить регламентное задание Обновление прав доступа оперативное или дождаться его выполнения, чтобы таблицы дескрипторов прав обновились.

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

← На главную