gifts2017

Настройка видимости элементов форм объектов по ролям, на уровне пользователя

Опубликовал Олег Пономаренко (O-Planet) в раздел Администрирование - Защита, права, пароли

Если вам лень самим колдовать с настройкой видимости относительно ролей - дайте мышку в руки администратору!

+ бонус... Вы не пробовали построить дерево элементов формы в 1С?  :D

Вот чувствую, что опять кто-нибудь напишет, как было со «Сканирочкой», что решение до безобразия простое… Что делать...  :( Когда клиент ставит самую что есть конкретную задачу, которую, казалось бы, сделал – и забыл, коварно подкрадывается мысль: «А нет ли у задачи более общего решения, чтобы потом …»

... Потом – не делать заново, когда похожая задача появится. Потом – продавать, если решение получится интересным. В крайнем случае, потом – попиариться на инфостарте, ведь это весело. :D

Вот и сейчас… Клиент просит настроить список колонок для формы списка конкретного документа, чтобы пользователи с разными ролями видели свои колонки. И ведь приложил список, для какой роли – какие колонки надо отображать! Большой список… Вобщем, представил я, как в ПриОткрытии буду тупо прописывать эти проверки и проставлять видимость колонок, и как-то тоскливо стало.  Их же … много! Выход: предоставить пользователю инструмент, чтобы сам он мог забавляться со своими колонками, сколько ему влезет. И кстати, если уж для конкретного объекта я это делаю, то почему не позволить делать такую настройку для любого объекта? Болезнь у меня такая…

В общем, получилось. Выкладываю. Пользуйтесь! 

 

 

Для использования сего нужно:

  1. В информационную базу добавить регистр (прилагается)
  2. Добавить обработку НастройкаВидимости
  3. В метод ПриОткрытии для форм того объекта, видимость полей которого предполагается настраивать, прописать: 

 

ОбработкаНастройки=Обработки.НастройкаВидимости.Создать();

ОбработкаНастройки.УстановитьВидимость(ЭтотОбъект,ЭтаФорма,"ФормаДокумента");

или, как вариант:

ОбработкаНастройки.УстановитьВидимость(СтроковыйИдентификаторОбъекта,ЭтаФорма,"ФормаДокумента");

 

 

где СтроковыйИдентификаторОбъекта - "Документы.ПриходнаяНакладная", "Справочники.Контрагенты" и т.д.

 

Все…

 

 

Описанный метод может быть использован при разработке конфигураций с нуля, для «ленивой» настройки видимости элементов форм объектов.

 

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

 

 

ПС...

 

При решении этой задачи хотел, как красивее, чтобы элементы формы можно было в виде дерева выводить. Столкнулся с непониманием со стороны 1С. Оказывается, нет у элемента формы поля "Владелец", как есть в любой порядочной платформы для разработчика. Но ведь хочется, балин! Помогла миста... Там этот вопрос обсуждался (один небезызвестный гений), и было предложено решение. Правда... Реализовали они его там через ... спину. Что ж, не всем дано познать глубины рекурсии ;)

 

Привожу свое решение мистовского метода поиска принадлежности элементов формы к панелям. Я правда еще в своей настройке видимости разношу и по страницам эл-ты формы, но здесь - код только для разнесения по панелям. Думаю, пригодится коллегам.

 

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

// Потребуется много раз получать форму, чтобы мучить ее элементы
Функция ВернутьФорму(ТипОбъекта,ИмяОбъекта,ИмяФормы)
    Если ТипОбъекта="Справочники" Тогда
        Объект=Справочники[ИмяОбъекта];
    ИначеЕсли ТипОбъекта="Документы" Тогда    
        Объект=Документы[ИмяОбъекта];
    КонецЕсли;
    Форма=Объект.ПолучитьФорму(ИмяФормы);
    Возврат Форма;
КонецФункции    

// Тут строим таблицу всех элементов и раскидываем их по панелям
Функция АнализаАднака(ТипОбъекта,ИмяОбъекта,ИмяФормы)
    Форма=ВернутьФорму(ТипОбъекта,ИмяОбъекта,ИмяФормы);
    Панели=Новый Массив;
    ЭлТы=Новый ТаблицаЗначений;
    ЭлТы.Колонки.Добавить("Элт");
    ЭлТы.Колонки.Добавить("Панель");
    ЭлТы.Колонки.Добавить("Уровень");
    ЭлТы.Колонки.Добавить("ЭтоПанель");
    Для Каждого Эл Из Форма.ЭлементыФормы Цикл
        Нов=Элты.Добавить();
        Нов.Элт=Эл.Имя;
        Нов.Уровень=0;
        Нов.ЭтоПанель=Ложь;
        Если ТипЗнч(Эл)=Тип("Панель") Тогда
            Панели.Добавить(Эл.Имя);
            Нов.ЭтоПанель=Истина;
        КонецЕсли;    
    КонецЦикла;
    Для К=0 По Панели.ВГраница() Цикл
        ОбрабатываемПанель(ТипОбъекта,ИмяОбъекта,ИмяФормы,Панели[К],ЭлТы);
    КонецЦикла;    
    Возврат ЭлТы;
КонецФункции    

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

// Ну это типа преобразование таблицы значений в дерево. 
// Рекурсия!!! И этим все сказано...
Процедура ВзраститьБерезу(ВеткиБерезы,Форма,ТабЭлтов,Уровень)
    Для Каждого Стр Из ТабЭлтов Цикл
        Если Стр.Уровень<>Уровень Тогда
            Продолжить;
        КонецЕсли;    
        НоваяВетка=ВеткиБерезы.Добавить();
        НоваяВетка.ЭлементФормы=Форма.ЭлементыФормы[Стр.Элт];
        Если Стр.ЭтоПанель Тогда
            ВзраститьБерезу(НоваяВетка.Строки,Форма,ТабЭлтов,Уровень+1);
        КонецЕсли;    
    КонецЦикла;    
КонецПроцедуры    

 

ППС...

Еще немалое удивление вызвал тот факт, что нельзя из формы нормальным способом узнать, к чему она относится. Впрочем, решение - есть. Почти... В некоторых (нормальных) конфигурациях имеется некий глобальный метод, который вызывается при открытии любой формы. Некий глПриОткрытии(ЭтаФОрма). Вот в этот метод можно кое-что прописать, чтобы не лезть в каждую форму списка, выбора или объекта.

Привожу пример решения для справочников. Т.е., по переданному ЭтаФорма ищем справочник, которому эта форма принадлежит и вызываем нашу обработку:

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

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

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Пример конфигурации
.zip 66,17Kb
09.07.13
185
.zip 66,17Kb 185 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

0. Олег Пономаренко (O-Planet) 25.08.11 07:36
Если вам лень самим колдовать с настройкой видимости относительно ролей - дайте мышку в руки администратору!

+ бонус... Вы не пробовали построить дерево элементов формы в 1С? :D


Перейти к публикации

1. Александр Рытов (Арчибальд) 25.08.11 07:36
попиариться на инфостарте, ведь это весело
Согласен.
2. Алексей Константинов (alexk-is) 25.08.11 08:02
3. Олег Пономаренко (O-Planet) 25.08.11 14:26
А вот как-то автоматизировать вызов этого в ПриОткрытии можно? Подпиской на события, например?
4. Иван (Spartan) 25.08.11 15:01
(3) Подписка на события работает только для событий объектов, но не их форм.
5. Sergey (Sergey K) 26.08.11 10:46
по мотивам деструктивного анализа формы :)
уже года 2-3 используем подобную настройку видимости/доступности форм.
6. Олег Пономаренко (O-Planet) 27.08.11 02:12
(5) Ога. Только написал, что мне их реализация ну очень не понравилась...
7. Олег Пономаренко (O-Planet) 27.08.11 04:49
Добавил в описании вариант автоматизации вызова обработки :)
8. г. Казань Рустем Гумеров (Rustig) 27.08.11 22:43
(0) Интересно, сколько затрачено времени?
И сколько заплатил клиент? Задаю эти вопросы не из праздного любопытства, а для понимания, кому это надо и надо ли за такие деньги?

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

Сама идея задачи мне нравится, также нравится статья, только вот почему-то разбираться в опубликованном коде не хочется...
Автор, спасибо!
9. Олег Пономаренко (O-Planet) 27.08.11 23:58
(8) Затрачено часа четыре. Клиент заплатит за комплекс работ, в районе 20 тыс. Это - где-то пятая-восьмая часть того, что нужно сделать.
10. г. Казань Рустем Гумеров (Rustig) 28.08.11 00:28
(9) 4 часа - это продуктивное время на разработку (без анализа, предварительного проектирования, постановки ТЗ) ? или по факту: от момента анализа задачи (возникновения идеи) до последнего тестирования функциоанала?
Такого ответа я не ожидал, я бы затратил на все про все весь день: чтобы идею родить, воплотить: форму разработать, прописать установку видимости где нужно, протестировать и т.д. Нюансы на поверхности не видны....
...посмотрю-ка я выложенный пример конфигурации
11. Олег Пономаренко (O-Planet) 28.08.11 03:24
(10) Анализ на такую задачу? И где эти заказчики, кто до конца понимает, чего хочет? Получил задачу, прикинул, что же нужно заказчику, прикинул, можно ли обобщить, прикинул, как реализовать, а потом - просто начать писать, большинство вопросов становятся понятны по ходу. Ну, может, пять часов... Но точно не весь день. Я ж фрилансер, тут со сроками жестко очень: какие-нибудь казахские программисты запросто начнут демпинговать, если со сроками затянешь и с ценой оплошаешь :D
12. Дмитрий Леонов (Psylocibine) 29.08.11 07:30
У меня вот конфа не разворачивается, говорит "Ошибка формата потока"
А посмотреть любопытно очень)
13. Яков Коган (Yashazz) 29.08.11 12:39
Да-а-а, я когда-то делал такую на 7.7, с деревом объектов. Дерево строилось динамически для любой конфигурации.
Правда, скажу честно, строилось довольно топорно и долго, но чисто штатными средствами.

Мало нужная вещь, на практике редко у кого доходят руки грамотно всё настроить, и кончается дело либо каскадом умолчаний, либо всеобщим отключением этих ограничений в пользу более локально, "по месту" сделанных, либо гипер-супер-динамикой с использованием фрагментов кода.
И всё это начинает сильно напоминать аналог RLS плюс возможности функциональных опций 8.2, сиречь изобретение велосипедов.
14. г. Казань Рустем Гумеров (Rustig) 20.03.12 20:43
(11) Недавно продал ваше решение клиенту. Клиент доволен. Смысл задачи - приезжает ревизор, а бухгалтер нажимает одну чудо-кнопку, и часть информации не отображается в формах...
решение немного доработал конечно, но за основу взял ваш код... спасибо :)
15. Ольга Мартынова (Tina_10) 10.04.13 11:57
Добрый день! У меня платформа 8.2.17, конфигурация - розница (1.0.16). При снятии флажков в обработке "Настройка видимости" нечего не происходит...
16. Назым Кушиев (Profit05) 14.12.13 12:24
17. Алексей (Alexey_) 19.05.15 10:11
можно использовать альтернативу деструктивному анализу
http://infostart.ru/public/345430/
18. Ринат Гильмутдинов (grin_64) 19.05.16 12:21
Круто! Я переделал роли в пользователи
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа