Все примеры в данной статье делались в конфигурации
Демонстрационная конфигурация "Библиотека стандартных подсистем", редакция 3.1 (3.1.11.189)
Подготовка необходимых объектов
- Создаем справочник "Склады"
- Создаем документ, в моем случае документ называется "Реализация товаров и услуг". В документе один реквизит "Организация" (с типом "СправочникСсылка._ДемоОрганизации") и табличная часть "Товары", с реквизитами "Склад" (с типом СправочникСсылка.Склады), "Номенклатура" (с типом СправочникСсылка._ДемоНоменклатура), "Количество"
- Создаем роль "ЧтениеРеализацияТоваровИУслуг". В этой роле для документа "Реализация товаров и услуг" устанавливаем права: Чтение, Просмотр, Ввод по строке
- Создаем роль "ЧтениеСклады". В этой роле для справочника Склады устанавливаем права: Чтение, Просмотр, Ввод по строке
- Создаем роль "ДобавлениеИзменениеРеализацияТоваровИУслуг". В этой роле для документа "Реализация товаров и услуг" устанавливаем права: Чтение, Добавление, Изменение, Проведение, Отмена проведения, Просмотр, Интерактивное добавление, Редактирование, Интерактивная пометка удаления, Интерактивное снятие пометки удаления, Интерактивное проведение, Интерактивное проведение неоперативное, Интерактивная отмена проведения, Интерактивное изменение проведенных, Ввод по строке
- Создаем роль "ДобавлениеИзменениеСклады". В этой роле для справочника Склады устанавливаем права: Чтение, Добавление, Изменение, Просмотр, Интерактивное добавление, Редактирование, Интерактивная пометка на удаление, Интерактивное снятие пометки удаления, Ввод по строке.
- Еще я создал подсистему "ОграничениеНаУровнеЗаписейДемо" и роль ПодсистемаОграничениеНаУровнеЗаписейДемо, в которой добавил право просмотра этой подсистемы
Подключение документа к спискам объектов, для которых действует ограничение на уровне записей
Для того чтобы подключить документ к спискам объектов, у которых ограничен доступ на уровне записей, необходимо доработать метод УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа(Списки).
По стандартам разработки не следует размещать свою логику в переопределяемых модулях, а только вызывать свои методы. В связи с этим создадим свой общий серверный модуль, я называл его "УправлениеДоступомДемо".
Теперь код метода УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа(Списки) будет выглядеть так:
Процедура ПриЗаполненииСписковСОграничениемДоступа(Списки) Экспорт
// _Демо начало примера
_ДемоСтандартныеПодсистемы.ПриЗаполненииСписковСОграничениемДоступа(Списки);
// _Демо конец примера
// Вызов метода для добавления своих объектов в список объектов с ограничениями доступа
УправлениеДоступомДемо.ПриЗаполненииСписковСОграничениемДоступа(Списки);
КонецПроцедуры
Соответственно в модуле УправлениеДоступомДемо нужно создать процедуру ПриЗаполненииСписковСОграничениемДоступа(Списки). Параметр процедуры "Списки" - это соответствие, ключ которого объект метаданных, а значение Булево, если в значении указано Истина, то текст самого ограничения указывается в модуле менеджера, если Ложь, то текст ограничения указывается в методе УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа()
Процедура ПриЗаполненииСписковСОграничениемДоступа(Списки) Экспорт
Списки.Вставить(Метаданные.Документы.РеализацияТоваровИУслуг, Истина);
КонецПроцедуры
Заполнение ограничения доступа
Разработка ограничений доступа заключается в написании простого запроса с некоторыми упрощениями. Примеры таких запросов есть на ИТС в инструкции к БСП в главе 3. В данном примере я буду использовать простое ограничение доступа. Для этого в модуле менеджера документа "Реализация товаров и услуг" необходимо создать процедуру ПриЗаполненииОграниченияДоступа(Ограничение) и прописать там ограничение
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
#Область ПрограммныйИнтерфейс
#Область ДляВызоваИзДругихПодсистем
#Область УправлениеДоступом
// СтандартныеПодсистемы.УправлениеДоступом
// Параметры:
// Ограничение - см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение.
//
Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт
Ограничение.Текст =
"РазрешитьЧтениеИзменение
|ГДЕ
| ЗначениеРазрешено(Организация)";
КонецПроцедуры
// Конец СтандартныеПодсистемы.УправлениеДоступом
#КонецОбласти
#КонецОбласти
#КонецОбласти
#КонецЕсли
Далее необходимо создать или обновить процедуры в форме документа ПриЧтенииНаСервере() и ПослеЗаписиНаСервере()
&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
// СтандартныеПодсистемы.УправлениеДоступом
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда
МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом");
МодульУправлениеДоступом.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
КонецЕсли;
// Конец СтандартныеПодсистемы.УправлениеДоступом
КонецПроцедуры
&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
// СтандартныеПодсистемы.УправлениеДоступом
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда
МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом");
МодульУправлениеДоступом.ПослеЗаписиНаСервере(ЭтотОбъект, ТекущийОбъект, ПараметрыЗаписи);
КонецЕсли;
// Конец СтандартныеПодсистемы.УправлениеДоступом
КонецПроцедуры
Далее необходимо доработать роли, которые создали в начале. Для ролей "ЧтениеРеализацияТоваровИУслуг" и "ДобавлениеИзменениеРеализацияТоваровИУслуг" добавляем шаблон ограничений.
Наименование шаблона: "ДляОбъекта(ПолеОбъекта)".
Текст шаблона:
У роли "ЧтениеРеализацияТоваровИУслуг" для права "Чтение", нужно указать ограничение доступа к данным.
Поля: <Прочие поля>.
Ограничение Доступа:
У роли "ДобавлениеИзменениеРеализацияТоваровИУслуг" нужно указать такие же ограничения для прав: Чтение, Добавление, Изменение
Далее необходимо изменить определяемые типы "ВладелецЗначенийКлючейДоступа" и "ВладелецЗначенийКлючейДоступаДокумент".
В определяемом типе "ВладелецЗначенийКлючейДоступа" добавляем тип "ДокументСсылка.РеализацияТоваровИУслуг"
В определяемом типе "ВладелецЗначенийКлючейДоступаДокумент" добавляем тип "ДокументОбъект.РеализацияТоваровИУслуг"
На этом этапе необходимо обновить информационную базу и выполнить запуск с параметром /c ЗапуститьОбновлениеИнформационнойБазы
Настройка профилей групп доступа
Для того чтобы наше ограничение заработало, нужно создать профиль групп доступа и саму группу доступа.
Для этого нужно перейти в Администрирование -> Настройка пользователей и прав -> Профили групп доступа.
Создаем новый профиль, в наименовании я указал "Ограничение доступа по организации для реализации (демо)".
В разрешенные роли нужно добавить: Базовые права БСП, Демо: Чтение нормативно-справочной информации (в моем случае, чтобы была возможность чтения справочника организации), Добавление изменение реализация товаров и услуг, Чтение реализация товаров и услуг, Подсистема ограничение на уровне записей демо, Демо: Базовые права (из расширения) (ставится автоматически, если используется демо конфигурация БСП), если используется конфигурация "Демо БСП", то необходимо так же добавить роль Демо: Базовые права БСП.
В результате профиль будет выглядеть так:
На закладке "Ограничения доступа" необходимо указать ограничение
Вид доступа: Демо: Организации
Значение доступа: Все запрещены, исключения назначаются в группах доступа
Записываем элемент справочника, переходим по ссылке "Группы доступа"
Создаем новую группу, в моем случае наименование группы Реализации с организацией "Ромашка ОАО".
Добавляем пользователей, который будут входить в эту группу.
На закладке "Ограничения доступа", в таблице разрешенные значения добавляем организацию "Ромашка ОАО".
Записываем элемент.
На этом разработка и настройка ограничений закончена. Если зайти в программу под пользователем, которого указали в группе доступа, то у него для документа "Реализация товаров и услуг", будет ограничение по организации "Ромашка ОАО".
Установка ограничений по своему виду доступа
На первом этапе мы установили ограничение доступа по справочнику, который уже был включен в список видов доступа (Организации).
Теперь сделаем ограничение по справочнику "Склады", который мы добавили в самом начале.
Для добавления своего вида доступа необходимо изменить процедуру "УправлениеДоступомПереопределяемый.ПриЗаполненииВидовДоступа(ВидыДоступа)". В эту процедуру добавляем одноименный метод в модуле "УправлениеДоступомДемо".
Процедура ПриЗаполненииВидовДоступа(ВидыДоступа) Экспорт
// _Демо начало примера
_ДемоСтандартныеПодсистемы.ПриЗаполненииВидовДоступа(ВидыДоступа);
// _Демо конец примера
// Добавление новых видов доступа
УправлениеДоступомДемо.ПриЗаполненииВидовДоступа(ВидыДоступа);
КонецПроцедуры
Параметры "ВидДоступа", это таблица значений, в которую необходимо добавить свой вид доступа, примеры как добавлять есть в описании процедуры "УправлениеДоступомПереопределяемый.ПриЗаполненииВидовДоступа(ВидыДоступа)". В модуле "УправлениеДоступомДемо", в процедуре ПриЗаполненииВидовДоступа(ВидыДоступа) делаем добавление своего вида доступа.
Процедура ПриЗаполненииВидовДоступа(ВидыДоступа) Экспорт
ВидДоступа = ВидыДоступа.Добавить();
ВидДоступа.Имя = "Склады";
ВидДоступа.Представление = НСтр("ru = 'Склады'");
ВидДоступа.ТипЗначений = Тип("СправочникСсылка.Склады");
КонецПроцедуры
Далее необходимо изменить определяемые типы "ЗначениеДоступа", "ЗначениеДоступаОбъект".
В "ЗначениеДоступа" добавляем тип "СправочникСсылка.Склады".
В "ЗначениеДоступаОбъект" добавляем типа "СправочникОбъект.Склады".
Далее в модуле менеджера документа "Реализация товаров и услуг" необходимо доработать ограничение.
Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт
Ограничение.Текст =
"РазрешитьЧтениеИзменение
|ГДЕ
| ЗначениеРазрешено(Организация)
| И ДляВсехСтрок(ЗначениеРазрешено(Товары.Склад, NULL КАК Истина, ПустаяСсылка как Истина))";
КонецПроцедуры
Добавленная строка "И ДляВсехСтрок(ЗначениеРазрешено(Товары.Склад, NULL КАК Истина, ПустаяСсылка как Истина))" означает что кроме организации, нужно еще проверять чтобы во всех строках документа был указан доступный пользователю склад.
Уточнение NULL КАК Истина указывает на то что документы с пустой табличной частью так же доступны пользователю.
Уточнение ПустаяСсылка как Истина указывает на то что документы в не заполненным складом в табличной части так же доступны пользователю
Далее необходимо обновить информационную базу и выполнить запуск с параметром /c ЗапуститьОбновлениеИнформационнойБазы
Далее необходимо изменить профиль групп доступа, добавив в него ограничение по новому виду доступа "Склады", так же как делали для вида доступа "Организации".
В группе доступа, на закладке "Ограничение доступа", необходимо указать доступные этой группе пользователей склады, так же как это делали для ограничения "Организации"
На этом настройка своего вида доступа закончена.
Пользователи, которые будут включены в группу доступа, будут иметь возможность работать только с документами, у который указана организация "Ромашка ОАО", и склад будет такой же как указан в группе доступа, либо табличная часть пустая, либо склад не заполнен.