Новый вид доступа в УТ 11. Как в УТ 11 изменить константу "ПараметрыОграниченияДоступа"

В УТ11 существуют стандартные виды ограничения прав доступа. Например: "Подразделения", "Склады", "Кассы", "ВидыЦен" и т.д.
До поры до времени такой набор стандартных видов ограничений устраивает пользователей.
Но что делать, если возникла необходимость добавить новый вид доступа?
Об этом и пойдет речь в данной статье.

Итак, у нас есть задача добавить новый вид доступа в конфигурации УТ 11.

В старых версиях УТ 11 виды доступа задавались в плане видов характеристик «ВидыДоступа».

В новых версиях этот ПВХ уже не задействован. Вместо него используется определяемый тип «ЗначениеДоступа».

Первое, что приходит на ум — добавить новый предопределенный элемент в ПВХ «ВидыДоступа» или включить нужный тип в определяемый тип «ЗначениеДоступа».

Делаем это. Перезапускаем программу, заходим в раздел «Администрирование», «Настройки пользователей и прав», «Профили групп доступа», открываем какой либо профиль, переходим на закладку «Ограничения доступа», добавляем новую строчку и …

В списке выбора видов доступа мы не находим наш добавленный новый вид доступа.

Что же нужно сделать для того, чтобы он появился?

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

Для старых версий УТ11 и для новых порядок действий несколько отличается.

Для старых версий:

Этот вариант предложил Замятин Илья. Орфография автора сохранена.

1. Из модуля менеджера ПлановВидовХарактеристик запускается процедура

Процедура ОбновитьОписаниеСвойств(ЕстьИзменения = Неопределено) Экспорт

она вызывает в свою очередь

Функция СвойстваВидовДоступа()

которая вызывает

СтандартныеПодсистемыПереопределяемый.ЗаполнитьСвойстваВидаДоступа(Свойства)

И вот эта процедура делает то, что нам нужно, т.е. заполняет параметры для нашей мега константы. Например я добавляю новый параметр отбора ЦФО, соответственно я вставляю вот такой код:

ИначеЕсли Свойства.ВидДоступа = ПланыВидовХарактеристик.ВидыДоступа.ЦФО Тогда

Свойства.Таблицы.Добавить("Справочник.Подразделения");
Свойства.ВидДоступаБезГруппЗначенияДоступа            = Истина;
Свойства.ВидДоступаЕдинственныйДляТипаЗначенияДоступа = Истина;

Где значения ЦФО живут в справочнике Подразделения. Ну вот, как-то так.


Для новых версий:

1. Внести изменения в общий модуль «УправлениеДоступомПереопределяемый»:

Процедура ПриЗаполненииВидовДоступа(ВидыДоступа) Экспорт

...

//+ Насыров
ВидДоступа = ВидыДоступа.Добавить();
ВидДоступа.Имя = "ВидыКартЛояльности";
ВидДоступа.Представление    = НСтр("ru = 'Виды карт лояльности'");
ВидДоступа.ТипЗначений      = Тип("СправочникСсылка.ВидыКартЛояльности");
//-Насыров

КонецПроцедуры
Процедура ПриЗаполненииИспользованияВидаДоступа(ВидДоступа, Использование) Экспорт

Если ВидДоступа = "ГруппыНоменклатуры" Тогда

Использование = Константы.ИспользоватьГруппыДоступаНоменклатуры.Получить();

...

ИначеЕсли ВидДоступа = "ХозяйственныеОперации" Тогда

Использование = Истина;

//+ Насыров
ИначеЕсли ВидДоступа = "ВидыКартЛояльности" Тогда

Использование = Истина;
//- Насыров

КонецЕсли;

КонецПроцедуры

2. Обновить содержимое константы «ПараметрыОграниченияДоступа»

Это можно сделать например внешней обработкой, в форме которой вызывается код:

Константы.ПараметрыОграниченияДоступа.СоздатьМенеджерЗначения(
).ОбновитьОписаниеСвойствВидовДоступа();

Итак, новый вид доступа добавлен. Теперь мы можем использовать его при настройке доступа к данным на уровне записей таблиц базы данных (RLS).

О том как это сделать подробно рассказано в следующей статье:

Использование подсистемы «Управление доступом» из состава БСП версии 2.2+

Но иногда бывают случаи когда нам не нужно ограничивать доступ на уровне записей по созданному нами виду доступа.

Допустим мы хотим использовать новый вид доступа для настраиваемых ограничений по выбору определенных элементов справочника.

Например в моем случае нужно было ограничить доступные кассирам виды карт лояльности при создании новых карт.

Т.е. перед тем как кассир начнет выбирать вид карты, мы должны определить какие виды карт он может использовать.

Мы должны получить список видов карт аналогичный списку при настроенном RLS на право «Чтение» при использовании шаблона ограничений #ПоЗначениям().

Если вы откроете текст этого шаблона, то увидите порядка 3000 строк кода, в которых не так то просто разобраться.

Что же делать? Предлагаю использовать следующую функцию:

// Функция возвращает массив доступных элементов справочника, к данным которых
// у текущего пользователя разрешено требуемое право доступа по RLS.
//
// Порядок использования функции можно использовать, если требуется выполнять запросы
// в привилегированном режиме, но чтобы при этом учитывались настройки доступа по RLS:
// 1. с помощью текущей функции определяется список доступных элементов справочника.
// 2. в текстах запросов к самим данных (регистрам, документам)
// устанавливаются отборы по этим элементам справочника
// 3. перед выполнением запроса к данным включается привилегированный режим.
//
// Параметры:
// ПравоНаИзменение - Булево
// - Истина - если после выполнения запроса данные предполагается менять
// и нужно проверить, что у пользователя есть право на изменение;
// - Ложь - если данные только отображаются пользователю на чтение,
// и нужно проверить что у него есть соответствующее право.
//
Функция ВсеЭлементыСправочникаДанныеКоторыхДоступныПоRLS(ТипПроверяемыхЗначений, ПравоНаИзменение=Ложь) Экспорт

Если ТипЗнч(ТипПроверяемыхЗначений) = Тип("Тип") Тогда
ИмяТаблицы = Метаданные.НайтиПоТипу(ТипПроверяемыхЗначений).Имя;
Иначе
ИмяТаблицы = Метаданные.НайтиПоТипу(ТипЗнч(ТипПроверяемыхЗначений)).Имя;
КонецЕсли;

Запрос = Новый Запрос;

Если Пользователи.ЭтоПолноправныйПользователь()
ИЛИ НЕ УправлениеДоступом.ОграничиватьДоступНаУровнеЗаписей() Тогда

// Ограничений по RLS нет, возвращаем все элементы из справочника

Запрос.Текст =
"ВЫБРАТЬ
| $ИмяТаблицы$.Ссылка
|ИЗ
| Справочник.$ИмяТаблицы$ КАК $ИмяТаблицы$";

Иначе

// Запрос взят из шаблона #ПоЗначениям роли ДобавлениеИзменениеДанныхБухгалтерии
// с теми параметрами, с которыми он применяется для регистра бухгалтерии Хозрасчетный.
Запрос.УстановитьПараметр("Пользователь", Пользователи.ТекущийПользователь());
Запрос.УстановитьПараметр("Изменение", ПравоНаИзменение);

Запрос.УстановитьПараметр("ИмяРегистра", "Справочник."+ИмяТаблицы);

ТекстЗапроса =
"ВЫБРАТЬ
| $ИмяТаблицы$.Ссылка
|ИЗ
| Справочник.$ИмяТаблицы$ КАК $ИмяТаблицы$
|ГДЕ
| ИСТИНА В
| (ВЫБРАТЬ ПЕРВЫЕ 1
| ИСТИНА
| ИЗ
| Справочник.ИдентификаторыОбъектовМетаданных КАК СвойстваТекущейТаблицы
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа КАК ГруппыДоступа
| ПО
| СвойстваТекущейТаблицы.ПолноеИмя = &ИмяРегистра
| И ИСТИНА В
| (ВЫБРАТЬ ПЕРВЫЕ 1
| ИСТИНА
| ИЗ
| РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступа
| ГДЕ
| ТаблицыГруппДоступа.Таблица = СвойстваТекущейТаблицы.Ссылка
| И ТаблицыГруппДоступа.ГруппаДоступа = ГруппыДоступа.Ссылка
| И ТаблицыГруппДоступа.Изменение = &Изменение)
| И ГруппыДоступа.Ссылка В
| (ВЫБРАТЬ
| ГруппыДоступаПользователи.Ссылка КАК ГруппаДоступа
| ИЗ
| Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
| ПО
| СоставыГруппПользователей.Пользователь = &Пользователь
| И СоставыГруппПользователей.ГруппаПользователей = ГруппыДоступаПользователи.Пользователь)
| ГДЕ
| ВЫБОР
| КОГДА ИСТИНА В
| (ВЫБРАТЬ ПЕРВЫЕ 1
| ИСТИНА
| ИЗ
| РегистрСведений.ЗначенияГруппДоступа КАК Значения
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
| ПО
| Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
| И Значения.ЗначениеДоступа = $ИмяТаблицы$.Ссылка
| И ГруппыЗначений.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа)
| ТОГДА ИСТИНА
| ИНАЧЕ ЛОЖЬ
| КОНЕЦ = ВЫБОР
| КОГДА ИСТИНА В
| (ВЫБРАТЬ ПЕРВЫЕ 1
| ИСТИНА
| ИЗ
| РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
| ГДЕ
| ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
| И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ($ИмяТаблицы$.Ссылка)
| И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ)
| ТОГДА ИСТИНА
| ИНАЧЕ ЛОЖЬ
| КОНЕЦ)";

Запрос.Текст = ?(ПравоНаИзменение,
ТекстЗапроса,
СтрЗаменить(ТекстЗапроса, "И ТаблицыГруппДоступа.Изменение = &Изменение", ""));

КонецЕсли;

Запрос.Текст = СтрЗаменить(Запрос.Текст, "$ИмяТаблицы$", ИмяТаблицы);

// Доступ к настройкам RLS выполняется в привилегированном режиме.
УстановитьПривилегированныйРежим(Истина);

Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");

КонецФункции

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

Эта функция вернет нам список доступных элементов справочника согласно настройкам заданным в справочниках ГруппыДоступа или ПрофилиГруппДоступа.

Ну вот, собственно, и все.

10 Comments

  1. nixel

    Т.е. сразу открыть документацию по БСП в голову не пришло?

    Reply
  2. Vovan58

    А по проще — через справочник «Профили групп доступа» ? и потом запустить обработку ИнструментыРазработчикаОбновлениеВспомогательныхДанных ?

    Reply
  3. Spacer

    (2) Vovan58, вы сможете просто так, ничего не меняя в конфигурации, добавить новый вид доступа в справочник «Профили групп доступа»?

    Тогда вы просто волшебник.:)

    Reply
  4. Vovan58

    Да, он не будет предопределенным. В УНФ у меня это получалось 🙂

    Проверил в УТ 11.1 только что — тоже.

    Reply
  5. knopnarix

    Все понятно. Купи 1с УТ 11 КОРП за большие бабки, чтобы это гуано не тупило уже на 3-х пользователях с номенклатурой 300 единиц купи сервер 1с и поставь хотя-бы на постгрес, забей на разделы в правах типа «Добавление и редактирование ….», и рядом «Добавление редактирование», что не облегчает поиск, меняется подход к решению в общем типовой для торговых предприятий задачи. Так еще и на типа 1с-ном форуме, где сидят дико умные программисты, никто конфу не знает и ничего толком предложить по настройкам не может. Все только впаривают свои кривые внешние обработки, педлагают допилить базу в разных местах, а потом все выбрасывается и рекомендуется купить новую конфу. На каком основании вобще тогда такой «продукт автоматизации» покупают? Еще и за подписку платят, чтобы обнвления кривые ставить. Есть галочки ограничения на уровне записей и на уровне партнеров. А есть очевидная задача для любого комммерческого предприятия назначить менеджеру по продажам видеть только свои документы. Иногда менеджер должен видеть только тех клиентов, которых ему выделили в обслуживание или тех, которых он сам наработал. Вот и как этого добиться, не снимая конфу с поддержки? Почему в редакторе пользователя нельзя установить, правила доступа в виде 2-х доп. таблиц: видетьдокументы пользователей, видеть группы партнеров/контрагентов/клиентов. Или я таколй дурак и не могу это найти уже 2 неделди?? Почему 1с выпускает такие типовые конфигурации, которые, чтобызаработали как надо, нужно допиливать при помощи напильника и такой-то матери? И вот читаю форум (не конкретно эту тему) — куча спецов, дающих абстрактные ответы при наличии адекватных решений, если пол часа посидеть в настройках. Прошу отозваться участников форума реально владеющих конфигурацией. В противном случае вообще не знаю зачем я здесь зарегался. Спасибо.

    Reply
  6. knopnarix

    Я вообще не понимаю фетиша допиливать типовые конфигурации после уплаты их полной стоимости. Если ты используешь свою конфу полность самописную — ты должен купить хоть какуюто. Я готов купить платформу и пользовательские ключи на запуск своей базы, а не конфу, которая мне не нужна. И вообще, если из коробки ее нельзя нормально настроить, зачем нужна такая программа автоматизации. У меня бомбит от 1с — тут нельзя делать элементарные вещи простым способом — нужно *ться, а не работать. От нафик, к примеру, типовую обработку обмена обновляют от конфы к конфе? Так много документов существуют: заказ, счет, сч-ф акт, накладная, упд (которая по суты сч.ф+накладная+доп. параметр).

    Reply
  7. knopnarix

    Итак, у меня побомбило и я готов поделиться решением. Не претендую на уникальность, если я идиот, прошу меня об этом аргументированно уведомить. Стремился решить задачу без участия конфигуратора даже для настройки прав (помня некоторые неприятные особенности со старых 8.2 при настройке прав пользователей из конфигуратора)

    Задача: Менеджер отдела продаж должен видеть только свои документы. Менеджер отдела продаж должен видеть только своих партнеров (или тех, которых ему в работу передало руководство)

    Граничные условия: УТ 11.4 типовая. В конфигуратор лезть запрещено под страхом отрубания головы.

    Решение: 1. Администрирование/настройки пользователей и прав ставим галки: Ограничивать доступ на уровне записей, группы доступа партнеров

    2. Собираем свои группы доступа на основе зашитых шаблонов профилей доступа.

    3. Создаем список групп доступа партнеров (я их именовалменеджерами, колхоз, но большего не придумал)

    4. Тут вилка. Либо для каждого менеджера кохозим свою персональную VIP группу, где прописываем в ограничениях пользователя и группы партнеров, либо колхозим типовую группу для менеджеров и добавляем каждому персональную группку с ограничениями. В исключениях ставим, соотвтвенно самого себяшенького менеджера, для которого делаются ограниччения, а также накидывается список из групп доступа по партнерам.

    Reply
  8. knopnarix

    Добавлю: Когдасоздаете/редактируете партнера после этих настроек — появляется поле ввода группы доступа партнера — выбираем изсписка и сохраняем, чтобы конкретный партнер для конкретной группы заработал

    Reply
  9. agaraev

    Спасибо за статью! Потребовалось добавить ограничения в «Комплексная автоматизация 2» по справочнику «Направление деятельности». Пытался сам найти что и куда дописать, но так и не нашел, а со статьей все получилось.

    Только есть небольшое замечание по п. 2 для новых версий: константы «ПараметрыОграниченияДоступа» в новых версиях БСП нет. Для обновления описания свойств видов доступа в обработке нужно писать следующий код:

    УправлениеДоступомСлужебный.ОбновитьОписаниеСвойствВидовДоступа()

    Reply
  10. join2us

    УНФ 1.6

    прошло как по маслу, спасибо.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *