Имя: Пароль:
1C
1С v8
Видимость подсистем программно
,
0 123GO
 
13.12.18
06:53
Добрый день. Нужно установить видимость всех объектов в подсистеме, или подсистемы целиком согласно реквизиту текущего пользователя.
Вкратце, Розница 2.2 Управляемые формы:
Если ТекущийПользователь.Магазин входит в СписокРазрешенныхМагазинов, то подсистема видна, если нет - скрыта (ну или по реквизиту Если Магазин.Разрешено = Истина).
Через функциональные опции не получается, константа одна не всех. Роли тоже не подходят - в магазинах есть админы, которые могут сами установить нужную роль. Вот сейчас пытаюсь через ограничение на уровне записей (RLS)..
Никто не сталкивался с такими задачами?
1 123GO
 
13.12.18
06:57
Вообще, если все объекты не будут доступны в подсистеме, подсистема не должна показываться. Значит, все сводится к тому, что:
Вася и Петя имеют одинаковый набор ролей. Нужно, чтобы Вася не то, чтобы не видел списка документов Поступлений, а вообще не знал, что такой вид документа существует
2 youalex
 
13.12.18
07:00
(0) УстановитьПараметрыФункциональныхОпцийИнтерфейса() - не пробовал?
3 123GO
 
13.12.18
07:13
(2) Нет, есть пример?
4 youalex
 
13.12.18
07:17
(3) примера нет
5 lucbak
 
13.12.18
07:23
(0) Создаешь функциональные опции (ФО) аналогично подсистемам,далее создаешь регистр сведений где измерение "Пользователь" а ресурсы это твои подсистемы "булево". У ФО хранение - ссылка на реквизит регистра сведений.
Далее при начале работы системы (2)
УстановитьПараметрыФункциональныхОпцийИнтерфейса(Новый Структура("ПользовательПодсистемы", НастройкиПользователяСервер.ТекущийПользователь()))
6 123GO
 
13.12.18
08:35
(5) А можно установить параметр ФО не по пользователю, а по магазину пользователя?
7 lucbak
 
13.12.18
08:39
(6) Это всего лишь пример - ты можешь реализовать как угодно (замени измерение "Пользователь" на "Магазин" и определяй его при начале работы.
8 123GO
 
13.12.18
08:44
(7) Так и подумал, не могу никак определить ТекущийМагазин в ПриНачалеРаботыСистемы()
9 lucbak
 
13.12.18
08:46
(8) что значит "не могу определить" ?
10 123GO
 
13.12.18
08:46
ну то есть получить
11 123GO
 
13.12.18
08:48
Пользователя можно получить из ПользователиКлиентСервер.ТекущийПользователь(), а магазин пока не могу найти. ПараметрыСеанса от туда недоступны
12 lucbak
 
13.12.18
08:51
(11) Есть взаимосвязь пользователя и магазина? если есть то укажи у пользователя магазин и уже по нему заполняй ФО
13 123GO
 
13.12.18
08:58
(12) Да, есть прям в типовой конфигурации. ПользователиКлиентСервер.ТекущийПользователь() возвращает СправочникСсылка.Пользователи, но через точку .Магазин я не могу обратиться, видимо потому что с клиента..
14 123GO
 
13.12.18
09:00
попробовал сейчас, как работает в целом через Измерение Пользователь, сработало 1 раз правильно. Подсистема появилась, попробовал на другом пользователе, подсистема уже не исчезает, всегда видно вне зависимости от ресурса регистра сведений. Наверно у подсистемы нужно отключить видимость по ролям?
15 lucbak
 
13.12.18
09:03
(13) Конечно на "клиенте" нельзя через точку работать - делай так Магазин=ОбщегоНазначенияСервер.ЗначениеРеквизитаОбъекта(ПользователиКлиентСервер.ТекущийПользователь(), "Магазин");
16 lucbak
 
13.12.18
09:04
(14) А другой пользователь в регистре заведен? Если ДА то все должно работать.
17 123GO
 
13.12.18
09:14
Нашел, нужно завести не только ФО но и параметр ФО. Вроде так с Пользователем все работает.
(15) Спасибо, сейчас попробую
18 lucbak
 
13.12.18
09:16
(17) разумеется )))
19 123GO
 
13.12.18
09:27
ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ПользователиКлиентСервер.ТекущийПользователь(), "Магазин")
{(1,1)}: Переменная не определена (ОбщегоНазначения)
20 123GO
 
13.12.18
09:27
Это значит, что я не могу сервер вызывать из Модуля управляемого приложения?
21 lucbak
 
13.12.18
09:33
(20) Конечно можешь. Это значит, что у тебя нет  такого модуля.
22 123GO
 
13.12.18
09:39
Контекстная подсказка так подсказала)
23 runoff_runoff
 
13.12.18
09:42
(21) не, просто на модуле на стоит галочка "Вызов сервера"
24 123GO
 
13.12.18
09:43
Выручил ОбщегоНазначенияРТВызовСервера.ЗначениеРеквизитаОбъекта(ПользователиКлиентСервер.ТекущийПользователь(), "Магазин")
25 123GO
 
13.12.18
09:46
Все заработало. Спасибо, lucbak)
26 123GO
 
13.12.18
09:50
Вот только не понятно как параметр ФО влияет на саму ФО, я нигде не указывал их связь. Но после добавления параметра ФО все заработало
27 lucbak
 
13.12.18
10:20
(26) Что значит нигде? а это (5) ;)
28 123GO
 
14.12.18
03:20
(27) Ну через УстановитьПараметрыФункциональныхОпцийИнтерфейса() я передаю значение измерения РегистраСведений параметру ФО, а где параметр ФО говорит самой ФО я не понял) Магия
29 123GO
 
14.12.18
03:33
(27) А знаете, как установить видимость и доступ согласно той же ФО, но только для объектов? Подсистема скрылась у нужных пользователей, но они все еще могут зайти через Все функции в список документов. И, хоть при создании новых документов у них выходит "Операция недоступна", они могут читать и изменять уже созданные документы теми, у кого доступ есть
30 123GO
 
14.12.18
04:08
Сделал так:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Отказ = НЕ ПолучитьФункциональнуюОпцию("ап_ВидимостьПодсистемы",Новый Структура("ап_ВидимостьПодсистемы", ОбщегоНазначенияРТВызовСервера.ЗначениеРеквизитаОбъекта(ПользователиКлиентСервер.ТекущийПользователь(), "Магазин")));
КонецПроцедуры
31 123GO
 
14.12.18
04:11
(30) В форме списка документа
32 lucbak
 
14.12.18
07:25
(29) Можно отключить у пользователей "Все функции".
(31) Через универсальный отчет получат нужные им данные :)
33 123GO
 
14.12.18
07:41
(32) Все функции могут дать местные "админы". Отчетом им там особо нечего смотреть, главное чтоб не вводили и не изменяли)
34 lucbak
 
14.12.18
08:31
(30) Вот http://catalog.mista.ru/public/927667/
Просто все функции вызова замени на свои и будет тебе счастье (сможешь настроить как формы списков так и формы объектов - доступность, видимость, заполнение, проверки  т.д.)
35 123GO
 
27.12.18
06:26
(34) Беда пришла, откуда не ждали.. Хочу, чтобы все работало в РИБ. При вызове при начале работы системы УстановитьПараметрыФункциональныхОпцийИнтерфейса() нужно получить ПользователиКлиентСервер.ТекущийПользователь(). Модуль получает его из АвторизированныйПользователь(), почему-то возвращается Неопределено..
База закрывается исключением, так и не открывшись.
36 123GO
 
27.12.18
06:34
(35) В ПараметрыПриложения в соответствующей структуре АвторизированныйПользователь = Неопределено
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший