Итак, имеем документ расчета заказа Полиграфической продукции, который содержит в своем составе порядка 12-ти вкладок и много контролов. Документ позволяет рассчитать и учитывать как технологические параметры заказа, так и экономические, от предварительного расчета заказа до запуска в производство, с документом работает пять департаментов, плюс контроль руководства. В процесе заполнения документ фиксирует различные стадии технологического процесса по выпуску полиграфической продукции, что реализуется с помощью механизма Статусов. ()
Таким образом в любой момент времени документ имеет определенный статус, соответствующий определенному состоянию заказа в процессе его выполнения. Статус документа (реквизит СтатусЗаказа) своего рода индикатор для визуализации состояния заказа, а с другой стороны позволяет разграничить доступ на уровне всего документа - Редактирование / Просмотр.
Но для удобства и надежности работы необходимо иметь возможность выполнить более тонкую настройку доступа к отдельным элементам управления. Ведь даже если пользователь имеет права на редактирование документа, это не означает, что он должен иметь доступ ко всем элементам формы, а часть реквизитов он вообще не должен видеть. Конечно, можно все долго и нудно прописывать в коде - что кому можно, а что нельзя, но гораздо интереснее сделать это через универсальный интефейс, который можно будет затем использовать для любого документа, без дополнительного программирования
Вот для решения данного вопроса и разработан этот механизм.
На рис.1 представленна общая схема Разграничения доступа к ЭУ. К типовому решению добавленно три справочника:
- Т_СтатусыЗаказов - Допустимые Статусы документа
- Т_РеквизитыФорм - Содержит список Наименований элементов управления ФормыЭлемента документа
- Т_РолиПользователей - Справочник определяет доступ по ролям в отраслевом решении, в данном случае в Полиграфии в соответствии со статусом документа.
Внимание - Дальнейшее описание будет вестись на примере демонстрационной базы, которая прилагается к решению. В составе этой конфигурации содержится один документ - Приходная накладная, который не несёт никакой смысловой нагрузки, а используется только для демонстрации возможностей данного решения.
В реальной конфигурации мы прежде всего должны определить, какие стадии того или иного процесса будет учитывать наш документ, и сколько пользователей (групп пользователей) будет работать с данным документом. В соостветствии с этим мы заполняем справочник Т_СтатусыЗаказов.
Здесь необходимо отметить одну вещь. Для каждого этапа редактирования документа используется два статуса. Первый статус предназначен как бы для захвата документа и указания, что пользователь выполняет определенные действия над документом (редактирует), а второй для объявления того, что на данном этапе работа над документом завершена, и он может переходить к следующему пользователю. Для второго статуса, как правило, доступно только одно поле на форме это СтатусЗаказа.
Далее нам необходимо заполнить справочник Т_РеквизитыФорм - естественно, не вручную. Для этого мы используем обработку ВыборСохранениеФормДляПривязок, которая просканирует наш документ и выберет все элементы управления (Наименования) для заполнения справочника. На просторах интернета была найдена обработка, которая формировала дерево элементов управления формы, была мной доработана до нужной функциональности. В результате работы обработки мы получаем заполненный справочник.
или в Иерархии:
После того как мы заполнили справочник Т_РеквизитыФорм, можно переходить к созданию ролей доступа по отраслевому решению и разграничению доступа ЭУ в соответствии со статусом документа. Для этого мы используем справочник Т_РолиПользователей. Создаем в справочнике нашей демонстрационной базы следующие роли
И выполним разграничение доступа для роли ПриемТовара. Этой Роли соответствуют Статусы - Принят, Задание Менеджера Создано. Вообще-то для каждой роли должно быть определено как минимум три статуса. Статус перехода с предыдущего этапа и два статуса, как уже говорилось выше для данного этапа. Но так как эта роль начальная, то ей соответствуют два статуса.
Как видно из рисунка, имеются две табличные части. Первая - (ПраваДоступа) определяет список достуных статусов для роли, а также определяет:
- Возможность изменения статуса документа
- Возможность редактирования элементов управления в принципе
- Способ разграничения по Доступности ЭУ
- Способ разграничения по Видимости ЭУ
С первыми двумя пунктами, я думаю, все понятно. Остановимся на двух следующих. Как для разграничения по Доступности, так и для разграничения по Видимости имеется два способа организации разграничения:
- ИсключитьВсе (исключить все, что с этим признаком)
Доступны все элементы за исключением указанных. Если список пуст - Доступны все элементы управления.
- ВключитьВсе (включить все, что с этим признаком)
Доступны только элементы, указанные в списке. Если список пуст - НЕ Доступны все элементы управления.
ДОСТУПНОСТЬ: По УМОЛЧАНИЮ Устанавливается признак <ИсключитьВсе>
ВИДИМОСТЬ: По УМОЛЧАНИЮ Устанавливается признак <ИсключитьВсе>
Ну и, наконец, колонка По Элементно - которая и открывает возможность разграничения по конкретному ЭУ, (только если задан флаг Редактирование).
А непосредственно разграничение по элементам осуществляется во второй ТЧ - которая так и называется ДоступПоЭлементам.
Итак, если мы обратися к нашему рисунку для роли ПриемТовара, то увидим, что для статуса Принят установлена возможность
- ИзмененияСтатуса, Редактирования, ПоЭлементно, ИсключитьВсе
Переходим во вторую таблицу. Для статуса Принят определен один ЭУ - %Оприходование. В следующей колонке [Это Узел] установлен флаг - который говорит о том, что ЭУ %Оприходование содержит в себе какие-то вложенные элементы. Если мы зайдем в справочник РеквизитыФорм и найдем там элемент %Оприходование, то увидим, что это СтраницаПанели. Колонка [Это Узел] заполняется автоматически при выборе ЭУ. Следующая колонка [Разграничение по Доступности] - в случае, если установлен флаг, определяет, что в данной строке задается Доступность ЭУ. Колонка [Разграничение по Видимости] - тоже самое только для Видимости ЭУ. В одной строке мы можем определять или только Доступность элемента или только Видимость. Если нам надо переопределить и Доступность и Видимость (что маловероятно, так как Доступность и Видимость ЭУ в форме задана по умолчанию), то по одному ЭУ у нас будет две строки. После выполнения данных действий мы получим следующий результат:
В документе Приходная накладная будут доступны все элементы управления за исключением тех, что расположенны на вкладке %Оприходование.
Если задать правило для Страницы панели, то это правило будет распространяться на все элементы Страницы
Если на форме есть недоступные элементы управления, то доступные поля ввода будут подсвечиваться.
Следующий пример демонстрирует разграничение доступа по ЭУ для роли ОбработкаДанныхПроизводством, по которой для статуса ПринятоВПроизводство Способ разграничения по Доступности = ВключитьВсе.
Согласно установленному Способу разграничения будут доступны только элементы, включенные в список ТЧ ДоступПоЭлементам.
Ещё один нюанс - в справочнике РолиПользователей в ТЧ ДоступПоЭлементам список выбранных элементов можно копировать, указав в качестве источника - Роль, из которой будет происходить копирование, и СтатусДокумента.
Вот, в общем-то, и все. Решение представлено в виде файла конфигурации *.cf. После внедрения в конфигурацию и настройки справочников, непосредственно чтобы использовать, необходимо в форме документа в процедуру ПередОткрытием вставить вызов одной-единственной процедуры:
Утилиты.ПроверкаПравДоступаПользователя(ЭтаФорма,ЭлементыФормы, СтатусЗаказа);
При обновлении конфигурации объект Роли из ветки Общие обновлять Не нужно
Имеется также демонстрационная база, на основании которой создавалось данное описание.