|
А шаблоны RLS допускают вложенность? | ☑ | ||
---|---|---|---|---|
0
Гений 1С
гуру
14.05.22
✎
19:40
|
Собственно один шаблон из другого можно вызывать?
|
|||
1
AlvlSpb
14.05.22
✎
20:13
|
(0) Скорей всего НЕТ. А, главное, смысл?
|
|||
2
ДедМорроз
14.05.22
✎
20:24
|
А не проще ли один в другой скопировать,если нужна общая часть?
|
|||
3
Гений 1С
гуру
14.05.22
✎
21:09
|
(1) поясняю на пальцах.
Есть шаблон #Доступ(ВидОбъекта, ПолеОбъекта)::: ( #Параметр(2) В ( ВЫБРАТЬ ЗначениеРеквизита ИЗ РегистрСведений.гпд_ДетальныеПрава КАК Т ГДЕ Т.Пользователь = &ТекущийПользователь И Т.ВидОбъекта = "#Параметр(1)" И Т.РеквизитОбъекта = "#Параметр(2)" И Т.Кроме = Ложь) ИЛИ #Параметр(2) НЕ В ( ВЫБРАТЬ ЗначениеРеквизита ИЗ РегистрСведений.гпд_ДетальныеПрава КАК Т ГДЕ Т.Пользователь = &ТекущийПользователь И Т.ВидОбъекта = "#Параметр(1)" И Т.РеквизитОбъекта = "#Параметр(2)" И Т.Кроме = Истина) ) Я могу в заказе покупателя прописать конечно и так: #Доступ("ЗаказПокупателя", "Организация") И #Доступ("ЗаказПокупателя", "Контрагент") И #Доступ("ЗаказПокупателя", "Ответственный") И #Доступ("ЗаказПокупателя", "Автор") Но я хочу в заказе покупателя прописать так: #ДоступВида("ЗаказПокупателя") А уже в шаблоне #ДоступВида(Вид) прописать:::: #Если "#Параметр(1)" = "ЗаказПокупателя" Тогда #Доступ("ЗаказПокупателя", "Организация") И #Доступ("ЗаказПокупателя", "Контрагент") И #Доступ("ЗаказПокупателя", "Ответственный") И #Доступ("ЗаказПокупателя", "Автор") #КонецЕсли Чтобы не лазить по всем объектам, а править их в одном месте. |
|||
4
Гений 1С
гуру
14.05.22
✎
21:11
|
гм, проверил, похоже не дает сделать вложенный РЛС, придется где-то прописывать отдельно это, наверное сразу генерировать текст RLS
|
|||
5
Ненавижу 1С
гуру
14.05.22
✎
23:33
|
Ты опять велосипед изобрёл, чтобы с БСП не разбираться?
|
|||
6
RetardedToBoot
15.05.22
✎
00:03
|
(0) Можно что-то вроде вставок. Вставка не имеет приписки ГДЕ.
У меня в ролях шаблоны ограничений такие: Наименование: Правило_СкладскиеДокументы; ТекстШаблона: // документы имеющие реквизит склад ГДЕ #Вставка_ВидимыеСклады И #Вставка_ОграничениеПоВидамТаблиц Наименование: Вставка_ВидимыеСклады; ТекстШаблона: #Если НЕ &ОграничениеПоСкладам_Использовать #Тогда Истина #Иначе Склад В (&ОграничениеПоСкладам_МножествоВидимых) #КонецЕсли И в документ вставляется #Правило_СкладскиеДокументы |
|||
7
RetardedToBoot
15.05.22
✎
00:08
|
возможно они просто как макросы разворачиваются. Тогда наверное можно так вызвать:
ГДЕ &Условие1 И Истина в (выбрать истина #ДругойШаблон) |
|||
8
RetardedToBoot
15.05.22
✎
00:21
|
+ проверил. Так работает, получается можно делать вложенные RLS. Ну или делать вставками без ГДЕ, если не хочется портить вид правил. При редактировании конфигуратор на такие вещи ругается, но сохраняет, и оно потом работает.
|
|||
9
Гений 1С
гуру
15.05.22
✎
09:39
|
(6) и где тут вложенные RLS?
|
|||
10
Гений 1С
гуру
15.05.22
✎
09:40
|
(8) приведи пример работы вложенных RLS, у меня тоже ругается конфигуратор при сохранении, хотя может стоит попробовать.
|
|||
11
Гений 1С
гуру
15.05.22
✎
09:40
|
(5) да, не хочется в этот кал лезть
|
|||
12
RetardedToBoot
15.05.22
✎
12:52
|
(9) (10) Так в (6) я делаю в шаблоне вызов другого шаблона:
из Правило_СкладскиеДокументы вызывается Вставка_ВидимыеСклады. Вызываемый шаблон может быть написан как угодно, даже не по правилам шаблонов - он просто подставляется как текст в результатный шаблон. Вопрос лишь где будет расположен ГДЕ. Его можно расположить скажем только в документе, а все шаблоны писать без ГДЕ, но тогда сами шаблоны будут не совсем полноценны. Или шаблон может иметь ГДЕ, но тогда его использование из другого шаблона как указано в (7). В общем это работает как текстовый препроцессор - просто подстановки кусочков. Вот и пишешь в заказе покупателя: // три ковычки по бокам обязательны ГДЕ #ДоступВида("""ЗаказПокупателя""") А в шаблоне ДоступВида: #Если #Параметр(1) = "ЗаказПокупателя" #Тогда #Доступ("ЗаказПокупателя", "Организация") #КонецЕсли Единственно, передать параметр в параметр вложенного шаблона не получилось: #Доступ(#Параметр(1), "Организация") - так не получается. |
|||
13
Гений 1С
гуру
15.05.22
✎
13:21
|
(12) ну параметр мне передавать и не надо. Ладно, буду использовать. Только похоже это все недокументированная фича и может навернуться рано или поздно, опасно.
|
|||
14
Ненавижу 1С
гуру
15.05.22
✎
18:16
|
(11) в чем преимущество твоего подхода перед БСП?
|
|||
15
Волшебник
модератор
15.05.22
✎
18:17
|
(14) А может он прав?
|
|||
16
Ненавижу 1С
гуру
15.05.22
✎
18:24
|
(15) для этого нужен анализ обоих подходов. Что я собственно и спрашиваю
|
|||
17
Гений 1С
гуру
15.05.22
✎
19:25
|
(14) в прозрачности. Код простой, не усложненный и документированный. Да и без документации понятный
|
|||
18
Ненавижу 1С
гуру
15.05.22
✎
19:55
|
(3) 1. я правильно понимаю, что никаких групп пользователей не предполагается. Надо каждому пользователю перечислять все объекты, на которые он имеет права?
2. Контрагентов кстати вот прям всех надо перечислять? Надеюсь это просто пример 3. Условия с Кроме=истина - если таких не определить получится все доступны? 4. Как сделать условие только заданное подразделение ИЛИ заданный автор с любым подразделением? |
|||
19
Гений 1С
гуру
15.05.22
✎
20:01
|
(18) для контрагентов будут использоваться те же группы доступа, что уже прописаны. группы пользователей пока не планируется делать.
кроме - это недоступные объекты, остальные доступные. ограничения по разным реквизитам объединяются через И. т.е. фильтр по Организации И фильтр по пользователю И фильтр по группе контрагента, этого достаточно (из практики). Но можно конечно и усложнить, благодаря прозрачности кода. |
|||
20
Гений 1С
гуру
15.05.22
✎
20:02
|
(18) касательно групп, когда я делал в документообороте свои правила, я просто для каждого пользователя группы клонировал правила группы, т.е. особых проблем с группами нет, у клиента сейчас группы не используются, не буду его нагружать группами.
|
|||
21
Ненавижу 1С
гуру
15.05.22
✎
20:05
|
(19) ну вот по условию, если не ввести ни одного Кроме=истина, то в выборку попадают все - условие Или
Без групп это грустно, ротация кадров, изменения условий, надо никому ничего не забыть Из практики недостаточно - хочется чтобы человек видел все заявки своего подразделения и свои личные в любом подразделении |
|||
22
Гений 1С
гуру
15.05.22
✎
20:08
|
(21) что касается групп, я при необходимости доработаю, я не вижу в этом проблемы, читай выше.
Что касается кроме и не кроме, то если не задан отбор по организации, отбор по организации не работает. Если задан отбор без кроме по двум организацимя А и Б, то доступны организации А и Б. Если задан отбор с кроме по двум организацимя А и Б, то доступны все организации кроме А и кроме Б. Если задан отбор без кроме по двум организацимя А и Б, и задан отбор с кроме по двум организацимя В и Г То доступны организации А и Б и остальные организации кроме В и Г. Поэтому такие назначения можно исключить, чтобы не дублировать. Т.е. по одному реквизиту нельзя назначить одновременно условие с кроме = истина и кроме = ложь. |
|||
23
Ненавижу 1С
гуру
15.05.22
✎
20:13
|
(22) >>Если задан отбор без кроме по двум организацимя А и Б, то доступны организации А и Б.
Запрос в (3) говорит иное |
|||
24
Гений 1С
гуру
15.05.22
✎
20:33
|
(23) запрос - это черновик, будет еще тестироваться.
|
|||
25
Ненавижу 1С
гуру
15.05.22
✎
20:44
|
(24) ждем готового решения в git и статьей на habr
|
|||
26
Said_We
15.05.22
✎
20:47
|
(5) Это не велосипед. Код так проще будет.
|
|||
27
Said_We
15.05.22
✎
20:58
|
(15) Тут прав на 100%.
Если логика в разных местах используется одна и та же, то логика всегда должна быть одна и в одном месте. Самый простой пример в запросах. Выбрать Выбор когда т.Поле1 в(1,2,3,4,5) тогда Истина Иначе Ложь конец Как Поле2 Из т как т где (Выбор когда т.Поле1 в(1,2,3,4,5) тогда Истина Иначе Ложь конец) = Истина В таких случаях чуть-чуть не оптимально помещать в подзапрос, но для исключения копипаста так делаю всегда: Выбрать т.* ИЗ (Выбрать Выбор когда т.Поле1 в(1,2,3,4,5) тогда Истина Иначе Ложь конец Как Поле2 Из т как т) КАК т где т.Поле2 = Истина Тут равно Истина писал, что бы понятнее было. Значение булево можно прямо указывать. Тут практически тоже самое. Каскад шаблонов построил и используй. |
|||
28
Ненавижу 1С
гуру
15.05.22
✎
21:18
|
(27) имеет право на жизнь, но основной минус - падение производительности запросов
|
|||
29
Said_We
16.05.22
✎
11:17
|
(28) Если про подзапросы, то падение производительности, как правило, на несколько миллисекунд дольше, если что-то в подзапрос засовывается. Если запрос тяжелый, то вообще не заметна будет разница с подзапросом и без.
Если про каскадные макросы, то со строками 1С не быстро работает. Но и тут производительность не критично должна отличаться. |
|||
30
Гений 1С
гуру
16.05.22
✎
12:14
|
(29) разве RLS не компилируются при старте приложения? по крайней мере так должно быть. Может они еще в CF компилируются.
|
|||
31
PLUT
16.05.22
✎
12:28
|
(30) RLS не компилируются при старте, это жы шаблоны, которые добавляются к запросу динамически (ну типа СтрЗаменить(ТекстЗапроса, #шляпаУсловиеRLS, "ёптыж")) ?
|
|||
32
Гений 1С
гуру
16.05.22
✎
12:38
|
(31) я имел ввиду текст RLS компилируется из шаблона при старте или даже в CF. Нет смысла его компилировать на рантайм.
|
|||
33
PLUT
16.05.22
✎
12:41
|
(32) ты про модификацию текста запроса динамически не понял? что ты скомпилировать то при старте собрался?
пока враги рисуют карты, мы меняем ландшафт |
|||
34
Гений 1С
гуру
16.05.22
✎
12:44
|
(33) а он не меняется динамически. RLS-часть просто приписывается к запросу по объекту
|
|||
35
Гений 1С
гуру
16.05.22
✎
12:49
|
я вот как подумал запрос этот писать:
Истина в ( ВЫБРАТЬ ИСТИНА ИЗ РегистрСведений.гпд_ДетальныеПрава КАК Т ГДЕ Т.Пользователь = &ТекущийПользователь И Т.ВидОбъекта = "#Параметр(1)" И Т.РеквизитОбъекта = "#Параметр(2)" И Т.ЗначениеРеквизита = Ссылка."#Параметр(2)" И НЕ Т.Кроме ОБЪЕДИНИТЬ ВЫБРАТЬ ЛОЖЬ ИЗ РегистрСведений.гпд_ДетальныеПрава КАК Т ГДЕ Т.Пользователь = &ТекущийПользователь И Т.ВидОбъекта = "#Параметр(1)" И Т.РеквизитОбъекта = "#Параметр(2)" И Т.ЗначениеРеквизита = Ссылка."#Параметр(2)" И НЕ Т.Кроме ) |
|||
36
Гений 1С
гуру
16.05.22
✎
12:57
|
Хотя не, лушче так
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.гпд_ДетальныеПрава КАК Т ГДЕ Т.Пользователь = &ТекущийПользователь И Т.ВидОбъекта = "#Параметр(1)" И ВЫБОР КОГДА Т.Кроме ТОГДА Т.РеквизитОбъекта <> "#Параметр(2)" ИНАЧЕ Т.РеквизитОбъекта = "#Параметр(2)" КОНЕЦ И Т.ЗначениеРеквизита = Ссылка."#Параметр(2)" Так короче и шустрее будет. |
|||
37
Гений 1С
гуру
16.05.22
✎
12:58
|
хотя не, кривовато, ладно, подумаю еще
|
|||
38
Said_We
16.05.22
✎
12:58
|
(33) Шаблон это статическая часть текста запроса. На момент запуска 1С можно все шаблоны перевести в конечный текст и уже по мере необходимости прицеплять этот статический текст динамически к запросам к БД.
Что бы была возможность создавать каскадные шаблоны, необходимо определить очередность, что-бы не было зацикливания. Либо как в SQL допустить рекурсию, но не более 100 вложенностей :-) |
|||
39
PLUT
16.05.22
✎
13:02
|
(34) чойтавдруг?
шаблоны органичений #ПоЗначениям() #ДляРегистра() как такую шляпу заранее скомпилировать? смерть кащея в яйце (в регистрах отдельных и еще недавно "быстрый" RLS закостылили на "ключах доступа к объектам" https://rarus.ru/publications/20200813-ot-ekspertov-1c-rarus-proizvoditelnost-novogo-rls-1c-bsp-3-441355/ |
|||
40
Гений 1С
гуру
16.05.22
✎
13:19
|
(39) а что тебя смущает в их предварительной компиляции?
|
|||
41
PLUT
16.05.22
✎
13:21
|
(40) а что тебя смущает в заклинании Выполнить() или Вычислить() заранее скомпилировать, если магия заклинания где-то там отдельно в регистрах лежит? аналогия
|
|||
42
PLUT
16.05.22
✎
13:23
|
+(41) Вычислить()
Пример: А = Вычислить("500 + 500*20/100"); А = Вычислить("Истина и Ложь"); А = Вычислить("""Иван"" + "" "" + ""Иванович"""); ну т.е. на стадии компиляции в CF предлагаешь в данные ломиться за выражениями? |
|||
43
Гений 1С
гуру
16.05.22
✎
13:38
|
(41) что ты как украинец, это другое. Шаблоны RLS можно применить до рантайма
|
|||
44
PLUT
16.05.22
✎
13:47
|
(43) напиши разрабам в 1С, пусть применят до рантайма, чё они там тупят
|
|||
45
Гений 1С
гуру
16.05.22
✎
13:47
|
(44) так они и применяют до рантайма. Ты просто этого не понимаешь. Где ты динамическую компиляцию увидал то? Вот реально
|
|||
46
PLUT
16.05.22
✎
13:59
|
(45) лень с тобой спорить, но с3.14жжено с ИТС - "Построенные условия добавляются к SQL-запросам, с которыми «1С:Предприятие» обращается к СУБД"
https://its.1c.ru/db/v8320doc#bookmark:dev:TI000000200 "5.5.4.8.4. Механизм наложения ограничений Любая операция над данными, хранимыми в базе данных, в «1С:Предприятии» в конечном счете приводит к обращению к базе данных с некоторым запросом на чтение или изменение данных. В процессе исполнения запросов к базе данных внутренние механизмы «1С:Предприятия» выполняют наложение ограничений доступа. При этом: ● Формируется список прав (чтение, добавление, изменение, удаление), список таблиц базы данных и список полей, используемых этим запросом. ● Из всех ролей текущего пользователя выбираются ограничения доступа к данным для всех прав, таблиц и полей, задействованных в запросе. При этом если какая-нибудь роль не содержит ограничений доступа к данным какой-нибудь таблицы или поля, то это значит, что в данной таблице доступны значения требуемых полей из любой записи. Иначе говоря, отсутствие ограничения доступа к данным означает наличие ограничения ГДЕ Истина. ● Получаются текущие значения всех параметров сеанса и функциональных опций, участвующих в выбранных ограничениях. Для получения значения параметра сеанса от текущего пользователя не требуется наличие права на получение этого значения. Однако если значение некоторого параметра сеанса не было установлено, то произойдет ошибка и запрос к базе данных выполнен не будет. На получение функциональных опций оказывает влияние свойство функциональной опции Привилегированный режим при получении (см. здесь). Если это свойство сброшено, то текущий пользователь должен обладать правами на чтение объекта, в котором хранится функциональная опция. ● Ограничения, полученные из одной роли, объединяются операцией И. ● Ограничения, полученные из разных ролей, объединяются операцией Или. ● Построенные условия добавляются к SQL-запросам, с которыми «1С:Предприятие» обращается к СУБД. При обращении к данным со стороны условий ограничения доступа проверка прав не выполняется (ни к объектам метаданных, ни к объектам базы данных). Причем механизм добавления условий зависит от выбранного способа действия ограничений «все» или «разрешенные»." |
|||
47
Ненавижу 1С
гуру
16.05.22
✎
14:29
|
человек не понимает, что текст RLS может быть не известен до своего вызова
|
|||
48
Гений 1С
гуру
16.05.22
✎
14:43
|
(46) вот видишь - построенные условия. Мы говорим про компиляцию конечных текстов RLS из шаблонов, ты просто не вкурил о чем спор
|
|||
49
Said_We
16.05.22
✎
14:43
|
(47) Он не говорит про итоговый текст запроса. Речь идет про текст шаблона и написание шаблонов без копипаста, за счет вызова из шаблона других шаблонов. В итоге получается итоговый текст шаблона.
Далее текст итогового запроса на основе этих итоговых шаблонов строить как обычно. Я так понял. |
|||
50
Гений 1С
гуру
16.05.22
✎
14:43
|
(47) (49) отож.
|
|||
51
Гений 1С
гуру
16.05.22
✎
14:44
|
Хотя может Ненавижн и прав. Вот если параметр сеанса поменяется, текст RLS надо перекомпилировать, так что вполне может быть, что RLS и динамически компилируются, если параметры сенса, входящие в их состав поменялись. А может и всегда.
|
|||
52
Гений 1С
гуру
16.05.22
✎
14:45
|
В этой связи в RLS неплохо бы добавить модификатор CONST, который бы указывал, что RLS надо рассчитвыать только при первом обращении.
|
|||
53
Said_We
16.05.22
✎
14:48
|
(52) Это смотря как рлс строить.
В твоих примерах я в основном увидел уход от копипаста. Т.е. см текст шаблона предварительно строится, а далее как обычно. |
|||
54
PLUT
16.05.22
✎
15:03
|
(51) ты не вкурил. у тебя "хотя может и прав", "так что вполне может быть, что, если иначе, а может и всегда"
в одном предложении. Л = логика Г1С ггггыыыы - будешь кофе? Г1С: - да нет наверное |
|||
55
PLUT
16.05.22
✎
15:07
|
+(47) "Иначе говоря, отсутствие ограничения доступа к данным означает наличие ограничения ГДЕ Истина"
(50) ты понимаешь, что "ГДЕ Истина" в тыкву RLS превращает? |
|||
56
Гений 1С
гуру
16.05.22
✎
15:09
|
(55) я как то применял ГДЕ ЛОЖЬ. Чтобы дать ковырять настройки отчета на СКД пользователю, но при этом не давать доступа к лишним документам и справочникам.
|
|||
57
PLUT
16.05.22
✎
15:14
|
(56) ну так что в итоге? получается, что в пофигураторе тексты шаблонов, которые "вероятно можно было ло бы заранее скомпилировать до рантайма" внезапно платформа еще в какие=то параметры сеанса (переменные) ломится и в зависимости от погоды на марсе текст может вдруг поменяться, а то и в тыкву превратиться ограничение (где Истина)
г@вно эта ваша 1С ?? |
|||
58
Ненавижу 1С
гуру
16.05.22
✎
15:19
|
Короче, геня движется к тому, что уже есть в БСП, но со своими костылями и квадратными колесами
|
|||
59
PLUT
16.05.22
✎
15:25
|
(52) в "быстром" RLS этот "мудификатор CONST" вынесли в регламентное задание (по обновлению "ключей доступа к объектам")
если ты конечно читал статью в (39) - там доступно и несерьезно про "быстрый" RLS |
|||
60
Гений 1С
гуру
16.05.22
✎
18:51
|
(58) да, чтобы это было проще БСП и следовательно гибче
|
|||
61
Гений 1С
гуру
16.05.22
✎
18:51
|
(59) ключи доступа - это другое
|
|||
62
Жан Пердежон
16.05.22
✎
20:15
|
(60) не будет
|
|||
63
Гений 1С
гуру
16.05.22
✎
22:06
|
(62) посмотрим
|
|||
64
Ненавижу 1С
гуру
16.05.22
✎
23:10
|
(60) проще!=гибче
Это разносторонние векторы |
|||
65
Гений 1С
гуру
16.06.22
✎
18:44
|
Таки вложенные шаблоны работают. Проверил на конкретной задаче.
Буду пользоваться. Результаты тут: https://geniy1s.ru/sobstvennyj-prostejshij-proizvoditelnyj-rls-nachalo-unf/ |
|||
66
Ненавижу 1С
гуру
16.06.22
✎
20:29
|
(65) как всегда ключевые моменты:
Попытки проанализировать работу кода RLS провалились из-за сложности системы |
|||
67
Гений 1С
гуру
16.06.22
✎
21:46
|
(66) да и это говорит не в пользу системы
|
|||
68
Ненавижу 1С
гуру
16.06.22
✎
22:53
|
(67) нет, это говорит о компетентности специалиста
|
|||
69
Said_We
17.06.22
✎
10:43
|
(68) Прошел месяц как тема стартанула и не кто тут не показал до примера в (65) как работает вложенные шаблоны/макросы в РЛС.
Это говорит о .... Справедливости ради, о чем это говорит? |
|||
70
Выпрь
17.06.22
✎
11:07
|
(69) Просто никто не пишет свои РЛС
|
|||
71
Гений 1С
гуру
17.06.22
✎
12:57
|
(70) у меня был опыт написания своих RLS для Документооборота. ;-)
|
|||
72
Гений 1С
гуру
17.06.22
✎
12:58
|
(68) доказательства будут?
(69) Ну это же андокументед, к тому же 1С ругается, а Runtime работает. |
|||
73
Гений 1С
гуру
17.06.22
✎
12:58
|
(70) хотя и для Альфа-Авто 5 (под ОФ) я писал RLS, было дело.
|
|||
74
Said_We
17.06.22
✎
16:50
|
(70) Если свои не пишет, то чьи пишет? :-)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |