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