29 сент. 2016 г.

RLS Объект не найден Отчеты

После применения RLS к Справочники.Подразделения, типовым отчетом решил глянуть Продажи по подразделениям и в результате получил много строчек "объект не найден"


в прочем это и логично, ведь мы запретили видеть некоторые Подразделения но не запретили их выводить (не отфильтровали) сами "отчеты", а точнее таблицы откуда берут данные отчеты, а это - регистры.

Значит открываю Регистры.Продажи, добавляю правило к Действию Чтения и пишу
Продажи ГДЕ Продажи.Подразделение В
 (ВЫБРАТЬ
 НастройкиПользователей.Значение
 ИЗ
 РегистрСведений.НастройкиПользователей КАК НастройкиПользователей
 ГДЕ
 НастройкиПользователей.Пользователь = &ТекущийПользователь
 И НастройкиПользователей.Настройка.Код = "00005")
Этим самым мы наложим фильтр через RLS, что бы видеть в результате отчет только
своих указаных в настройках пользователя Подразделения, а все другие данные по другим
подразделениям - фильтруем (отбрасываем)

Результат






RLS доступ к справочнику с иерархией элементов

Эта заметка продолжение ниже заметки.
Нужно конкретному пользователю в списке Справочники.Подразделения с иерархией элементов разрешить видеть только свои подразделения. Свои подразделения настраиваются в РегистреСведений.НастройкиПользователя.

Так как и ниже в заметке весь "секрет" ограничения заключается в том, что нужно сначала обращаться к Родителю, а потом к самому Элементу справочника, что бы пользователь при открытии Справочники.Подразделения мог видеть только разрешенные ему подразделения.

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

СправочникСписок.Отбор Иерархия элементов

Есть справочник Подразделение с иерархией элементов. Нужно при открытии этого справочника, в списке видеть только конкретный элемент иерархического справочника.

Вся суть "секрета" заключается в том, что нужно не только указывать в отборе списка элементов справочника элемент отбора, а и нужно указать в отборе Родителя отбираемого элемента.

  Список = Новый СписокЗначений;
  Список.Добавить(Справочники.Подразделения.НайтиПоКоду("000000002").Родитель);
  Список.Добавить(Справочники.Подразделения.НайтиПоКоду("000000002"));

  СправочникСписок.Отбор.Ссылка.Использование = Истина;
  СправочникСписок.Отбор.Ссылка.ВидСравнения = ВидСравнения.ВСписке;
  СправочникСписок.Отбор.Ссылка.Значение = Список;


вся соль вот в этой строчке

  Список.Добавить(Справочники.Подразделения.НайтиПоКоду("000000002").Родитель);

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

Результат


28 сент. 2016 г.

Есть ли Свойство в ЭлементыФормы

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

КонецЦикла;
КонецПроцедуры

Функция ЕстьСвойство(Объект, ИмяСвойства)
        РезультатФункции = Ложь;
        НачальноеЗНачение = Новый УникальныйИдентификатор();
        ЗначениеРеквизита = Новый Структура(ИмяСвойства, НачальноеЗНачение);
        ЗаполнитьЗначенияСвойств(ЗначениеРеквизита,Объект);
        Если ЗначениеРеквизита[ИмяСвойства] <> НачальноеЗНачение Тогда
                РезультатФункции = Истина;
        КонецЕсли;
        Возврат РезультатФункции;
КонецФункции
или через попытку
Попытка
    Рек.Доступность = Ложь;
Исключение
КонецПопытки;
Способы нашел на просторах интернета.
 

CopyPaste Copyright © 2017 - |- Шаблон создан O Pregador - |- Отредактирован myr4ik07