Имя: Пароль:
1C
1С v8
оптимизация рлс без последней бсп
0 ASimonova
 
07.02.23
11:14
1С:Предприятие 8.3 (8.3.18.1741)
Подсистемы управление доступами нет
В базе ведется учет по нескольким десяткам тысяч сотрудников и нескольким десяткам тысяч подразделений
Есть документ, у него есть реквизит Сотрудник (а еще есть документ, у которого в табличной части есть реквизит Сотрудник, но это на потом)
Есть РС, по которому смотрим, в каком Сотрудник работает Подразделении
Нужно ограничить доступ к этим документам по списку доступных подразделений (доступных подразделений бывает до 10 тысяч, а соответственно доступных сотрудников до 30 тысяч)

Пробовалось уже много чего, но хотелось бы услышать, как бы вы решали такую задачу
1 vicof
 
07.02.23
11:25
Что такое доступность?
2 vicof
 
07.02.23
11:26
В чем состоит задача? В заголовке одно, в тексте другое.
3 OldCondom
 
07.02.23
11:27
А что пробовали? Это было? https://its.1c.ru/db/v8322doc#bookmark:dev:TI000000191
4 ASimonova
 
07.02.23
11:30
(1) у меня слово доступность в тексте не встречается...
(2) допустим сосредоточимся на том, что в тексте задачи, будем считать, что заголовок я сформулировала ошибочно. нужно добиться того, чтобы пользователь видел только документы по сотрудникам, которые работают в подразделениях, которые у пользователя лежат в некоем объекте метаданных. в каком - можно обсудить
5 ASimonova
 
07.02.23
11:30
(3) нету доступа туда(
6 ASimonova
 
07.02.23
11:32
(3) пробовала ограничивать прямо через запрос динамического списка с разными вариантами, пробовала через рлс, в который передавала список сотрудников, пробовала через рлс, в который передавала список подразделений и прямо там вычисляла, пробовала через регистр со всеми ссылками... вроде что-то еще, но точно уже не помню. один из вариантов более или менее норм, минуту всего открывал список.
7 p-soft
 
07.02.23
11:36
ага. еще к задаче добавьте, что все работает на старом пентиуме 486 и на ленточных накопителях.
8 ASimonova
 
07.02.23
11:37
(7) и однако же, сейчас всего минуту открывается список! думаю что задача все же решаема в таких условиях
9 Мультук
 
гуру
07.02.23
11:38
(0)

Например
Есть 50 000 подразделений
И есть сотрудник Вася, который может смотреть документы по  40 000 подразделений из описанных выше
И есть сотрудник Петя, который может смотреть документы по  2 подразделениям из описанных выше

Вопрос
В вашем удачном варианте
1) Для "Петя" сколько открывается список
2) А для "Вася" ?

Текст запроса удачного варианта
10 p-soft
 
07.02.23
11:38
(8) как в клюшках делали: формируйте общий индекс и по нему фильтруйте - самый эффективный способ
11 p-soft
 
07.02.23
11:40
и плюсом, надо вот это с "пробовала ограничивать прямо через запрос динамического списка", с использованием этого индекса
12 p-soft
 
07.02.23
11:43
вообще, все универсальные алгоритмы предназначены только для ускорения разработки. ну и кто то еще бюджеты пилить научился под это дело.
универсальность почти всегда снижает итоговую производительность. я и про рлс в т.ч.
повторюсь, делайте индексы и по ним отбор в запросах, где надо.
13 ASimonova
 
07.02.23
11:46
(9) 1) для Пети 1-2 минуты 2) для Васи 1-2 минуты
запрос ниже (и он с кучей доп условий, о которых я не писала), но вот я сейчас последний вариант пробую, где сотрудников записываю в РС, соединяю с доком и выбираю, и кажется это срабатывает лучше!

ВыдачаНоменклатурыСотрудникам
ИЗ
    Документ.ВыдачаНоменклатурыСотрудникам КАК ВыдачаНоменклатурыСотрудникам
        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            Сотрудники.Ссылка КАК Сотрудник
        ИЗ
            Справочник.Сотрудники КАК Сотрудники
        ГДЕ
            &ЕстьОграничениеПоПодразделениям
            И Сотрудники.Ссылка В(&ДоступныеУволенныеСотрудники)
        
        ОБЪЕДИНИТЬ ВСЕ
        
        ВЫБРАТЬ
            СотрудникиПредприятия_Интервалы.Сотрудник
        ИЗ
            РегистрСведений.СотрудникиПредприятия_Интервалы КАК СотрудникиПредприятия_Интервалы
        ГДЕ
            &ЕстьОграничениеПоПодразделениям
            И НЕ СотрудникиПредприятия_Интервалы.Профессия = ЗНАЧЕНИЕ(Справочник.Профессии.ПустаяСсылка)
            И СотрудникиПредприятия_Интервалы.Профессия В(&МассивРазрешенныхПодразделений)
            И &ТекущаяДатаДень МЕЖДУ СотрудникиПредприятия_Интервалы.НачалоПериода И СотрудникиПредприятия_Интервалы.КонецПериода) КАК РазрешенныеСотрудники
        ПО (&ЕстьОграничениеПоПодразделениям)
            И (ВыдачаНоменклатурыСотрудникам.Сотрудник = РазрешенныеСотрудники.Сотрудник)
ГДЕ
    ВыдачаНоменклатурыСотрудникам.Организация В (&МассивРазрешенныхОрганизаций)
    И ВыдачаНоменклатурыСотрудникам.Склад В (&МассивРазрешенныхСкладов)
    И ВыдачаНоменклатурыСотрудникам.ВендинговыйАппарат В (&МассивРазрешенныхСкладов)
    И ВыдачаНоменклатурыСотрудникам.ОператорПостамата В (&МассивРазрешенныхСкладов)
    И (НЕ &ЕстьОграничениеПоПодразделениям
            ИЛИ ВыдачаНоменклатурыСотрудникам.Сотрудник = ЗНАЧЕНИЕ(Справочник.Сотрудники.ПустаяСсылка)
            ИЛИ НЕ РазрешенныеСотрудники.Сотрудник ЕСТЬ NULL)
14 ASimonova
 
07.02.23
11:48
(12) ок! да, этого не пробовала, ошибку поняла
15 Мультук
 
гуру
07.02.23
11:54
(13)

Можно попробовать так  

1) Вот это поместить во временную таблицу, в тексте запроса сделать левое соединение с этой временной таблицей
2) Во временной таблице проиндексировать поле сотрудник  (Сотрудники.Ссылка)
3) Посмотреть на результат

(ВЫБРАТЬ
            Сотрудники.Ссылка КАК Сотрудник
        ИЗ
            Справочник.Сотрудники КАК Сотрудники
        ГДЕ
            &ЕстьОграничениеПоПодразделениям
            И Сотрудники.Ссылка В(&ДоступныеУволенныеСотрудники)
        
        ОБЪЕДИНИТЬ ВСЕ
        
        ВЫБРАТЬ
            СотрудникиПредприятия_Интервалы.Сотрудник
        ИЗ
            РегистрСведений.СотрудникиПредприятия_Интервалы КАК СотрудникиПредприятия_Интервалы
        ГДЕ
            &ЕстьОграничениеПоПодразделениям
            И НЕ СотрудникиПредприятия_Интервалы.Профессия = ЗНАЧЕНИЕ(Справочник.Профессии.ПустаяСсылка)
            И СотрудникиПредприятия_Интервалы.Профессия В(&МассивРазрешенныхПодразделений)
            И &ТекущаяДатаДень МЕЖДУ СотрудникиПредприятия_Интервалы.НачалоПериода И СотрудникиПредприятия_Интервалы.КонецПериода)
16 p-soft
 
07.02.23
11:56
(14) угу. пример работы: формируем сначала список документов с отборами по всем нужным индексам, соединяем результат уже со своей целевой выборкой. можно без временных таблиц.
17 p-soft
 
07.02.23
11:59
(16) индекс = таблица с ограничениями
18 ASimonova
 
07.02.23
12:02
(16) что-то такое делала, но без индексов, и получилось ужасно... но с индексами попробую
19 Dmitrii
 
гуру
07.02.23
12:08
Почему бы не попробовать реализовать БСП-шные механизмы?
Пример можно посмотреть в ЗУП. Там есть ограничения и по подразделениям и по группам физлиц. С вариантами "Все разрешены, кроме..." и "Все запрещены, кроме...".

(4) >> у меня слово доступность в тексте не встречается...

А это что: "доступных подразделений бывает до 10 тысяч, а ... доступных сотрудников до 30 тысяч"?

И почему из количества подразделений в 10 тыс следует, что доступных сотрудников может быть до 30 тыс? У вас не более трёх сотрудников в подразделении?

Нельзя укрупнить единицу доступа? Создать группы доступа сотрудников (по аналогии группами доступа физлиц в ЗУП) или группы доступа к подразделениям?

И точно нужны все эти условия?

ГДЕ
   ВыдачаНоменклатурыСотрудникам.Организация В (&МассивРазрешенныхОрганизаций)
    И ВыдачаНоменклатурыСотрудникам.Склад В (&МассивРазрешенныхСкладов)
    И ВыдачаНоменклатурыСотрудникам.ВендинговыйАппарат В (&МассивРазрешенныхСкладов)
    И ВыдачаНоменклатурыСотрудникам.ОператорПостамата В (&МассивРазрешенныхСкладов)

Все эти реквизиты Организация, Склад, ВендинговыйАппарат и ОператорПостамата никак не связаны между собой?
Например, Склад не привязан к Организации? Или ВендинговыйАппарат к ОператорПостомата? Может вполне достаточно фильтровать по Склад и ВендинговыйАппарат?

И всё таки!
Мы говорим об ограничении доступа (любыми способами) или настройке отборов в динамических списках?
Это две совершенно разные задачи, которые решать надо по-разному.
20 ASimonova
 
07.02.23
12:16
(19) рализовать бсп-шные механизмы в плане самой написать кусок бсп?))) ну в целом можно, как то делала уже похожее))) но долго и судя по тому что я вижу, не особо поможет. универсальность, как тут выше писали, снижает итоговую производительность, а бсп - это про это. я подумала, что может быть задача решается как-то быстро, а я чего-то важного и очевидного не вижу

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

единица доступа уже укрупнена, склады друг с другом не связаны, к организациям не привязаны

да, мы говорим о том, чтобы любыми способами ограничить доступ, хотя очень хотелось бы все же с рлс, но если списки будут по 2 минуты висеть, то все средства хороши
21 mistеr
 
07.02.23
12:23
(13) А сколько времени открывается список со всеми доп. условиями, но без РЛС?

Ну и на таких объемах уже надо переходить на уровень ниже, выкладывать и обсуждать планы запросов.
22 ASimonova
 
07.02.23
12:27
(21) а где все эти доп условия, если не в рлс? в списках документов? хоть в рлс хоть в запросах дин списков, быстро, очень быстро открывается, если не фильтровать по сотрудникам и подразделениям т.к. складов и организаций мало

а этого я еще не умею... ну понятно, буду учиться
23 ASimonova
 
07.02.23
12:28
если что, то вот это отлично сработало!
просто заранее надо вести РС с актуальными данными, т.е. задача усложняется в каком-то смысле

ВыдачаНоменклатурыСотрудникам
ИЗ
    Документ.ВыдачаНоменклатурыСотрудникам КАК ВыдачаНоменклатурыСотрудникам
ГДЕ
    ВыдачаНоменклатурыСотрудникам.Организация В (&МассивРазрешенныхОрганизаций)
    И ВыдачаНоменклатурыСотрудникам.Склад В (&МассивРазрешенныхСкладов)
            И ВыдачаНоменклатурыСотрудникам.ВендинговыйАппарат В (&МассивРазрешенныхСкладов)
            И ВыдачаНоменклатурыСотрудникам.ОператорПостамата В (&МассивРазрешенныхСкладов)
    И (НЕ &ЕстьОграничениеПоПодразделениям
            ИЛИ ВыдачаНоменклатурыСотрудникам.Сотрудник В
                (ВЫБРАТЬ
                    ДоступныеСотрудники.ДоступныйСотрудник КАК ДоступныйСотрудник
                ИЗ
                    РегистрСведений.ДоступныеСотрудники КАК ДоступныеСотрудники
                ГДЕ
                    ДоступныеСотрудники.Пользователь = &ТекущийПользователь))
24 mistеr
 
07.02.23
12:32
(23) Это называется материализация :)
25 p-soft
 
07.02.23
12:41
(23) млдц. только лучше внутренними соединениями, хоть и громоздко
26 p-soft
 
07.02.23
12:42
(25) кеширование и индексирование - лучший способ заставить цифровой антиквариат работать))
27 Dmitrii
 
гуру
07.02.23
13:36
(20) >> рализовать бсп-шные механизмы в плане самой написать кусок бсп?)))

Зачем самой переизобретать БСП?
Внедрить БСП в вашей конфигурации в части нужных подсистем - Управление доступом.
Самой писать с нуля не надо. Только тот код, который требуется в инструкции. https://its.1c.ru/db/bsp317doc#content:4:1:issogl1_управление_доступом

>> универсальность, как тут выше писали, снижает итоговую производительность, а бсп - это про это.

БСП конечна далека от идеалов производительности. Но БСП не про это.
Если Вы думаете, что сумеете придумать под ваши задачи более оптимальный и производительный инструмент, то будьте готовы к неприятным открытиям.
У Вас изначально стоит задача реализовать универсальный механизм - ограничение доступа на уровне записей одновременно по нескольким разрезам и динамически изменяющимся наборам.

>>  мы говорим о том, чтобы любыми способами ограничить доступ, хотя очень хотелось бы все же с рлс.

Тогда почему вы продолжаете обсуждать оптимизацию запросов в динамических списках?
Вы точно понимаете в чём разница между ограничениями доступа на уровне записей (РЛС) и отборами в запросах к динамическим спискам?
28 ASimonova
 
07.02.23
13:40
(25) о, а я наоборот читала что так лучше...
29 ASimonova
 
07.02.23
13:42
(27) как раз у меня был отличный проект, который на бсп работал чудовищно в силу скромных ресурсов сервера, а переписав почти все самостоятельно, я увидела, что все просто летает, так что к бсп у меня так себе отношение, ну уж извините

да, чем отличается рлс и запросы в дин списках хорошо понимаю, спасибо)
30 mistеr
 
07.02.23
13:42
(27) Что-то мне подсказывает, что тут не универсальная, а частная задача. И частное решение для нее вполне годится имхо.