- МЕНЮ
 - В избранное
Самые важные новости
 
Царьков Валерий
"1С:Предприятие 7.7": управляем правами пользователей

Стандартные права
Рулим элементами диалога

  • Реализация стандартными методами
  • Используем внешнюю компоненту
    Ограничение действий пользователя

            Стандартные права

            Как известно, в системе "1С:Предприятие 7.7" права настраиваются в конфигураторе и распространяются на все объекты данного вида. Набор прав тоже ограничен и заранее определен для каждого вида объектов.



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

           
    Примечание:
    * В версии 8.0 настройка прав значительно расширены, в т.ч. но конкретные объекты. Так что с распространением новой версии платформы статья потаряет актуальность.
    назад
    Вот статья про реализацию видимости и доступности элементов форм на платформе 8.

    наверх

            Рулим элементами диалога.

            Будем исходить из того, что в конфигурации имеется справочник Пользователи
    Для управления элементами форм нам потребуется знать:

    В стандартной конфигурации если пользователь не найден в справочнике Пользователи, то он заводится автоматически. Этот режим требует для каждого пользователя права на чтение и ввод нового. А вот на справочники Формы и Элементы права на ввод нового и изменение нужно ограничить средствами конфигурирования.

            Теперь о том, как с этим работать.
    В справочник Формы вносим в виде текста идентификатор формы, Тут уж как фантазия подскажет. Можно например в формате: "Тип значения" + "Вид" + "Описатель формы", что-то типа "Справочник.Сотрудники.Форма элемента", или исходя из внутреннего идентификатора
    ** "B16_ФормаЭлемента". В справочник Элементы вносим идентификаторы элементов диалога в виде текста.
    При начале работы система по имени определяет текущего пользователя, находит его в справочнике Пользователи (если не находит, то заводит нового) и сохраняет ссылку на текущий элемент в глобальной переменной ( в ТиС 9.х - глПользователь). Теперь достаточно при открытии любой формы найти ее в справочнике Формы и установить доступность согласно реквизиту Доступность (число: 1 или 0) справочника Элементы.

           
    Примечания:
    * Для того, чтобы каждый раз не вводить руками все элементы подчиненных справочников, их можно скопировать вместе с элементом-родителем при помощи обработки
    Копирование ветки справочника. назад
    ** Можно воспользоваться отчетом: Просмотрщик внутренних кодов объектов агрегатного типа. назад

    наверх

            Реализация стандартными методами.

    В глобальном модуле пропишем процедуры установки доступности форм и элементов:
    Функция УстановкаФормы(Конт, Имя) Экспорт
         Перем Спр;
         Спр=СоздатьОбъект(
    "Справочник.Формы");
         Спр
    .ИспользоватьВладельца(глПользователь);
         Если Спр.НайтиПоНаименованию(Имя)=
    1 Тогда
             // поиск текущей формы в справочнике
             Конт
    =Спр.ТекущийЭлемент();
             Возврат
    1;
         Иначе
             // здесь можно предусмотреть автоматическое создание нового элемента
             Возврат
    0;
         КонецЕсли;
    КонецФункции
    Функция УстановкаДоступности(Конт, Имя) Экспорт
         Спр
    =СоздатьОбъект(
    "Справочник.Элементы");
         Спр
    .ИспользоватьВладельца(Конт);
         Если Спр.НайтиПоНаименованию(Имя)=
    1 Тогда
             Возврат Спр.Доступность;
         Иначе
             // здесь можно предусмотреть автоматическое создание нового элемента
             Возврат
    0; // т.е. если доступ не описан, то запрещен (по умолчанию)
         КонецЕсли;
    КонецФункции


    В каждый модуль пропишем следующий код
    Перем Конт;
    Процедура ПриОткрытии()
         Если УстановкаФормы(Конт,
    "B12_ФормаСписка")=0 тогда
             // здесь: B12_ФормаСписка - это идентификатор формы
             // B - справочник
             // 12 - ID вида справочника
             // ФормаСписка - наименование формы
             // По этому идентификатору будет осуществляться поиск в справочнике Формы

             СтатусВозврата(
    0);
             Возврат;
         КонецЕсли;
         Форма.Кнопка.Доступность(УстановкаДоступности(Конт,
    "Кнопка"));
         // здесь: Кнопка - это идентификатор элемента формы
         // т.к. нет возможности перебрать все элементы в цикле, то придется описывать каждый элемент

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


            Если требуется скрывать некоторые элементы на форме, тогда потребуется ввести еще один атрибут в справочник Элементы: Видимость. Однако, видимостью управлять сложнее, так как при использовании многослойных форм включение слоя автоматически включает видимость помещенных на него элементов (при этом доступность не изменяется). Чтобы корректно отработать управление видимостью, придется вникать в логику программы. Однако, есть способ попроще.
    На форму помещаем текст с формулой Контроль() (текст должен быть виден всегда, т.е. находиться в постоянно отображаемом слое или его видимость должна устанавливаться принудительно), а в текст модуля
    Функция Контроль()
         // т.к. нет возможности перебрать все элементы в цикле, то придется описывать каждый элемент
         // в целом, функции "УстановкаВидимости" и "УстановкаДоступности" аналогичны.

         Если УстановкаВидимости(Конт,
    "Кнопка")=0 тогда
             // т.о. если нужно скрыть, то скрываем
             Форма.Наименование.Видимость(
    0);
         КонецЕсли;
         Возврат
    "";
    КонецПроцедуры

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

    Вот пример для формы ФормаСписка справочника 12: элемент (колонка) Код невидим, элемент Кнопка виден и недоступен.


            Как видно, стандартные методы, реализованные на платформе 1С:Предприятие 7.7, не обладают достаточной гибкостью. Необходимо описывать доступность/видимость всех элементов формы, которым предполагается управлять.

           
    Примечание
    На самом деле, есть возможностьне управлять доступностью и видимостью в цикле. Реализуется это следующим образом:
    • создаем обработку, в модуле директива #ЗагрузитьИзФайла;
    • программно создаем текст модуля для этой обработки;
              Процедура ПриОткрытии()
                  Конт=Форма.Параметр;
                  // пример текста:
                  Конт.Кнопка.Доступность(
      1);
                  СтатусВозврата(
      0);
              КонецПроцедуры

    • записываем текст модуля в файл
    • программно открываем форму этой обработки, в качестве параметра передаем контекст обрабатываемой формы

    наверх

            Используем внешнюю компоненту.

            Для доступа и управления элементами формы можно воспользоваться компонентой
    FormEx, автор: Алексей Федоров aka АЛьФ. Эта компонента значительно расширяет методы работы с элементами формы.
    На эту тему есть статья, автор Куклин Андрей ОсОО «Практика», Бишкек, Кыргызстан.

    наверх

            Ограничение действий пользователя.

            В стандартной ТиС 9.х контроль некоторых действий реализован при помощи справочника ПолномочияПользователей. С его помощью отслеживались такие действия:

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

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

             Возврат
    0; // т.е. если действие не описно, то запрещено (по умолчанию)
         КонецЕсли;
    КонецФункции


    В модуле формы документа:
    Процедура ВводНового(Признак, Объект)
         Если УстановкаПрав(Конт,
    "ВводНового")=0 тогда
             СтатусВозврата(
    0);
             Возврат;
         КонецЕсли;
         Если Признак=
    1 тогда
             Если УстановкаПрав(Конт,
    "КопированиеДокумента")=0 тогда
                 СтатусВозврата(
    0);
                 Возврат;
             КонецЕсли;
         КонецЕсли;
         Автор
    =ГлПользователь;
    КонецПроцедуры
    Процедура ПриЗаписи()
         Если ТекущийДокумент().Выбран()=
    1 тогда
             Если УстановкаПрав(Конт,
    "ЗаписьСуществующего")=0 тогда
                 СтатусВозврата(
    0);
             КонецЕсли;
         Иначе
             Если УстановкаПрав(Конт,
    "ЗаписьНового")=0 тогда
                 СтатусВозврата(
    0);
             КонецЕсли;
         КонецЕсли;
    КонецПроцедуры
    УстановкаФормы(Конт,
    "O14_Форма");

    Вот и простейшее управление формой. Отследить можно любое действие, описываемое предопределенными процедурами (открытие, ввод нового, копирование, запись, проведение и отмену проведения документа и т.д).

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

             Возврат
    0; // т.е. если действие не описно, то запрещено (по умолчанию)
         КонецЕсли;
    КонецФункции


    Теперь функция вернет в вызывающий модуль найденнный элемент справочника Действия для доступа к его реквизитам. Это позволит, например, автоматически устанавливать отбор по объекту в общем журнале документов или форме списка справочника. Действие="УстанавливатьОтбор";
    Если УстановкаПрав(Конт, Действие)=
    1 тогда
         Если Действие.Объект.Выбран()=
    1 Тогда
             УстановитьОтбор
    (
    "Автор", Действие.Объект);
         КонецЕсли;
    КонецЕсли;


    Ну и для большего прикола, внесем еще один реквизит: Шаблон (строка подходящей длины). Шаблон можно обрабатывать при попощи функции
         Шаблон(
    "["+Спр.Шаблон+"]");
    Суть данного метода вот в чем. Функция вычисляет выражение в скобках и возвращает строку, которую можно анализировать на равенство/неравенство. Например:
         Если Шаблон(
    "["+Спр.Шаблон+"]")="1" Тогда

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

             Что
    =Спр.ТипВид;
             Конт
    =
    "";
             Если Лев(Что,
    10)="Справочник" Тогда
             // открываем заранее разрешенную для выбора группу

                 ОткрытьФорму(Что,Конт);
                 Конт
    .ИспользоватьРодителя(Спр.Объект,
    0);
             ИначеЕсли Лев(Что,
    8)="Документ" Тогда
             // используется для выбора

                 ОткрытьФорму(
    "Журнал.ДляВыбора",Конт);
                 Конт
    .УстановитьОтбор(Прав(Что,СтрДлина(Что)-
    9),Спр.Объект);
             КонецЕсли;
             ФлагСтандОбр
    =
    0;
         КонецЕсли;
    КонецПроцедуры

    Вот так выглядит форма настройки действий.
    В шаблон можно вносить несложные условия, например: ТекущийЭлемент().ЭтоГруппа()
    Или даже действия: ИспользоватьРодителя(Спр.Объект,0) (имеет смысл при открытии формы списка справочника: в данном случае для пользователя установится режим просмотра только конкретной группы).

    А это настройки элементов формы.
    Отбор устанавливается

    • для справочника: по группе справочника;
    • для документа:
      • по виду документа
      • по значению общего реквизита документа
      • по значению графы отбора.
    Фильтр по: служит для описания объекта, по которому осуществляется отбор.

    наверх

    Пример конфигурации можно скачать здесь.


  • обсудить на форуме   всего просмотров: 
    Используются технологии uCoz


    © Царьков Валерий 6 августа 2004