Подсистема прав доступа (анализ ролей, отладка RLS, английский код, обычные и управляемые формы)
Администрирование - Роли и права
Файлы
ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.
Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний
Оформите подписку на компанию для решения рабочих задач
Оформить подписку и скачать решение со скидкойВы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
Немного про проблемы, которые мы хотели решить этой подсистемой
Представим себе ситуацию, что у нас есть некая конфигурация, типовая, или нет – не важно. И представим себе, что у нас реально возникает много проблем, связанных с ролями. Ну как минимум, давайте перечислим основные:
- Нельзя прочитать RLS, т.е. внедренец ставя ограничение на роль – вообще без понятия о том, что там эта роль реально ограничивает и по каким правилам. Например, есть некая роль:

Глядя на нее в конфигураторе - можно прочитать текст ограничения, и понять, как оно сработает.
- Роли, при наличии БСП, хоть и являются «универсальными», однако, они все равно не перекрывают все потребности. А особую сложность в понимании несут роли, которые дают доступ к разным объектам. Т.е. надо четко уметь отделить некое право, и посмотреть – какие роли его дают. В идеале – одна роль, дает одно право.
- В конфигурациях бывают баги, а бывают тонкости, про которые далеко не все знают, например, одна роль на чтение может иметь РЛС на некий справочник, а совсем левая роль на изменение (от другой подсистемы), может к этому справочнику давать безусловное чтение. Баг это, или фича, не важно, но такое есть, и хорошо бы такое отлавливать.
- Отдельное счастье – отладка RLS, что сейчас в принципе невозможно, так как язык RLS – он не тот же самый язык 1С (BSL), и просто написать – не всегда получится.
- Любое изменение роли – требует лезть в конфигуратор. Любое добавление – роли, надо идти в конфигуратор, надо тестировать под пользователем, открывать все параметры сеансов, смотреть что где, в общем трешь.
- И когда выходит обновление конфы – надо перепроверять, не обновились ли шаблоны, и если они обновились, то тогда надо вот в те новые 10 ролей идти, и перекидывать шаблоны, обновлять каждую роль.
- История изменения ролей. Кто, когда, зачем и на кой черт попросил что-то поправить. Т.е. т.к. роли добавляет программист, то он берет все входные данные и группирует их, а потом идет делает новые роли, или модификацию предыдущих, и вот потом разобраться – зачем была та или иная модификация, или же – какая модификация была на какую-то там дату – это не реально, разве что в задачниках, но и там надо каждый чих отслеживать, и как-то группировать, чтобы найти.
- Ну и мой самый любимый прикол – это когда тебе попадается в руки УТ10, УТП и им подобные, где уже никто ничего не понимает, что творится в ролях, никакого анализа адекватного нету, и пользователей просто создают «по аналогии», так как там изначально всего десяток ролей.
- И куча всякого другого…
Принятое решение
Итого, была поставлена задача по написанию принципиально нового подхода к разработке ролей:
- Это будет внешняя подсистема, отсутствие которой никак не скажется на конфигурацию. Т.е. модульность.
- Подсистема должна быть универсальной, и не привязываться, практически ни к каким модулям конфигурации или ее объектам.
- Основные функции системы – анализ ролей, отладка правил, создание новых ролей, хранение истории изменения ролей и т.д.
И такая подсистема была создана.
Вся суть работы с подсистемой - описывается в пару шагов:
1. Подключение расширения к конфигурации
2. Загрузка ролей из XML
3. Создание новых ролей
4. Авто генерация нового расширения с новыми ролями
5. Назначение новых ролей пользователю теми же механизмами, которыми назначаются новые роли просто созданные в конфигураторе.
Как это все выглядит?
1. Подключается новое расширение, возьмем для примера УТ11:

- Параметры, пока оставим их, но суть в том, что можно создавать свои параметры сеанса.
- Пользователи – это просто сам справочник пользователей, из основной конфигурации.
- Профили доступа – этот справочник, по сути, аналогичен типовым из БСП, там просто есть таблица с ролями, и это позволяет комбинировать роли для конкретного пользователя, например.
- Роли доступа — это справочник самих ролей, вот прям ролей, которые есть в конфигурации.
- Шаблоны – это шаблоны ролей. У 1С в конфигурации нет единого объекта шаблонов ролей, а на каждую роль – идет свое, однако, в нашем случае – это единый общий справочник.
- Отчет, который позволяет проанализировать роли.
- Загрузка данных ролей из XML.
- Конвертация шаблонов в код BSL.
- Генерация и подключения расширения с новыми ролями.
- Используется для обычных форм, это просто обработка с теми же 3 кнопками, что и выше.
2. Идем в опцию загрузки ролей "Загрузка данных ролей из XML" , и загружаем роли:
При открытии - программа определит текущее подключение и заполнит настройки:

Можно указать и другие настройки, если выгрузка идет с другой базы, например.
При загрузке, если что-то пойдет не так, то программа покажет лог. Status отличный от нуля - значит произошла ошибка.
Если есть ранее выгруженная конфигурация в XML файлы (это можно сделать зайдя в конфигуратор, и выбрав меню "Конфигурация - Выгрузить конфигурацию в файлы", или же есть конфигурация в исходниках формата EDT, то можно выбрать третий пункт - "XML файлы конфигурации" и указать путь к верхней папке, т.е. внутри этот папки должна быть папка Roles, по сути, только она и нужна, остальные папки не сканируются.

3. Теперь можно провести анализ ролей. Давайте откроем какую-то роль, и посмотрим - что там?

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

Это то место, где можно проводить точечный анализ роли, или, создать новую роль, или же - модифицировать ранее созданную.
По умолчанию - выводятся только те объекты, к которым дан доступ, однако, если надо добавить объекты, то в этом случае - можно выбрать опцию "Все объекты" и нажать кнопочку "Обновить права", тогда матрица перестроится.
И вот тут у нас есть много всего рассказать людям, про проблемы, с которыми мы столкнулись, как решали, и какие решить не смогли.
В основном, все проблемы крутятся в данном случае вокруг того, что для 1С тут слишком много данных выводится, например, в случае УТ11, если показать все объекты, то программа должна будет вывести 35 000 строк объектов, и все это умноженное на 86 колонок, или, другими словами - около 3 000 000 ячеек.
4. Справочник профилей
На самом деле - это справочник, в котором просто собираются разные роли, по типу такого же справочника в типовых, на БСП. Однако, этот справочник более ничего не делает. Он позволяет только делать анализ.
Если конфигурация написана на БСП, то в этом случае - можно скопировать профили из текущей конфигурации сюда, для этого есть специальная кнопка:

И давайте откроем любой профиль:

Тут видно, что есть галочки разных вариантов, простая галочка - говорит что доступ к этому праву этого объекта дает ТОЛЬКО ОДНА роль. Что по-хорошему и должно быть.
В случае галочки в черном квадрате - это значит, что несколько ролей дают доступ, причем как видите - ниже пишется сам RLS, который ограничивает чтение. Однако, обратите внимание на то, что роль перечеркнута - это значит, что одна из ролей которая дает доступ к этому объекту по этому праву - не имеет RLS, т.е. в этом профиле - не будет действовать ограничение по этому регистру на чтение.
Так же - справа подсвечиваются зеленым цветом те роли, которые, собственно, и дают это самое право.
5. Отчет по правам доступа
Однако, очень часто возникают задачи - узнать, какие роли дают право доступа к конкретному объекту, и с какими ограничениями.
Например, прилетела задача - нам надо сделать пользователю роль, где он сможет читать возвраты клиентов с отбором по подразделению. Возникает вопрос - а есть ли вообще такая роль?
Значит идем, и формируем отчет:

Указывает часть пути к объекту, который нас интересует, это может быть любая часть из примера строки:
InformationRegister.ОчередьСообщенийИСМП.StandardAttribute.Active
Т.е. идет поиск по вхождению, и есть стоит отдельное право на разрешение или запрет чтения реквизита, то и по реквизитам тоже поиск может делать.
Далее можем указать подтип объекта, это имеет смысл делать если нас интересуют права на реквизиты, табличные части и т.д.
После этого можем указать тип объекта - документ, справочник и т.д.
И в завершение можем указать само право. Что мы и сделаем, так как вывелось сильно много информации.
Тогда отчет будет выглядеть вот так:

Тут сразу видно - какие роли дают доступ к документу, в каких профилях они находятся, и какие RLS их ограничивают.
Т.е. сразу понятно - что к чему.
И мы сразу видим, что роль, которая нас интересует - это роли ДобавлениеИзменениеВозвратовТоваровОтКлиентов или ЧтениеВозвратовТоваровОтКлиентов.
6. Анализ и дебаг RLS
Все было бы скучно, если бы мы ограничились только просмотром, а что если нам поставили задачу, и сказали - сделайте ограничение, чтобы некий пользователь мог видеть только заказы, вне статуса Закрыт. Т.е. все не закрытые заказы. Это на самом деле становится не редкой задачей, в связи с мобильным клиентом, когда надо максимум всего скрыть в угоду производительности.
И тут у нас два пути - первый, если мы говорим про БСП, то все сделать стандартами ограничения БСП, где прописать параметр ограничения, сделать запуск обновления и кучу всяких других действий, а можем пойти просто - скопировать роль, и просто дописать в ней условие.
По такому же принципу как и ранее - мы находим нужную нам роль, это будет роль - ДобавлениеИзменениеЗаказовКлиентов.
Копирую роль в справочнике ролей и пишу другое название, например - ДобавлениеИзменениеЗаказовКлиентовСЧтениемПоСтатусу, и не забываю переименовать на вкладке наименований, а то иначе у меня будет две роли с один и тем же синонимом.
Идем в матрицу ролей, находим нужное место и видим RLS:

Нам надо дописать условие, и если мы четко знаем как это сделать - то можем это написать прям тут. Однако, я не помню где и как это прописывать. Допустим, я хочу задать вот такой вот код:
#Если &ОграничениеДоступаНаУровнеЗаписейУниверсально #Тогда
#ДляОбъекта("")
#Иначе
#ПоЗначениям( "Документ.ЗаказКлиента","Чтение","",
"Организации","Организация",
"Склады","Склад",
"ГруппыПартнеров","Партнер",
"Подразделения","Подразделение",
"НЕ Статус = ПредопределенноеЗначение("Перечисление.СтатусыЗаказовКлиентов.Закрыт")","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","" )
#КонецЕсли
Итого - дописали вот такую строку:
НЕ Статус = ПредопределенноеЗначение("Перечисление.СтатусыЗаказовКлиентов.Закрыт")
Однако, как проверить - правильно ли я написал?
Для этого - открываем этот RLS по кнопочке "Открыть", прям в этом поле и вижу вот такую картинку:

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

Пробую выполнить, и получаю ошибку, естественно. Т.е. система не позволит допустить даже такие ошибки. Исправляю ошибку, меняю "ПредопределенноеЗначение", на просто "Значение", нажимаю "Конструктор запросов" и выравниваю запрос, и сразу могу его выполнить.
Однако, если его выполнить, то БСП вернет пустой список, так как у пользователя Администратор - нет никаких настроек в БСП.
Для исправления этой ситуации - переходим на вкладку Параметры сеанса, и установлю параметр АвторизованныйПользователь в значение тестируемого пользователя, в моем случае это - Гладилина Вера Михайловна, менеджер. Далее, необходимо поставить галочку "Использовать параметры сессий из таблицы" и теперь можно выполнить запрос:

7. Создание новых ролей в конфигурации
Окей, роль мы создали, надо теперь ее проверить в действии, но у нас же в конфигурации роли такой нету.
Для начала - нам надо немного обновить эту роль, а именно - всем объектам входящих в нее дать право на просмотр/редактирование стандартных реквизитов, по умолчанию - расширение их не ставит.
Тоже самое касается отдельных реквизитов, если вы хотите в какой-то роли запретить явно работать с неким реквизитом, то в других ролях, которые тоже расширяют этот объект - надо дать явное разрешение.
Для того, чтобы она там появилась, мы жмем кнопку "Обновить расширение" и меню сервиса нашей подсистемы.
В этот момент в систему добавляется новое расширение, которое содержит в себе указанную ранее роль.
Далее дело за малым, идем в профили, убираем старую роль и даем новую и все, можем теперь зайти под этим пользователем и убедиться, что все сработало на ура :)
8. Свои параметры сеансов
А что, если надо дать этот запрет ТОЛЬКО в том случае, когда мы заходим мод мобильным клиентом, например, а если под стационарным, то все должно быть видно.
В этом случае - нам надо создать свой параметр сеанса, и поставить отбор по нему.
Тогда создаем новый параметр:

Ставим галочку "Использовать код", и прописываем код установки этого параметра:
SessionParameters.AccRoles_isMobileClient = ОбщегоНазначения.ЭтоМобильныйКлиент();
Тут есть один нюанс - имя параметра имеет префикс "AccRoles_" и надо не забывать его прописывать.
Функция "ОбщегоНазначения.ЭтоМобильныйКлиент()" возвращает мобильный клиент это или нет. По-другому тут получить не выйдет, так как сервер один и тот же у стационарной и у мобильного клиента, а установка параметров - это серверный вызов. Поэтому просто дергаем функцию из стандартной библиотеки.
Потом идем в роль, и дописываем условие:
#Если &ОграничениеДоступаНаУровнеЗаписейУниверсально #Тогда
#ДляОбъекта("")
#Иначе
#ПоЗначениям( "Документ.ЗаказКлиента","Чтение","",
"Организации","Организация",
"Склады","Склад",
"ГруппыПартнеров","Партнер",
"Подразделения","Подразделение",
"","НЕ Статус = Значение(Перечисление.СтатусыЗаказовКлиентов.Закрыт)
OR Not &AccRoles_isMobileClient",
"","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","" )
#КонецЕсли
После этого - обновляем расширение и заходим под тем пользователем, и все. Теперь вод тонким клиентом видны все заказы, а под мобильным - только не закрытые.
Однако, можно было бы и параметры с фиксированными данными создавать, ну типо отбор по конкретной организации или списку, и задать его свой для роли:

Таким образом - эта система позволяет настроить почти любую сложность роли, и создавать свои параметры сеансов.
9. Обычные формы и расширение...
Мы уже говорили о том, что это расширение прекрасно работает и с обычными формами? Условие только одно - совместимость на 8.3.14.
Если говорить про управляемые формы, то там уже достаточно гибкая подсистема прав доступа, а вот с обычными формами - все грустнее.
Давайте возьмем типовую УТ10 и накатим на нее все тоже самое.
Теперь подключаем расширение, если не нужен английский язык, то удаляем его, если не нужен русский - то удаляем его. В случае ERP - там уже есть английский, поэтому надо просто переименовать с English, на Английский:

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

Если все сделано хорошо, то тогда в Операции - Обработка, вы сможете найти обработку с названием "Роль команд для общих форм":
Открываем ее, нажимаем "Загрузить роли из XML". Закрываем конфигуратор, если он был открыт. Выбираем тип подключения к базе, и заполняем данные, или указываем просто путь к папке, куда заранее были выгружены файлы XML конфигурации.
Жмем "Загрузить роли" и видим, что система подгрузила 18 ролей:

И теперь можем открыть любую роль:

Ну а дальше уже - можно создавать роли, копировать и модифицировать, ставить ограничения и кучу всего другого.
FAQ
Не большой FAQ для разработчиков и тех, кому интересно.
Преимущества:
1. Не зависит от конфигурации
2. Работает с конфигурациями на базе БСП и без них
3. Работает с английскими и русскими конфигурациями
4. Работает с обычными и управляемыми формами
5. Подключается и отключается при необходимости, т.е. можно спокойно генерировать все в тестовой базе, а в рабочую переносить просто расширение с ролями
6. Не влияет на обновления, а если пришли существенные изменения в механизме ролей - позволяет их отладить и перегенерировать роли.
Кому этот продукт может быть нужен?
1. Разработчикам для анализа прав доступа, особенно в те моменты, когда принимают новых клиентов на обслуживание
2. Внедренцам, так как теперь можно модифицировать права без программиста, и не написав, практически, ни одной строчки кода. Если вы умеете пользоваться консолью запросов - то сможете создавать права доступа
3. Владельцам бизнеса, с точки зрения того, что теперь права можно модифицировать не выгоняя пользователей из базы. Иметь четкую историю того - какие права и когда менялись, и даже - кем и что именно менялось
4. Безопасникам - так как они смогут анализировать реальные права доступа
5. Конечным пользователям, если так можно выразиться, так как теперь не будут больше слушать фразы - что это долго, дорого, для этого надо звать программиста и т.д.
Помимо прочего - в этой подсистеме есть генерация расширений, чтение XML конфигураций, код написан на английском, и реализованы разные интересные моменты, которые можно подсмотреть для своих задач.
Вступайте в нашу телеграмм-группу Инфостарт



















