Продвинутый курс. Домашнее задание №4
Эта запись посвящена 2-му потоку продвинутого курса по программированию.
Четверное задание по 0-му блоку продвинутого курса.
Для выполнения рекомендуется изучить следующие главы 0-го курса.
Глава 21. Права доступа.
Глава 22. Анализ и прогнозирование данных.
В этой же теме необходимо написать отчет о выполнении задания.
К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте — залогиньтесь. Если Вы оплачивали курс, у Вас активирован токен доступа, Вы залогинены, но Вы видите эту запись — напишите нам на e-mail поддержки.
Задание выполнил.
Создал роль «Аудитор» с отключенными правами на изменение, удаление и интерактивное редактирование, удаление, пометки на удаление, добавление. Отключил использование обработок конфигурации, внешних отчетов и обработок, отключил право вывода информации, административные функции, Automation.
Создал роль «Менеджер», справочник номенклатурных групп для указания в номенклатуре. Написал шаблон RLS с внутренним соединением таблицы с регистром сведений «Направления деятельности пользователей». Использовал шаблон для номенклатурных групп, номенклатуры, документов купли-продажи ТМЦ, регистров накопления «Остатки товаров» и «Продажи».
Для руководителей отдела устанавливаю полные права. В принципе, для руководителей можно прописать отдельную роль с доступом ко всем объектам на чтение и запись, но без административных функций.
Задание выполнено. Основная трудность – документы с разрешенной и запрещенной номенклатурой-запрос работает, но однозначно неоптимальный и однозначно так делать в жизни нельзя.
Когда же будут решения от Вас, Евгений?
В скором времени :)
Задание выполнил, трудностей не возникло
Выполнил. Первая часть легкая. Со второй частью тоже справился
ДЗ выполнено. Вторая часть потребовала времени, помогли уроки ну и комментарии участников), спасибо всем!
Выполнил. С ограничением для документов пришлось попыхтеть.
Сделал такой шаблон:
ТекущаяТаблица ИЗ #ТекущаяТаблица КАК ТекущаяТаблица
ГДЕ (НЕ 1 В
(ВЫБРАТЬ ПЕРВЫЕ 1
1
ИЗ
Документ.#Параметр(1).Товары КАК Товары ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПраваМенеджеров КАК ПраваМенеджеров
ПО
&Пользователь = ПраваМенеджеров.Менеджер
И Товары.Номенклатура.НоменклатурнаяГруппа = ПраваМенеджеров.НоменклатурнаяГруппа
ГДЕ Товары.Ссылка = ТекущаяТаблица.Ссылка И ПраваМенеджеров.НоменклатурнаяГруппа ЕСТЬ NULL))
Это ограничение установил на табличную часть документов. Соответственно в списке отображаются все документы, но те, в которых недоступная номенклатура, не открываются. Чтобы они вообще не отображались, достаточно установить “Прочие поля”.
Задание № 4 выполнила.
1) Завела пользователя Аудитор, назначила ему роль ТолькоПросмотр, в которой на все объекты установила права только на просмотр. Чтобы невозможно было изъять информацию из базы, нужно отключить право на “Вывод”.
2) Создала объекты:
2.1. Справочники: НоменклатурныеГруппы, Пользователи. В справочник Номенклатура добавила реквизит НоменклатурнаяГруппа соотв. типа. В справочнике Пользователи создала реквизит Руководитель типа Булево.
2.2. Регистр сведений ДоступКНоменклатуре с измерениями Пользователь и НоменклатурнаяГруппа.
2.3. Параметр сеанса Пользователь типа спр-к Пользователи, устанавливаю его в Модуле сеанса.
2.4. Роль ДоступКНоменклатуре, в которой прописала шаблоны с правами на чтение для справочника и документов.
Трудности возникли только с ограничениями на документы, в табличных частях которых есть разрешенная и запрещенная номенклатура одновременно. Долго с этим мучилась, но все-таки получилось. Хочется посмотреть оптимальное решение.
По ходу возник вопрос:
Если пользователь не видит документы, в которых частично присутствует его номенклатура, то как он будет проверять свой документооборот? Он же не увидит этих документов. С помощью запросов/отчетов данные получит, а зайти и просмотреть документ не сможет. В реальных базах не следует, наверное, создавать такие ситуации и пугать пользователей?
>В реальных базах не следует, наверное, создавать такие ситуации и пугать пользователей?
В реальных ситуациях все будет сильно зависеть от постановки задачи.
Вообще лучше избегать использования RLS на уровне реквизитов табличных частей..
Сделала.
По 1-й части – добавила роль с ограничениями, проблем не было.
По 2-й части – использовала параметры сеанса, добавила роль для ограничений по НГ, справочник НГ, регистр сведений ДоступНГ с измерениями Пользователи и Номенклатурные группы, реквизит НГ в справочник Номенклатура, потом RLS для документов поступления и реализации.
Получилось не сразу – после изучения лекций, комментариев к теме, поиска, разработки вариантов.
Задание выполнено.
По второй части вопросов не возникло, аналогичную задачу ранее делала на 8.1 (правда, без использования параметров в запросах :).
Выполнено
Выполнено. С первой частью без проблем. Со второй изрядно потренировался с RLS, зато получил хорошую практику.
с первой частью проблем не возникло, а вот со второй сначала зашел в тупик..пришлось подглядеть коменты, каюсь.
но они мне помогли в итоге задание выполнить. но помучаться пришлось!
Готово, вроде универсально – правда не производительно..
Шаблон:
ВЫБРАТЬ
Номенклатура.Ссылка
ИЗ
Справочник.Номенклатура КАК Номенклатура ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПраваДоступа КАК ПраваДоступа
ПО
ПраваДоступа.ФизЛицо.Руководитель
ИЛИ Номенклатура.НоменклатурнаяГруппа = ПраваДоступа.НоменклатурнаяГруппа
ГДЕ
(ПраваДоступа.ФизЛицо В
(ВЫБРАТЬ
Пользователи.ФизЛицо
ИЗ
Справочник.Пользователи КАК Пользователи
ГДЕ
Пользователи.Код = &ТекущийПользователь))
Правило:
ТекущаяТаблица ГДЕ (Не ТекущаяТаблица.Ссылка В (ВЫБРАТЬ
ТекущаяТаблица.Ссылка
ИЗ
Документ.ПоступлениеТоваровИУслуг КАК ТекущаяТаблица
ГДЕ ТекущаяТаблица.Товары.Номенклатура В (ВЫБРАТЬ
Ссылка Из Справочник.Номенклатура ГДЕ Не Ссылка В (#Номенклатура))))
Задание выполнено. Первая часть – ограничение прав на уровне ролей – без проблем.
Вторая часть – ограничение прав на уровне записей – для справочника номенклатура и соответствующих документов. Для менеджеров создана отдельная роль, созданы справочники Пользователи и НоменклатурныеГруппы, параметр сеанса ТекущийПользователь и регистр сведений. Выполнено с использованием шаблонов ограничений и параметров.
#ТекущаяТаблица.#Параметр(1) В
(ВЫБРАТЬ
ГруппыМенеджеров.НоменклатурнаяГруппа КАК НоменклатурнаяГруппа
ИЗ
РегистрСведений.ГруппыМенеджеров КАК ГруппыМенеджеров
ГДЕ
ГруппыМенеджеров.Менеджер = &ТекущийПользователь)
1. Для аудитора сделал новую роль, у которой убрал право вывода
2. Для менеджеров ограничение по номенклатурным группам реализовал через RLS, сделав для них отдельную роль
3. Для руководителей отделов также реализована отдельная роль
1) Создал роль Только просмотр. Отключил все права, кроме прав Тонкий клиент, Толстый клиент и Веб-Клиент.
Для всех объектов оставил только права Просмотр и Чтение.
2) Для группировки номенклатуры по группам создал справочник Номенклатурные группы
и соответствующий реквизит справочника Номенклатура.
Создал справочник Пользователи, который синхронизируется с текущим пользователем
в обработчике ПередНачаломРаботыСистемы модуля управляемого приложения.
Руководители отделов задаются в РС Руководители отделов: Измерение ФизическоеЛицо (реквизит спр. Пользователи),
ресурс Подразделение.
Для указания соответствия доступных номенклатурных групп пользователям использовал РС СоответствиеНоменклатурныхГруппМенеджерам.
Измерения : ГруппаПользователей, НоменклатурнаяГруппа.
Включение RLS завдается в константе.
Параметры сеанса следующие:
ТекущийПользователь и ИспользоватьОграниченияПравДоступаНаУровнеЗаписей
Шаблоны ограничения прав доступа следующие:
#ТекущаяТаблица.#Параметр(1) В
(ВЫБРАТЬ СоответствиеНоменклатурныхГруппМенеджерам.НоменклатурнаяГруппа
ИЗ
Справочник.Пользователи КАК Пользователи ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоответствиеНоменклатурныхГруппМенеджерам КАК СоответствиеНоменклатурныхГруппМенеджерам
ПО
Пользователи.ГруппаПользователей = СоответствиеНоменклатурныхГруппМенеджерам.ГруппаПользователей
ГДЕ
Пользователи.Ссылка = &ТекущийПользователь) – шаблона для RLS к номенклатуре
ВЫБРАТЬ РАЗЛИЧНЫЕ
ТаблицаДокумента.Ссылка
ИЗ
#Параметр(1) КАК ТаблицаДокумента
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
СоответствиеНоменклатурныхГруппМенеджерам.НоменклатурнаяГруппа КАК НоменклатурнаяГруппа
ИЗ
Справочник.Пользователи КАК Пользователи
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоответствиеНоменклатурныхГруппМенеджерам КАК СоответствиеНоменклатурныхГруппМенеджерам
ПО Пользователи.ГруппаПользователей = СоответствиеНоменклатурныхГруппМенеджерам.ГруппаПользователей
ГДЕ
Пользователи.Ссылка = &ТекущийПользователь) КАК ВложенныйЗапрос
ПО ТаблицаДокумента.Номенклатура.НоменклатурнаяГруппа = ВложенныйЗапрос.НоменклатурнаяГруппа
ГДЕ
ВложенныйЗапрос.НоменклатурнаяГруппа ЕСТЬ NULL – шаблон для RLS к документам
На закладке Ограничение доступа спр. Номенклатура и связанных с ним объектов использовал условие проверки
значения параметра сеанса ИспользоватьОграниченияПравДоступаНаУровнеЗаписей.
Для того, чтобы для руководителей ограничение доступа к группам не применялось,
параметр сеанса ИспользоватьОграниченияПравДоступаНаУровнеЗаписей инициализируется значением ИСТИНА только
в том случае, если текущий пользователь не является руководителем отдела
Задание выполнил. Сложностей не возникло.
1) Создал роль Только просмотр. Отключил все права, кроме прав Тонкий клиент, Толстый клиент и Веб-Клиент.
Для всех объектов оставил только права Просмотр и Чтение.
2) Для группировки номенклатуры по группам создал справочник Номенклатурные группы
и соответствующий реквизит справочника Номенклатура.
Создал справочник Пользователи, который синхронизируется с текущим пользователем
в обработчике ПередНачаломРаботыСистемы модуля управляемого приложения.
Руководители отделов задаются в РС Руководители отделов: Измерение ФизическоеЛицо (реквизит спр. Пользователи),
ресурс Подразделение.
Для указания соответствия доступных номенклатурных групп пользователям использовал РС СоответствиеНоменклатурныхГруппМенеджерам.
Измерения : ГруппаПользователей, НоменклатурнаяГруппа.
Включение механизма RLS задается в константе.
Параметры сеанса следующие:
ТекущийПользователь и ИспользоватьОграниченияПравДоступаНаУровнеЗаписей
Шаблоны ограничения прав доступа следующие:
#ТекущаяТаблица.#Параметр(1) В
(ВЫБРАТЬ СоответствиеНоменклатурныхГруппМенеджерам.НоменклатурнаяГруппа
ИЗ
Справочник.Пользователи КАК Пользователи ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоответствиеНоменклатурныхГруппМенеджерам КАК СоответствиеНоменклатурныхГруппМенеджерам
ПО
Пользователи.ГруппаПользователей = СоответствиеНоменклатурныхГруппМенеджерам.ГруппаПользователей
ГДЕ
Пользователи.Ссылка = &ТекущийПользователь) – шаблона для RLS к номенклатуре
ВЫБРАТЬ РАЗЛИЧНЫЕ
ТаблицаДокумента.Ссылка
ИЗ
#Параметр(1) КАК ТаблицаДокумента
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
СоответствиеНоменклатурныхГруппМенеджерам.НоменклатурнаяГруппа КАК НоменклатурнаяГруппа
ИЗ
Справочник.Пользователи КАК Пользователи
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоответствиеНоменклатурныхГруппМенеджерам КАК СоответствиеНоменклатурныхГруппМенеджерам
ПО Пользователи.ГруппаПользователей = СоответствиеНоменклатурныхГруппМенеджерам.ГруппаПользователей
ГДЕ
Пользователи.Ссылка = &ТекущийПользователь) КАК ВложенныйЗапрос
ПО ТаблицаДокумента.Номенклатура.НоменклатурнаяГруппа = ВложенныйЗапрос.НоменклатурнаяГруппа
ГДЕ
ВложенныйЗапрос.НоменклатурнаяГруппа ЕСТЬ NULL – шаблон для RLS к документам
На закладке Ограничение доступа спр. Номенклатура и связанных с ним объектов использовал условие проверки
значения параметра сеанса ИспользоватьОграниченияПравДоступаНаУровнеЗаписей равным ИСТИНА.
Для того, чтобы для руководителей ограничение доступа к группам не применялось,
параметр сеанса ИспользоватьОграниченияПравДоступаНаУровнеЗаписей инициализируется значением ИСТИНА только
в том случае, если текущий пользователь не является руководителем отдела
Сделал. первое без проблем. Над вторым с документами замаялся…но в итоге получилось
Вот такой вот шаблон…Единственное вложенный запрос используется.
(НЕ ТекущаяТаблица.Ссылка В
(ВЫБРАТЬ РАЗЛИЧНЫЕ
СвернутыеДокументы.Ссылка
ИЗ
(ВЫБРАТЬ РАЗЛИЧНЫЕ
Документы.Ссылка КАК Ссылка,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Документы.Номенклатура.НоменклатурнаяГруппа) КАК НоменклатураНоменклатурнаяГруппа
ИЗ
Документ.#Параметр(1).Товары КАК Документы
ГДЕ
(НЕ Документы.Номенклатура.НоменклатурнаяГруппа В (&НоменклатурныеГруппыДоступа))
СГРУППИРОВАТЬ ПО
Документы.Ссылка) КАК СвернутыеДокументы))
(НЕ ТекущаяТаблица.Ссылка В (ВЫБРАТЬ РАЗЛИЧНЫЕ СвернутыеДокументы.Ссылка ИЗ (ВЫБРАТЬ РАЗЛИЧНЫЕ Документы.Ссылка КАК Ссылка, КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Документы.Номенклатура.НоменклатурнаяГруппа) КАК НоменклатураНоменклатурнаяГруппа ИЗ Документ.#Параметр(1).Товары КАК Документы ГДЕ (НЕ Документы.Номенклатура.НоменклатурнаяГруппа В (&НоменклатурныеГруппыДоступа)) СГРУППИРОВАТЬ ПО Документы.Ссылка) КАК СвернутыеДокументы))
Вопрос по первой части: сняла галочки “Вывод”, “Использование внешних отчетов, обработок”. Но – через “Prt Sc” можно распечатать все. Это поддается органичению?
Это не поддается ограничению.
Хотя вы слушали курс Вячеслава Гилева..? Мало положительных отзывов о параноидальной защите..
А ведь можно еще и фотоаппаратом снять :)
от фотика нет защиты..но думаю качество будет camrip как говорят.
Выполнил. Проблем не возникло. Ранее приходилось очень плотно работать с правами и RLS.
Задание выполнил.
Первая часть проблем не вызвала – использовал роли.
По второй части было сложнее.
Создал 2 справочника – пользователи и номенклатурные группы. Также создал 2 параметра сеанса – ИспользоватьОграничениеДоступа и ТекущийПользователь. Также в регистре сведений задавал соответствие пользователя и номенклатурных групп. Далее в роли настройка доступа к документам поступления и реализации – используется довольно простой запрос.
Что не получалось – никак не мог для менеджера заставить контролировать права доступа. Сыграла роль моя невнимательность. Я создал новую роль – менеджеры, назначил её в конфигураторе пользователю Менеджер, а роль Полные права забыл снять :) Сами понимаете теперь в чём дело. Уже всё что мог перепробовал :)
Я разобрался! Как в типовых сделать, к сожалению, не получилось, плюнул и написал сам с нуля. К удивлению, заработало!
Запрос оказался детсадовским:
ТекущаяТаблица ГДЕ ( ТекущаяТаблица.Ссылка Не В
(
ВЫБРАТЬ Различные
ТоварыДок.Ссылка
ИЗ Документ.ПоступлениеТоваровИУслуг.Товары ТоварыДок
Левое СОЕДИНЕНИЕ РегистрСведений.ДоступКНоменклатурнымГруппам КАК ДоступКНГ
По ДоступКНГ.Пользователь = &Пользователь
И ТоварыДок.Номенклатура.НоменклатурнаяГруппа = ДоступКНГ.НоменклатурнаяГруппа
Где ДоступКНГ.НоменклатурнаяГруппа Есть Null
))
Т.е. тупо в условии сначала ищутся все “чужие” документы, а на итоговый фильтр накладывается ограничение “где все – не чужие”. Единственное, что подозреваю – с производительностью будут проблемы. Евгений говорил что так делать не особо хорошо. Запрос работает независимо от того, есть ли записи в РС или нет.
Евгений, был бы Вам премного благодарен, если бы Вы подсказали мне, как мой запрос перевести конструкцию вида “ГДЕ ( 1 В (ВЫБРАТЬ ПЕРВЫЕ 1” (как в типовых). Хочется разобраться, невозможно как :)
1)
Создал роль Аудитор. Настроил права. Присвоил права пользователю “Аудитор”
2) Создал справочник “Пользователи”. Создал параметр сеанса “Менеджер”. В модуле сеанса вызывается функция: если пользователь с именем пользователя ИБ не существует, то создается, если существует-то пареметру сеанса присваивается пользователь.
Текст условий RLS:
ТекущаяТаблица ИЗ #ТекущаяТаблица КАК ТекущаяТаблица
ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
ПраваДоступа.Менеджер КАК Менеджер,
ПраваДоступа.НоменклатурнаяГруппа КАК НоменклатурнаяГруппа
ИЗ
РегистрСведений.ПраваДоступа КАК ПраваДоступа
ГДЕ
ПраваДоступа.Менеджер = &Менеджер) КАК ВложенныйЗапрос
ПО ТекущаяТаблица.Товары.Номенклатура.НоменклатурнаяГруппа = ВложенныйЗапрос.НоменклатурнаяГруппа
И ((НЕ ТекущаяТаблица.Товары.Номенклатура.НоменклатурнаяГруппа <> ВложенныйЗапрос.НоменклатурнаяГруппа))
1-я часть – легко.
Со второй повозится пришлось. Создал справочники Пользователи – в него записываю нового пользователя, если он впервые запускает базу.
Параметр Сеанса ТекущийПользователь (ссылка на соответствующий элемент справочника пользователи).
НоменклатурныеГруппы.
Реквизит Номенклатуры НоменклатурнаяГруппа.
ГруппыПользователей с ТабЧастью ПользователиГруппы и ее реквизитом Пользователь. (назвать ТЧ “Пользователи” не получилось, т.к. возникали проблемы в запросах)
РегистрСведений ГруппыДоступаНоменклатуры (измерение ГруппаПользователей, ресурс – НоменклатурнаяГруппа).
Через RLS настроил доступ к справочнику и Номенклатура и документам по группам пользователей.
Один недостаток: Пользователь обязательно должен быть включен в какую-либо группу и в регистре сведений должны быть записи для всех групп пользователей. Если для Группы Пользователей доступ разрешен ко всей номенклатуре, то ресурс Номенклатурная группа следует оставить пустым.
Сорри, в регистре сведений и и ГруппаПользователей и НоменклатурнаяГруппа являются измерениями. Иначе невозможно на одного пользователя несколько НГ задать.
1) Для пользователя Аудитор создается роль с правами только на просмотр и отключенной галочкой “Вывод”. Ах да… в файловом варианте еще нужно скрестить пальчики и надеяться, что пользователь не скопирует каталог ИБ;
2) Вариантов много – все зависит от приоритетов в требованиях к решению (быстродействие/время разработки/универсальность механизма). Я поставил более приоритетной производительность, т.е. задача минимизации условий в RLS. Для реализации поставленной задачи системе необходимо и достаточно знать 2 вещи: ограничивать ли доступ по номенклатурным группам (для руководителей отделов) и, если ограничивать, то к каким группам есть доступ. Т.е. мы должны инициировать 3 параметра сеанса -Пользователь (Справочник.ФизическиеЛица),ОграничениеПоГруппамНоменклатуры (Булево) и ДоступныеНоменклатурныеГруппы (ФиксированныйМассив);
Привязку Пользователей к Справочнику ФизЛиц сделал простую – по совпадению наименования ФизЛица и Имени пользователя. Если еще нет ФизЛица с таким наименованием, он создается в модуле сеанса.
В качестве НоменклатурныхГрупп использовал одноименный справочник с добавлением реквизита в справочник Номенклатура.
Для привязки НоменклатурныхГрупп к Пользователям Создается независимый регистр сведений “ДоступностьНоменклатурныхГрупп”.
В модуле сеанса после инициализации параметра Пользователь, запросом проверяется, является ли Пользователь руководителем какого-либо подразделения (добавлен реквизит “Руководитель” с типом “СправочникСсылка.ФизическиеЛица” в справочник Подразделения). В зависимости от результата инициируется параметр ОграничениеПоГруппамНоменклатуры и, при необходимости, ДоступныеНоменклатурныеГруппы (запросом к регистру ДоступностьНоменклатурныхГрупп).
Для менеджеров создается отдельная роль (с запретом установки параметров сеанса, запретом на регистр “ДоступностьНоменклатурныхГрупп”, на редактирование реквизита Руководитель в справочнике Подразделений и реквизита НоменклатурнаяГруппа в справочнике Номенклатура).
Далее для этой роли настраивается RLS, используя конструкцию (для справочника)
#Если &ОграничениеПоГруппамНоменклатуры #Тогда
ГДЕ Номенклатура.Ссылка.ГруппаНоменклатуры В(&ДоступныеНоменклатурныеГруппы) ИЛИ ЭтоГруппа
#КонецЕсли
Сложности возникли для документов, в которых есть и разрешенная и запрещенная номенклатура. В итоге подсмотрел решение в типовой конфигурации, используя кнструкцию …ГДЕ 1 В (Выбрать ПЕРВЫЕ 1…).
Но, в данном решении для вступления изменений по настройке групп доступа в силу, пользователю необходимо будет перезаходить или каким-то образом в сеансе пользователя должен запускаться привилегированный модуль, в котором параметры сеанса будут обновлены.
Очень хотелось бы разобрать какой-нибудь не простой пример из типовых конфигураций, где используется конструкция” ТекущаяТаблица из #ТекущаяТаблица Как ТекущаяТаблица” с соединением по(ИСТИНА).
>Очень хотелось бы разобрать какой-нибудь не простой пример из типовых конфигураций
Пришлите вопрос в мастер-группу.
Не получается в RLS сделать проверку: если пользователю не назначена ни одна номенкл. группа, то ему можно получить доступ ко всей номенклатуре. Дайте пожалуйста наводку, как можно такое реализовать.
Не нужно – получилось :)
Отлично :)
Первую часть про аудитора сделал без труда.
Во второй решил провериться с типовыми. Для справочника все легко получилось. Для документа, после долгих мук, запрос не рос очень долго. Для отладки написал такой запрос:
ТекущаяТаблица ГДЕ ( 1 В
(
ВЫБРАТЬ ПЕРВЫЕ 1
1
ИЗ Документ.ПоступлениеТоваровИУслуг ПТИ
Внутреннее Соединение Документ.ПоступлениеТоваровИУслуг.Товары ТоварыДок
По ТоварыДок.Ссылка = ПТИ.Ссылка
Левое СОЕДИНЕНИЕ РегистрСведений.ДоступКНоменклатурнымГруппам КАК ДоступКНГ
По ДоступКНГ.Пользователь = &Пользователь
И ТоварыДок.Номенклатура.НоменклатурнаяГруппа = ДоступКНГ.НоменклатурнаяГруппа
Где ДоступКНГ.НоменклатурнаяГруппа Есть Null
))
По идеи, для того документа, в котором есть только та номенклатура, которая включена в нужную группу – левое соединение не должно дать null, дальше по где ничего не отбирается -и в итоге получаем ноль записей. 1 в 0 не входит – и видеть нужные нам документы мы не должны! Я так надеялся на это :) А в итоге я всегда вижу все документы, т.е. почему то в левом соединении ничего не клеится и есть null’сы.
Вообщем, я похоже, не уловил сути. :(
По Аудитору отключил в правах “Вывод”.
По второй части – не сразу получилось фильтровать документы с различными группами доступа товаров в одном документе. Но спустя часа 2 получилось ))). Завел для менеджеров табличную часть – ГруппыТоваров.
Завел два параметра сеанса – Фиксированный массив “РазрешенныегруппыТоваров” и “КонтролироватьГруппыТоваров” типа булево. В справочнике пользователей реквизит – КонтролироватьГруппыТоваров. Этот реквизит ставлю выбранным менеджерам. Затем в ограничениях РЛС ставлю условие #Если &КонтролироватьГруппыТоваров #Тогда … #КонецЕсли
ДЗ выполнил.
Часть 1 – настройками вида доступа для роли.
Часть 2 – RLS с использованием параметров сеансов. От ON-Line изменений настроек по номенклатуре пришлось отказаться, по руководителям подразделений такая возможность есть.
На принтере прикольно. Н лет назад приглашают меня в местное РОВД с просьбой распечатать на принтере базу 1 с:Бухгалтерия 7.7 На мой вопрос что печатать? отвечают всё! База DBF, комп без хаспа. Желание печатать = 0. Отвечаю: могу распечатаь таблицы данных: понадобятся 5 пачек бумаги по 100 листов и 4 картриджа. Обещали подумать. Думали 4 месяца, затем вернули комп. Так и не распечатав базу.
:)
Создала роль Аудитор, для всех объектов установила права Просмотр. Не устанавливала Право «Вывод»
Создала роль Менеджер
Создала справочники
Продуктовые группы
Пользователи
Добавила Регистр Сведений Продуктовые группы Пользователя
Добавила Параметр сеанса – ТекущийПользовалтель и устанавливаю его при старте приложения в модуле сеанса
В справочник Номенклатура добавила реквизит ПродуктоваяГруппа
Создала шаблон ограничения доступа и настроила ограничение доступа для справочника номенклатура и документов Поступление товаров и Реализация товаров
Все работает замечательно для всех вновь создаваемых документов различными Менеджерами – доступ только к документам, у которых нужная номенклатура
Не смогла побороть следующее
Если открывается ранее созданный документ, в перечне номенклатуры которого есть номенклатура с разрешенных групп и с неразрешенных групп, тогда такой документ показывается в списке документов, но вместо неразрешенной номенклатуры «Объект не обнаружен»
Так ведь такой документ должен быть невиден в списке.
”При этом если в одном документе будет встречаться номенклатура
из групп “Парфюмерия” и “Бакалея” документ должен быть недоступен.” Я понял что должен показываться в списке но недоступен для записи.
Да, неоднозначная формулировка.
Предлагаю трактовать на свой вкус.
Но в решении я буду считать, что документ должен быть не виден.
В этом была у меня основная трудность. Жаль я ждал увидеть реализацию, без вложенного запроса=)
спасибо “помощи зала” – все получилось:))
Задание выполнил.
Создал набор прав в котором на объекты дал только чтение.
Запретил открытие внешних обработок и отчетов, а также “Вывод”.
Добавил параметр сеанса пользователь, справочник номенклатурных групп и регистр сведений связывающий номенклатурные группы с пользователем.
Настроил ограничение доступа к данным для права “чтение” справочника номенклатуры.
Ограничение на список документов реализовал возможно несколько кривовато. Сначала вложенным запросом отбираю только ссылки на документы где товар только нужной номенклатурной группы, потом делаю внутреннюю связь по ссылке.
Такой вопрос: в метаданных определено 5 ролей
Роль1, Роль2, Роль3, Роль4, ПолныеПрава
Например на справочник наложен RLS на чтение по ролям Роль1, Роль2, Роль3, Роль4, на полные права RLS не наложен
Как известно, система проверяет доступность по “ИЛИ” в случае наличия у пользователя нескольких ролей. В каком порядке проверяется доступность для каждой роли?
По текущему условию, если проверять доступность данных в порядке описания ролей, то проверять доступность по ролям 1-4 не имеет смысла, так как роль ПолныеПрава разрешает чтение.
Однозначно ответить не возможно.
Но предполагаю, что платформа ищет оптимальный путь, и в данном примере не будет проверять RLS на 4 роли..
Действительно, по тому условию на стороне субд уже нет case when и т. д.
Отлично!
Сделано! На мою беду (а может и счастье)) ) в свое время намаялся на УПП с данным механизмом, поэтому ничего нового не изобретал, создал справочники пользователи, номенклатурные группы, параметр сеанса тек пользователь и т.д и т.п.
Задани выполнил.
Для аудитора создал роль «Только чтение».
В этой роли для всех объектов, кроме обработок, установил «Чтение», а также «Просмотр».
Для конфигурации установил «Тонкий клиент», «Веб-клиент» и «Толстый клиент». Права открытия внешних отчетов и обработок, а также право “Вывод” отключил.
При запуске вызывается процедура «РассчитатьИтоги()», в данную процедуру добавил проверку доступа на изменение управленческого регистра бухгалтерии, так как в данной процедуре для аудитора выдавалась ошибка.
Добавил справочник «Номенклатурные группы» и соответствующий реквизит в номенклатуру.
Добавил регистр сведений «Номенклатурные группы пользователя» – с измерениями «Пользователь» и «Номенклатурная группа». Измерение «Пользователь» – строкового типа, справочник как в типовых конфигурациях делать не стал. Параметр сеанса «Пользователь», заполняемый именем пользователя при старте системы в каркасной конфигурации уже есть.
Создал роль «Менеджер» путем копирования роли «Полные права». Сделал шаблон для получения проверки принадлежности параметра списку доступных пользователю номенклатурных групп или на значение NULL. Список получаем запросом по регистру сведений «Номенклатурные группы». При проверке на NULL в список видимых строк добавляются строки, в которых номенклатура не указана, а также группы номенклатуры.
Данный шаблон используем для выражений РЛС для чтения и изменения для справочников «Номенклатурные группы», «Номенклатура», регистров накопления «Остатки товаров» и «Продажи», регистров сведений «Цены номенклатуры» и «Значения свойств товаров».
Для документов используется более сложный шаблон.
В шаблоне для документов я задействовал вложенный запрос, в котором связываю таблицу документа, табличную часть документа и регистр сведений «Номенклатурные группы пользователя». Для табличной части и регистра сведений применяю левое соединение. В условие внутреннего запроса прописал:
(НЕ #Параметр(1)Товары.Номенклатура = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяССылка)) И НоменклатурныеГруппыПользователя.НоменклатурнаяГруппа ЕСТЬ NULL )
Вложенный запрос дает документы, в которых хотя бы одна из номенклатур имеет номенклатурную группу, отличную от указанных для пользователя.
Во внешнем запросе связываю левым соединением таблицу документа со вложенным запросом, а в условии прописываем ВложенныйЗапрос.Ссылка ЕСТЬ NULL.
В итоге мы получаем документы, у которых:
Не заполнена таблица номенклатуры, или
Все номенклатурные позиции имеют номенклатурную группу, разрешенную для пользователя или являются пустыми ссылками на номенклатуру.
Выражение для RLS для документов привел ниже. #Параметр(1) – это имя документа.
#Параметр(1) ИЗ Документ.#Параметр(1) КАК #Параметр(1)
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
#Параметр(1).Ссылка КАК Ссылка
ИЗ
Документ.#Параметр(1) КАК #Параметр(1)
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.#Параметр(1).Товары КАК #Параметр(1)Товары
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НоменклатурныеГруппыПользователя КАК НоменклатурныеГруппыПользователя
ПО (НоменклатурныеГруппыПользователя.Пользователь = &Пользователь)
И (#Параметр(1)Товары.Номенклатура.НоменклатурнаяГруппа = НоменклатурныеГруппыПользователя.НоменклатурнаяГруппа)
ПО #Параметр(1).Ссылка = #Параметр(1)Товары.Ссылка
ГДЕ
(НЕ #Параметр(1)Товары.Номенклатура = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяССылка))
И НоменклатурныеГруппыПользователя.НоменклатурнаяГруппа ЕСТЬ NULL ) КАК ВложенныйЗапрос
ПО #Параметр(1).Ссылка = ВложенныйЗапрос.Ссылка
ГДЕ ВложенныйЗапрос.Ссылка ЕСТЬ NULL
1) Добавил пользователя Аудитор, создал Роль АудиторТолькоПросмотр, на все объекты метаданных дал доступ только чтение.
УстановленЗапретНаИспользованиеВнешнихОтчетов и обработок.
Печатные формы не сохранять не распечатывать нельзя.
ИзъятьИнформацию в принципе можно через PrintScreen =)
2)
– Создал справочник Пользователи, обеспечил синхронизацию с ПользователямиИБ. В справочник добавил реквизит ОграничениеДоступаПоГруппам(Булево)
– Добавил 2 ПараметраСеанса: ТекПользователь, ОграничениеДоступаПоГруппам Которые заполняются в модуле сеанса УстановкаПараметровСеанса.
– Создал РегистрСведений НаправлениеПродаж, с измерениями Пользователь(СправочникПользователь) и ГруппыПродаж(Выбор группы справочника)
– Создал роль Менеджер, Для справочника Номенклатура для чтения сделал аналогично тому как показано в уроке
Для документов ПоступлениеТоваровИУслуг,РеализацияТоваровИУслуг
– Для чтения как в уроке показано,
– для изменения не получилось сделать без вложенного запроса, в котором сравнивается общее количество строк номенклатуры с количеством строк Разрешенной номенклатура).
Ну и в том случае если в документе есть неразрешенная номенклатура то эти позиции показываются как <ОбъектНенайден>
Все эти ограничения включаются если у пользователя в справочнике указано ОграничениеДоступаПоГруппам=Истина
Также часть запросов в RLS заменил на шаблоны.
Скрины не буду выкладывать т.к. их нужно достаточно много делать.
Вопрос: можно ли как то в документах со смешанной номенклатурой(Разрешенной и не Разрешенной) поле ОбъектНеНайден заменить на что нибудь?
> можно ли как то в документах со смешанной номенклатурой(Разрешенной и не Разрешенной) поле ОбъектНеНайден заменить на что нибудь?
Нет, нельзя. RLS по строкам табличных частей не работает..
Не знаю куда написать.
Какой смысл добавлять новый справочник НоменклатурныеГруппы, при этом создавать реквизит В Справочнике номенклатуре. Можно же использовать просто группы в номенклатуре.
Конечно если реализовывать ситуацию когда одна номенклатура может входить в разные номенклатурные группы, тогда да есть смысл добавлять новый справочник.
Это вопрос по курсу “проф. программирование в 1С v8” или про что-то совсем другое?
это не вопрос, просто высказывание,мнение,мысли. Проехали.
Группировка номенклатуры может вестись по одному принципу и иметь подгруппы, а НГ – по другому..
Логично.
Первая? :)
Это было одно из самых приятных домашних заданий.
С ролью Аудитор все просто: проставлено на все объекты права только на чтение, просмотр и ввод по строке. На корневом узле проставлены права только на тонкого и толстого клиента (право “Вывод” не установлено, чтобы не «изъял информацию из базы данных»).
Для ограничения по номенклатуре был создан справочник Номенклатурные группы, параметр сеанса ТекПользователь, а также регистр сведений НастройкаПравДоступа с измерениями Пользователь (строковый тип – очень лень было создавать справочник пользователи) и НоменклатурнаяГруппа, и ресурсом Использование (чтобы можно было включать и выключать доступ). С помощью шаблона (с использованием параметра) было введено ограничение на сам спр. Номенклатура, а также на документы Поступление и Реализация.
Текст шаблона:
ИЗ #ТекущаяТаблица КАК Номенклатура
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиПравДоступа КАК НастройкиПравДоступа
ПО #Параметр(1).НоменклатурнаяГруппа = НастройкиПравДоступа.НоменклатурнаяГруппа
И (НастройкиПравДоступа.Пользователь = &ТекПользователь)
И (НастройкиПравДоступа.Использование)
Забыла… В спр. Номенклатура был добавлен новый реквизит НоменклатурнаяГруппа. Чтобы было видно и группы спр. Номенклатура – для них тоже нужно проставить реквизит НоменклатурнаяГруппа.
>Первая? :)
Комментарии одобряю не сразу, накапливаю очередь :)
А как глава 22 в задании участвует?
Если только подключить воображение :)
что подразумевается под словами “изъять информацию из базы данных”?
Сохранить в файл на диске, напечатать на принтере…