8.х Разграничение прав на просмотр документов

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем maku, 22 июн 2015.

  1. TopicStarter Overlay
    maku
    Offline

    maku

    Регистрация:
    23 дек 2011
    Сообщения:
    10
    Симпатии:
    0
    Баллы:
    1
    Здравствуйте.

    В 1С 8.2 Документооборот настроено так, что пользователю доступны входящие документы того подразделения, к которому он относится (по полю "Подразделение"). Все сообщения может видеть либо секретарь, который создаёт все входящие сообщения (из эл. почты, формирует вручную из бумажных сообщений или факсов), а также администратор.
    Задача состоит в том, чтобы предоставить пользователю (из какого-то подразделения или новое создать) возможность просмотра всех сообщений.

    Конфигурация не типовая, создавали разработчики, поэтому хочу разобраться сначала сам.
    Если я правильно понимаю, то подобное ограничение можно добиться 2 способами:
    RLS и формирование запроса на вывод списка. Кстати, если пользователь, который не видит все сообщения через форму списка Входящие документы запустит консоль запросов, введёт "Выбрать * из Справочник.ВходящиеДокументы", он получит все сообщения.

    Так вот RLS.
    В ограничении роли "Чтение входящих документов" на Право "Чтение" - указано так:

    Код:
    #ПоЗначениямИНаборамРасширенный("Справочник.ВходящиеДокументы","Чтение","",
    "Левое соединение Справочник.ВходящиеДокументы.ЛичныйДоступ КАК Т1
    По Т.Ссылка = Т1.Ссылка",
    "",
    "ГрифыДоступа","ГрифДоступа","И",
    "ВопросыДеятельности","ВопросДеятельности","И",
    "ВидыВходящихДокументов","ВидДокумента","И",
    "ГруппыДоступаКорреспондентов","Отправитель","И",
    "Организации","Организация","И (",
    "Условие","Т1.Пользователь Есть NULL","ИЛИ",
    "Пользователи","Т1.Пользователь",")",
    "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","")
    Запрос же в форме списка:
    Код:
    ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
        ВходящиеДокументы.Ссылка,
        ВходящиеДокументы.ПометкаУдаления,
        ВходящиеДокументы.РегистрационныйНомер,
        ВходящиеДокументы.ВидДокумента,
        ВходящиеДокументы.Наименование,
        ВЫРАЗИТЬ(ВходящиеДокументы.Содержание КАК СТРОКА(500)) КАК Содержание,
        ВходящиеДокументы.Дело,
        ВходящиеДокументы.Зарегистрировал,
        ВходящиеДокументы.СпособПолучения,
        ВходящиеДокументы.Отправитель,
        ВходящиеДокументы.Подписал,
        ВходящиеДокументы.ИсходящийНомер,
        ВходящиеДокументы.ИсходящаяДата,
        ВходящиеДокументы.Адресат,
        ВходящиеДокументы.Подразделение,
        ВходящиеДокументы.ЧисловойНомер,
        ВходящиеДокументы.Заголовок,
        ВходящиеДокументы.ДатаРегистрации,
        ВходящиеДокументы.ДатаСоздания,
        ВходящиеДокументы.Организация,
        ВходящиеДокументы.НоменклатураДел,
        СостоянияДокументовСрезПоследних.Состояние,
        ВЫБОР
            КОГДА ИСТИНА В
                    (ВЫБРАТЬ ПЕРВЫЕ 1
                        ИСТИНА
                    ИЗ
                        Справочник.Файлы
                    ГДЕ
                        Справочник.Файлы.ВладелецФайла = ВходящиеДокументы.Ссылка)
                ТОГДА ИСТИНА
            ИНАЧЕ ЛОЖЬ
        КОНЕЦ КАК Файлы,
        ВЫБОР
            КОГДА ИСТИНА В
                    (ВЫБРАТЬ ПЕРВЫЕ 1
                        ИСТИНА
                    ИЗ
                        Задача.ЗадачаИсполнителя
                    ГДЕ
                        Задача.ЗадачаИсполнителя.Предмет = ВходящиеДокументы.Ссылка
                        И НЕ Задача.ЗадачаИсполнителя.Выполнена)
                ТОГДА ИСТИНА
            ИНАЧЕ ЛОЖЬ
        КОНЕЦ КАК Задачи,
        ВЫБОР
            КОГДА 0 В
                    (ВЫБРАТЬ
                        КОЛИЧЕСТВО(Регистр.Автор)
                    ИЗ
                        РегистрСведений.КатегорииОбъектов КАК Регистр
                    ГДЕ
                        Регистр.ОбъектДанных = ВходящиеДокументы.Ссылка)
                ТОГДА ЛОЖЬ
            ИНАЧЕ ИСТИНА
        КОНЕЦ КАК ЕстьКатегорииДанных,
        ВходящиеДокументы.ПодписанЭЦП,
        ВложенныйЗапрос.ИсполнительНаименование КАК Исполнитель,
        ВходящиеДокументы.ДатаСоздания КАК ДатаСоздания1
    ИЗ
        Справочник.ВходящиеДокументы КАК ВходящиеДокументы
            ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СостоянияДокументов.СрезПоследних КАК СостоянияДокументовСрезПоследних
            ПО ВходящиеДокументы.Ссылка = СостоянияДокументовСрезПоследних.Документ
            ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КатегорииОбъектов КАК СведенияОКатегорияхДанных
            ПО ВходящиеДокументы.Ссылка = СведенияОКатегорияхДанных.ОбъектДанных
            ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                ВложенныйЗапрос.ЗадачаДата КАК ЗадачаДата,
                ВложенныйЗапрос.Предмет КАК Предмет,
                ЗадачаИсполнителя.Исполнитель.Наименование КАК ИсполнительНаименование
            ИЗ
                (ВЫБРАТЬ
                    МИНИМУМ(ЗадачаИсполнителя.Дата) КАК ЗадачаДата,
                    ЗадачаИсполнителя.Предмет КАК Предмет
                ИЗ
                    Задача.ЗадачаИсполнителя КАК ЗадачаИсполнителя
                ГДЕ
                    ЗадачаИсполнителя.ТочкаМаршрута = ЗНАЧЕНИЕ(БизнесПроцесс.Исполнение.ТочкаМаршрута.Исполнить)
                    И ЗадачаИсполнителя.ПринятаКИсполнению = ИСТИНА
                    И ЗадачаИсполнителя.Наименование ПОДОБНО "%Занесите текст резолюции%"
             
                СГРУППИРОВАТЬ ПО
                    ЗадачаИсполнителя.Предмет) КАК ВложенныйЗапрос
                    ЛЕВОЕ СОЕДИНЕНИЕ Задача.ЗадачаИсполнителя КАК ЗадачаИсполнителя
                    ПО ВложенныйЗапрос.ЗадачаДата = ЗадачаИсполнителя.Дата
                        И ВложенныйЗапрос.Предмет = ЗадачаИсполнителя.Предмет) КАК ВложенныйЗапрос
            ПО ВходящиеДокументы.Ссылка = ВложенныйЗапрос.Предмет
    {ГДЕ
        (&НаличиеКатегорий В
                (ВЫБРАТЬ
                    КОЛИЧЕСТВО(Регистр.Автор)
                ИЗ
                    РегистрСведений.КатегорииОбъектов КАК Регистр
                ГДЕ
                    Регистр.ОбъектДанных = ВходящиеДокументы.Ссылка)),
        (СведенияОКатегорияхДанных.КатегорияДанных В ИЕРАРХИИ (&КатегорияИИЛИ)),
        (СведенияОКатегорияхДанных.КатегорияДанных В (&КатегорияИЛИ)),
        (&КатегорияИ1 В
                (ВЫБРАТЬ
                    Регистр.КатегорияДанных
                ИЗ
                    РегистрСведений.КатегорииОбъектов КАК Регистр
                ГДЕ
                    ВходящиеДокументы.Ссылка = Регистр.ОбъектДанных)),
        (&КатегорияИ2 В
                (ВЫБРАТЬ
                    Регистр.КатегорияДанных
                ИЗ
                    РегистрСведений.КатегорииОбъектов КАК Регистр
                ГДЕ
                    ВходящиеДокументы.Ссылка = Регистр.ОбъектДанных)),
        (&КатегорияИ3 В
                (ВЫБРАТЬ
                    Регистр.КатегорияДанных
                ИЗ
                    РегистрСведений.КатегорииОбъектов КАК Регистр
                ГДЕ
                    ВходящиеДокументы.Ссылка = Регистр.ОбъектДанных)),
        (&КатегорияИ4 В
                (ВЫБРАТЬ
                    Регистр.КатегорияДанных
                ИЗ
                    РегистрСведений.КатегорииОбъектов КАК Регистр
                ГДЕ
                    ВходящиеДокументы.Ссылка = Регистр.ОбъектДанных)),
        (&КатегорияИ5 В
                (ВЫБРАТЬ
                    Регистр.КатегорияДанных
                ИЗ
                    РегистрСведений.КатегорииОбъектов КАК Регистр
                ГДЕ
                    ВходящиеДокументы.Ссылка = Регистр.ОбъектДанных)),
        (&КатегорияИ6 В
                (ВЫБРАТЬ
                    Регистр.КатегорияДанных
                ИЗ
                    РегистрСведений.КатегорииОбъектов КАК Регистр
                ГДЕ
                    ВходящиеДокументы.Ссылка = Регистр.ОбъектДанных)),
        (&КатегорияИ7 В
                (ВЫБРАТЬ
                    Регистр.КатегорияДанных
                ИЗ
                    РегистрСведений.КатегорииОбъектов КАК Регистр
                ГДЕ
                    ВходящиеДокументы.Ссылка = Регистр.ОбъектДанных)),
        (&КатегорияИ8 В
                (ВЫБРАТЬ
                    Регистр.КатегорияДанных
                ИЗ
                    РегистрСведений.КатегорииОбъектов КАК Регистр
                ГДЕ
                    ВходящиеДокументы.Ссылка = Регистр.ОбъектДанных)),
        (&КатегорияИ9 В
                (ВЫБРАТЬ
                    Регистр.КатегорияДанных
                ИЗ
                    РегистрСведений.КатегорииОбъектов КАК Регистр
                ГДЕ
                    ВходящиеДокументы.Ссылка = Регистр.ОбъектДанных)),
        (&КатегорияИ10 В
                (ВЫБРАТЬ
                    Регистр.КатегорияДанных
                ИЗ
                    РегистрСведений.КатегорииОбъектов КАК Регистр
                ГДЕ
                    ВходящиеДокументы.Ссылка = Регистр.ОбъектДанных)),
        (ВходящиеДокументы.Ссылка В
                (ВЫБРАТЬ
                    Регистр.ОбъектДанных
                ИЗ
                    РегистрСведений.КатегорииОбъектов КАК Регистр
                ГДЕ
                    Регистр.КатегорияДанных В ИЕРАРХИИ (&КатегорияИИ1))),
        (ВходящиеДокументы.Ссылка В
                (ВЫБРАТЬ
                    Регистр.ОбъектДанных
                ИЗ
                    РегистрСведений.КатегорииОбъектов КАК Регистр
                ГДЕ
                    Регистр.КатегорияДанных В ИЕРАРХИИ (&КатегорияИИ2))),
        (ВходящиеДокументы.Ссылка В
                (ВЫБРАТЬ
                    Регистр.ОбъектДанных
                ИЗ
                    РегистрСведений.КатегорииОбъектов КАК Регистр
                ГДЕ
                    Регистр.КатегорияДанных В ИЕРАРХИИ (&КатегорияИИ3))),
        (ВходящиеДокументы.Ссылка В
                (ВЫБРАТЬ
                    Регистр.ОбъектДанных
                ИЗ
                    РегистрСведений.КатегорииОбъектов КАК Регистр
                ГДЕ
                    Регистр.КатегорияДанных В ИЕРАРХИИ (&КатегорияИИ4))),
        (ВходящиеДокументы.Ссылка В
                (ВЫБРАТЬ
                    Регистр.ОбъектДанных
                ИЗ
                    РегистрСведений.КатегорииОбъектов КАК Регистр
                ГДЕ
                    Регистр.КатегорияДанных В ИЕРАРХИИ (&КатегорияИИ5))),
        (ВходящиеДокументы.Ссылка В
                (ВЫБРАТЬ
                    Регистр.ОбъектДанных
                ИЗ
                    РегистрСведений.КатегорииОбъектов КАК Регистр
                ГДЕ
                    Регистр.КатегорияДанных В ИЕРАРХИИ (&КатегорияИИ6))),
        (ВходящиеДокументы.Ссылка В
                (ВЫБРАТЬ
                    Регистр.ОбъектДанных
                ИЗ
                    РегистрСведений.КатегорииОбъектов КАК Регистр
                ГДЕ
                    Регистр.КатегорияДанных В ИЕРАРХИИ (&КатегорияИИ7))),
        (ВходящиеДокументы.Ссылка В
                (ВЫБРАТЬ
                    Регистр.ОбъектДанных
                ИЗ
                    РегистрСведений.КатегорииОбъектов КАК Регистр
                ГДЕ
                    Регистр.КатегорияДанных В ИЕРАРХИИ (&КатегорияИИ8))),
        (ВходящиеДокументы.Ссылка В
                (ВЫБРАТЬ
                    Регистр.ОбъектДанных
                ИЗ
                    РегистрСведений.КатегорииОбъектов КАК Регистр
                ГДЕ
                    Регистр.КатегорияДанных В ИЕРАРХИИ (&КатегорияИИ9))),
        (ВходящиеДокументы.Ссылка В
                (ВЫБРАТЬ
                    Регистр.ОбъектДанных
                ИЗ
                    РегистрСведений.КатегорииОбъектов КАК Регистр
                ГДЕ
                    Регистр.КатегорияДанных В ИЕРАРХИИ (&КатегорияИИ10)))}
    Ну никак я не пойму, где идёт отсев по подразделению?
    А может, я не всё посмотрел?

    Помогите пожалуйста в решении данной проблемы.
    Спасибо.
  2. TopicStarter Overlay
    maku
    Offline

    maku

    Регистрация:
    23 дек 2011
    Сообщения:
    10
    Симпатии:
    0
    Баллы:
    1
    Я кажется разобрался:
    В модуле формы списка
    Код:
    &НаКлиенте
    Процедура ПриОткрытии(Отказ)
        Если ОбщегоНазначенияКлиентПовтИсп.ЭтоВебКлиентПодMacOS() Тогда
            Элементы.ГруппаЭЦП.Видимость = Ложь;
            Элементы.ГруппаЭЦПКонтекст.Видимость = Ложь;
        КонецЕсли;
      
        Если ИспользоватьКатегорииДанных Тогда
            РаботаСКатегориямиДанныхКлиент.УстановитьРазвернутостьЭлементовДерева(Элементы.ДеревоКатегорий, ДеревоКатегорий, КатегорииПриОткрытии);
        КонецЕсли;
      
        //Обработчик ожидания для периодического обновления количества доступных шаблонов документов через каждые 20 минут
        ПодключитьОбработчикОжидания("ОбновитьКоличествоДоступныхШаблонов", 1200, Ложь);
      
    
        //// Запрет пользователям изменять установленный Отбор
        ТекПо = ВозвратТекПо();
        ТекПодр = ВозвратТекПодр();
        ОтборГруппа = Список.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
        ОтборГруппа.Использование = Истина;
        ОтборГруппа.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли;
      
      
        Отбор2 = ОтборГруппа.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
        Отбор2.Использование = Истина;
        Отбор2.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Адресат");
        Отбор2.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
        Отбор2.ПравоеЗначение = ТекПо;
      
        Отбор3 = ОтборГруппа.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
        Отбор3.Использование = Истина;
        Отбор3.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Подразделение");
        Отбор3.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
        Отбор3.ПравоеЗначение = ТекПодр;
      
        Если ПользовательВсеДок() Тогда
            ОтборГруппа.Использование = Ложь;
        КонецЕсли;
    
        ОтборГруппа.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
    КонецПроцедуры
    
    Останется добавить условие на подразделение или пользователя.
    Спасибо за моральную поддержку. Я ждал ответа и сам пытался домыслить. Получилось домыслить раньше :)

Поделиться этой страницей