Каталог решений - Ограничение доступа к справочнику склады для конфигурации Управление торговлей 8.1(8.2), редакция 10.3.

Ограничение доступа к справочнику склады для конфигурации Управление торговлей 8.1(8.2), редакция 10.3.

Ограничение доступа к справочнику склады для конфигурации Управление торговлей 8.1(8.2), редакция 10.3.

В наличии

Статья для тех, кто только начинает разбираться с RLS (Record Level Security — доступ на уровне записей)
А также для тех, кому лень разбираться в тонкостях программирования. Можете взять за основу код приведенный в статье.

Категория:

Описание

Появилась у меня необходимость в конфигурации «Управление торговлей» определенным группам пользователей ограничить доступ к списку складов. Поскольку в типовой конфигурации не предусмотрено такой возможности, я порылся в интернете и понял, что у многих возникал этот вопрос. Находил ответы на свой вопрос с примерами кода, но отрывками. Вот, решил оформить то, что у меня в результате получилось. Сразу оговорюсь, что с 8.X я недавно стал работать поэтому не пинайте сильно. В основном публикация предназначена для новичков.

Исходная конфигурация: Управление торговлей 10.3.8.9.

1) Добавляем новое значение в перечисление ВидыОбъектовДоступа —  Склады.

2) Вносим изменения в регистр сведений НастройкиПравДоступаПользователей. В измерениях ОбъектДоступа и ВладелецПравДоступа  отмечаем флажком  тип данных  СправочникСсылка.Склад.

3) Вносим изменения в обработку НастройкаПравДоступа:

  • Добавляем новую страницу, на которой будет происходить настройка доступа к складам. Я назвал её Склады.
  • Размещаем табличное поле на новой странице и настраиваем его по аналогии с табличными полями расположенными на закладках Организации и Контрагенты.

3.1) Добавляем строчки кода в модуль формы  НастройкаПравДоступа:

  •  Изменим функцию ПолучитьСписокОбластейДанных

Функция ПолучитьСписокОбластейДанных(ТипДанных)
   
СписокОбластей = Новый СписокЗначений;
    Если
ТипДанных = Тип(«СправочникСсылка.Организации») Тогда
       
СписокОбластей.Добавить(Перечисления.ВидыОбъектовДоступа.Организации);
    ИначеЕсли
ТипДанных = Тип(«СправочникСсылка.ГруппыДоступаККонтрагентам») Тогда
       
СписокОбластей.Добавить(Перечисления.ОбластиДанныхОбъектовДоступа.КонтрагентыСписок);
    ИначеЕсли
ТипДанных = Тип(«СправочникСсылка.ГруппыПользователей») Тогда
       
// Добавим только те виды объектов доступа, для которых нет областей данных
       
СписокОбластей.Добавить(Перечисления.ВидыОбъектовДоступа.Организации);
       
// Добавим все области данных
       
Для каждого Перечисление Из Перечисления.ОбластиДанныхОбъектовДоступа Цикл
           
СписокОбластей.Добавить(Перечисление);
        КонецЦикла;
       
// Для ограничения доступности по складам. Начало
   
ИначеЕсли ТипДанных = Тип(«СправочникСсылка.Склады») Тогда
       
СписокОбластей.Добавить(Перечисления.ВидыОбъектовДоступа.Склады);
       
// Для ограничения доступности по складам. Конец
   
КонецЕсли;
    Возврат
СписокОбластей;
КонецФункции

  •    Добавим код в  функцию ПередОткрытием:

ТипыОбъектовДоступа.Вставить(«Склады»     , Тип(«СправочникСсылка.Склады»));

4) Вносим изменения в ОбщийМодуль —  НастройкаПравДоступа

Функция ПолучитьВидОбъектаДоступа(ОбъектДоступа) Экспорт
    Если
ТипЗнч(ОбъектДоступа) = Тип(«СправочникСсылка.Организации») Тогда
        Возврат
Перечисления.ВидыОбъектовДоступа.Организации;
    ИначеЕсли
ТипЗнч(ОбъектДоступа) = Тип(«СправочникСсылка.ГруппыДоступаККонтрагентам») Тогда
        Возврат
Перечисления.ВидыОбъектовДоступа.Контрагенты;
       
// Для ограничения доступности по складам. Начало
   
ИначеЕсли ТипЗнч(ОбъектДоступа) = Тип(«СправочникСсылка.Склады») Тогда
        Возврат
Перечисления.ВидыОбъектовДоступа.Склады;
       
// Для ограничения доступности по складам. Конец
   
Иначе
        Возврат
Перечисления.ВидыОбъектовДоступа.ПустаяСсылка();
    КонецЕсли;
КонецФункции
 

5) Добавляем ограничение доступа к данным на чтение у роли Пользователь для объекта Справочники Склады. В поле Ограничение доступа пишем следующий код: 
#ТаблицаОсновогоВидаОбъектаДоступа(«Склады», «Ссылка», «»)

1.png

Поскольку шаблон ограничений ТаблицаОсновогоВидаОбъектаДоступа уже есть, то здесь больше ничего не делаем. Теперь доступ на видимость складов в справочнике склады настроен. Далее нам нужно чтобы в отчеты попадали только те склады, которые доступны группе пользователей.

 6) Для роли, которую надо ограничить в доступе добавляем шаблон ограничений (закладка шаблоны ограничений). Назовем ограничение Склад, а  в тексте шаблона напишем код:

#Если &ИспользоватьОграниченияПравДоступаНаУровнеЗаписей #Тогда
ТекущаяТаблица
ИЗ
   
#ТекущаяТаблица КАК ТекущаяТаблица
       
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ РАЗЛИЧНЫЕ
            СоставГруппы.Ссылка КАК ГруппаПользователей
        ИЗ
           
Справочник.ГруппыПользователей.ПользователиГруппы КАК СоставГруппы
        ГДЕ
            СоставГруппы.Пользователь = &ТекущийПользователь) КАК ГруппыПользователей
        ПО (ИСТИНА)
ГДЕ
НЕ ГруппыПользователей.ГруппаПользователей ЕСТЬ NULL
И
    (НЕ
1 В
                (ВЫБРАТЬ ПЕРВЫЕ 1
                    1
               
ИЗ
                   
РегистрСведений.НазначениеВидовОбъектовДоступа КАК НазначениеВидовОбъектовДоступа

                    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиПравДоступаПользователей КАК НастройкиПравДоступаПользователей
                        ПО
                           
НастройкиПравДоступаПользователей.ОбъектДоступа = ТекущаяТаблица.#Параметр(1)
                               
И НастройкиПравДоступаПользователей.ВидОбъектаДоступа = НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа
                                И НастройкиПравДоступаПользователей.ОбластьДанных = ЗНАЧЕНИЕ(Перечисление.ОбластиДанныхОбъектовДоступа.ПустаяСсылка)

                                И НастройкиПравДоступаПользователей.Пользователь = ГруппыПользователей.ГруппаПользователей
                ГДЕ
                     НазначениеВидовОбъектовДоступа.ГруппаПользователей = ГруппыПользователей.ГруппаПользователей
                           И НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа В (ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Склады))

                    И НастройкиПравДоступаПользователей.ОбъектДоступа ЕСТЬ NULL))
#КонецЕсли 

7) Затем, возвращаемся на закладку Права и находим в дереве объект Регистр накопления —  ТоварыНаСкладах и добавляем ограничение доступа к данным на чтение. В поле Ограничение доступа пишем следующий код:

#Cклад(«Склад») 

8) Далее, для этого регистра для роли Пользователь создаем ограничение доступа к данным на чтение. Для этого добавляем ограничение следующего содержания ГДЕ ЛОЖЬ

9) Теперь нам нужно настроить форму списка документов таким образом, чтобы пользователь видел только те документы: реализация, заказ и т.д., где указан доступный для чтения склад. Я сделал ограничение в документе РеализацияТоваровУслуг. По аналогии с этим можно ограничить и другие формы списков документов.
Открываем роль, которой мы хотим назначить ограничение и переходим на закладку Шаблоны ограничений. Добавляем новый шаблон ОрганизацияВШапкеКонтрагентВШапкеСкладВШапке,в тексте шаблона пишем следующий код:

##Если &ИспользоватьОграниченияПравДоступаНаУровнеЗаписей ##Тогда
ТекущаяТаблица ИЗ #ТекущаяТаблица КАК ТекущаяТаблица
   
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ РАЗЛИЧНЫЕ
        СоставГруппы.Ссылка КАК ГруппаПользователей
    ИЗ
       
Справочник.ГруппыПользователей.ПользователиГруппы КАК СоставГруппы
    ГДЕ
        СоставГруппы.Пользователь = &ТекущийПользователь) КАК ГруппыПользователей
    ПО (&ИспользоватьОграниченияПравДоступаНаУровнеЗаписей)
ГДЕ (&ИспользоватьОграниченияПравДоступаНаУровнеЗаписей = ЛОЖЬ
            ИЛИ (НЕ
1 В
                    (ВЫБРАТЬ ПЕРВЫЕ 1
                        1
КАК ПолеОтбора
                    ИЗ
                       
РегистрСведений.НазначениеВидовОбъектовДоступа КАК НазначениеВидовОбъектовДоступа
                    ГДЕ
                        НазначениеВидовОбъектовДоступа.ГруппаПользователей = ГруппыПользователей.ГруппаПользователей
                        И ВЫБОР
                            КОГДА НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Организации)
                                И
ТекущаяТаблица.#Параметр(1) ССЫЛКА Справочник.Организации
                               
И НЕ ТекущаяТаблица.#Параметр(1) = ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка)
                               
ТОГДА ВЫБОР
                                        КОГДА 1 В
                                                (ВЫБРАТЬ ПЕРВЫЕ 1
                                                    1
                                               
ИЗ
                                                    (
ВЫБРАТЬ
                                                        1 КАК ПолеОтбора
                                                    ) КАК Оптмизация ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиПравДоступаПользователей КАК НастройкиПравДоступаПользователей
                                                        ПО
                                                           
НастройкиПравДоступаПользователей.ОбъектДоступа = ТекущаяТаблица.#Параметр(1)
                                                               
И НастройкиПравДоступаПользователей.ВидОбъектаДоступа = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Организации)
                                                                И (
НастройкиПравДоступаПользователей.Пользователь = НазначениеВидовОбъектовДоступа.ГруппаПользователей
                                                                    ИЛИ НастройкиПравДоступаПользователей.Пользователь = ЗНАЧЕНИЕ(Справочник.ГруппыПользователей.ВсеПользователи)))
                                            ТОГДА ИСТИНА
                                        ИНАЧЕ ЛОЖЬ
                                   
КОНЕЦ
                            КОГДА НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Контрагенты)
                                И
ТекущаяТаблица.#Параметр(2) ССЫЛКА Справочник.Контрагенты
                               
И НЕ ТекущаяТаблица.#Параметр(2) = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
                               
ТОГДА ВЫБОР
                                        КОГДА 1 В
                                                (ВЫБРАТЬ ПЕРВЫЕ 1
                                                    1
                                               
ИЗ
                                                   
Справочник.Контрагенты КАК Контрагенты ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиПравДоступаПользователей КАК НастройкиПравДоступаПользователей
                                                        ПО
                                                           
НастройкиПравДоступаПользователей.ОбъектДоступа = Контрагенты.ГруппаДоступаККонтрагенту
                                                                И НастройкиПравДоступаПользователей.ВидОбъектаДоступа = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Контрагенты)
                                                                И (
НастройкиПравДоступаПользователей.Пользователь = НазначениеВидовОбъектовДоступа.ГруппаПользователей
                                                                    ИЛИ НастройкиПравДоступаПользователей.Пользователь = ЗНАЧЕНИЕ(Справочник.ГруппыПользователей.ВсеПользователи))
                                               
ГДЕ
                                                    Контрагенты.Ссылка = ТекущаяТаблица.#Параметр(2))
                                           
ТОГДА ИСТИНА
                                        ИНАЧЕ ЛОЖЬ
                                   
КОНЕЦ
                            // Для контроля доступности по складам. Начало
                           
КОГДА НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Склады)
                                И
ТекущаяТаблица.#Параметр(3) ССЫЛКА Справочник.Склады
                               
И НЕ ТекущаяТаблица.#Параметр(3) = ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка)
                               
ТОГДА ВЫБОР
                                        КОГДА 1 В
                                                (ВЫБРАТЬ ПЕРВЫЕ 1
                                                    1
                                               
ИЗ
                                                    (
ВЫБРАТЬ
                                                        1 КАК ПолеОтбора
                                                    ) КАК Оптмизация ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиПравДоступаПользователей КАК НастройкиПравДоступаПользователей
                                                        ПО
                                                           
НастройкиПравДоступаПользователей.ОбъектДоступа = ТекущаяТаблица.#Параметр(3)
                                                               
И НастройкиПравДоступаПользователей.ВидОбъектаДоступа = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Склады)
                                                                И (
НастройкиПравДоступаПользователей.Пользователь = НазначениеВидовОбъектовДоступа.ГруппаПользователей
                                                                    ИЛИ НастройкиПравДоступаПользователей.Пользователь = ЗНАЧЕНИЕ(Справочник.ГруппыПользователей.ВсеПользователи)))
                                            ТОГДА ИСТИНА
                                        ИНАЧЕ ЛОЖЬ
                                   
КОНЕЦ
                             // Для контроля доступности по складам. Конец
                            
ИНАЧЕ ИСТИНА
                       
КОНЕЦ = ЛОЖЬ))
                        И НЕ
ГруппыПользователей.ГруппаПользователей ЕСТЬ NULL)
##КонецЕсли

Далее, переходим на закладку права, находим в ней Документ РеализацияТоваровиУслуг.
Если у вас уже есть ограничение вида:

#ОрганизацияВШапкеКонтрагентВШапке(«Организация», «Контрагент»)

то заменяем его нашим кодом:

#ОрганизацияВШапкеКонтрагентВШапкеСкладВШапке(«Организация», «Контрагент»,»Склад»)

 
Если такового нет, то добавляем новое ограничение прав и указываем текст нашего ограничения.

10) Сохраняем все. Заходим в предприятие и открываем справочник Группы пользователей. Жмем кнопку Права на нужной группе пользователей. На закладке склады указываем склады, которые должны быть доступны данной группе пользователей. После этого пользователи в справочнике складов смогут увидеть только указанные склады и отчеты, которые используют регистр ТоварыНаСкладах будут выводить ограниченный список складов.

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

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

Обновлено 22.02.12. Изменен пункт 8 статьи. Не было ограничения на чтение регистра для прав Пользователь. В связи с этим при формировании без выбора склада отчетов используемых данный регист приводило к выводу в отчет строк вида.

P.S Проверял работоспособность на 8.2- работает. Правда в режиме совместимости с 8.1 Smile

Спасибо пользователю Sai-2010 за замечание.

После данной доработки обновился на 8.2, прошел несколько релизов, сейчас остановился на 10.3.15.9 — все работает без сбоев.

has been added to your cart:
Оформление заказа