Имя: Пароль:
1C
1С v8
Долго открывается форма с динамическим списком
0 Dirk Diggler
 
19.03.25
17:14
Есть форма списка задач. На ней по сути всего 2 элемента, динамические списки - список ролей и список собственно задач.

Форма очень долго открывается,  7-9 секунд.
Замер производительности ничего не показывает.

Если быть точным, то показывает несколько секунд выполнения строки


ФормаСпискаЗадач.Открыть();


Запросы динамических списков в консоли запросов работают быстро, 40-90 мс, но похоже, что тормоза все-таки из-за них, т.к. установка у обоих элементов Видимость = Ложь приводит к ускорению открытия формы до 1-2 секунд.

Что можно сделать?
1 H A D G E H O G s
 
19.03.25
17:20
1) Словить план запроса в профайлере
2) Убедиться, что отображение - Иерархический список, а не Дерево.
2 H A D G E H O G s
 
19.03.25
17:20
Посмотреть в настройках наличие Группировок и Сортировок
3 eddy_n
 
19.03.25
22:00
Немного не в тему, но где же ещё. Зачем такой опус в типовом запросе УТ 11.4 в списка задач:
... ИЛИ ИСТИНА В
                (ВЫБРАТЬ
                    ИСТИНА
                ИЗ
                    РегистрСведений.ИсполнителиЗадач КАК ИсполнителиЗадач
                ГДЕ
                    ЗадачаЗадачаИсполнителя.РольИсполнителя = ИсполнителиЗадач.РольИсполнителя
                    И ЗадачаЗадачаИсполнителя.ОсновнойОбъектАдресации = ИсполнителиЗадач.ОсновнойОбъектАдресации
                    И ЗадачаЗадачаИсполнителя.ДополнительныйОбъектАдресации = ИсполнителиЗадач.ДополнительныйОбъектАдресации
                    И ИсполнителиЗадач.Исполнитель = &ВыбранныйИсполнитель))
4 Garykom
 
гуру
19.03.25
22:06
(3) Ты думаешь типовые одни сеньоры пишут?
5 eddy_n
 
19.03.25
23:40
(4) Думаю, это наигранная комбинация, домашняя заготовка, банальный шаблон, но лень да и времени нет ломать голову над этой приблудой.
6 PR
 
20.03.25
01:58
(3) А что непонятного?
Есть исполнитель в регистре сведений — хорошо, нет — плохо
7 Garykom
 
гуру
20.03.25
02:26
(6) Непонятно почему так криво написано с подзапросом
Почему не использована ВТ и левое соединение - что шустрей
Ибо вот этот подзапрос фактически будет исполняться в цикле для каждой строки основного запроса
8 PR
 
20.03.25
02:42
(7) Потому что это коррелирующий запрос
Перед тем как выпендриваться про скорость, было бы неплохо посмотреть план запроса и немного в матчасть
А потом уже, если вдруг окажется, что скуль не умеет в коррелирующие запросы, выпендриваться
9 DrZombi
 
гуру
20.03.25
06:19
(0) Упрощайте свой запрос во списке, как вы все реализуете, все в ваших - "Мозгах" :)

А так, мало информации.

Если Это PostgreSQL, то там есть пару команд, которые оный продукт уже не перемалывает, т.е. если вчера на SQL все было быстро, то сегодня увы надо переписывать :)
10 DrZombi
 
гуру
20.03.25
06:20
(5) А все, придется теперь ломать голову, или ныть и стонать, как ТС в (0) :)
11 DrZombi
 
гуру
20.03.25
06:26
(0) Вот держите, ну а если не в тему, то надо детально спрашивать. А не как обычно - "В чем смысл вселенной и всего, всего..."

https://infostart.ru/1c/articles/1979106/
https://infostart.ru/1c/articles/1890717/

Вам раздел: 8.6. PostgreSQL
https://its.1c.ru/db/v8312doc#bookmark:dev:TI000001291

https://its.1c.ru/db/metod8dev/content/4208/hdoc


Рекомендация от ИТС.
Оптимизация использования виртуальной таблицы СрезПоследних при работе с PostgreSQL
Проблема
При работе с PostgreSQL использование соединения с виртуальной таблицей СрезПоследних может приводить к существенному снижению производительности. Из-за ошибки оптимизатора может быть выбран неоптимальный план выполнения запроса.

Решение
Если в запросе используется соединение с виртуальной таблицей языка запросов "1С:Предприятия" СрезПоследних и запрос работает с неудовлетворительной производительностью, то рекомендуется вынести обращение к виртуальной таблице в отдельный запрос с сохранением результатов во временной таблице.

... и .т.д.
Все по сути просто, и не очень :)
12 eddy_n
 
20.03.25
07:32
(8) Учили же в первом классе - ходите и оглядывайтесь, если используете подзапросы.
13 eddy_n
 
20.03.25
07:34
(8) Что понимается под "коррелирующими" запросами? Не встречал пока в около-1с-пространстве такой терминологии.
14 rsv
 
20.03.25
07:50
(11) а почему все виртуальные таблички всех регистров предварительно не выгружать во временные перед соединениями ?  Удобно, оптимизатору легче…. правда стоимость в два раза инфу дублировать но это так , мелочи :)
15 Мультук
 
гуру
20.03.25
08:24
(13)

1) Сколько помню, там еще в  УТ 11.3 с задачами было "совсем страшно", они долго правили.

2)
>>Не встречал пока в около-1с-пространстве такой терминологии
Потому как такие запросы в 1С "низзя".
Но если сильно хочется - то можно ваш пример)

P.S.
Это термин из "взрослого" sql
Термин вполне себе существует, чего же его не использовать

https://en.wikipedia.org/wiki/Correlated_subquery
16 DrZombi
 
гуру
20.03.25
08:52
(14) Хороший вопрос, Почему? Я вот больше задаюсь вопросом, зачем PostgreSQL? Российского в нем столько же сколько российского в Alladin-е от 1С :)
17 DiMel_77
 
20.03.25
08:52
(13) В условиях запросов синтаксис 1С допускает использование "Коррелированного" запроса.

Например такой запрос будет с точки зрения 1С корректным:
ВЫБРАТЬ
	Сотрудники.Ссылка КАК Ссылка,
	Сотрудники.ФизическоеЛицо В
		(ВЫБРАТЬ
			ФизическиеЛица.Ссылка КАК Ссылка
		ИЗ
			Справочник.ФизическиеЛица КАК ФизическиеЛица
		ГДЕ
			ФизическиеЛица.Пол = ЗНАЧЕНИЕ(Перечисление.ПолФизическогоЛица.Мужской)) КАК ЭтоМужчина
ИЗ
	Справочник.Сотрудники КАК Сотрудники


И неважно условие в секции ГДЕ или в строке выборки, но выполнение такого запроса - это по сути запрос в цикле для каждой строки выборки. Иногда это конечно полезно, но быстродействие таких запросов соответствующее.
18 Ненавижу 1С
 
гуру
20.03.25
09:02
(7) левое  соединение возможно даст задвоение строк (надо анализировать состав измерений)
19 H A D G E H O G s
 
20.03.25
10:24
(17) именно для динамического списка с динамическим чтением (когда задана основная таблица и стоит галочка), это охеренное решение, так как основная таблица читается порциями по 45 строк при скролле списка.
20 Dirk Diggler
 
20.03.25
10:53
(1) ну вообще оно именно дерево....
21 Dirk Diggler
 
20.03.25
10:58
(20) а, не, пардон, список с группировкой
22 Dirk Diggler
 
20.03.25
12:01
Запрос выглядит вот так. Часть полей я пробросил, чисто опытным путем выяснив, что тормозит весь список поле с ВЫБОР-КОГДА.



ВЫБРАТЬ
..........
    ЗадачаЗадачиПользователя.DX_ОбъектРезультат КАК DX_ОбъектРезультат,
    ВЫБОР
        КОГДА ЗадачаЗадачиПользователя.БизнесПроцесс ССЫЛКА БизнесПроцесс.DX_ОбработкаТикета
            ТОГДА ЕСТЬNULL(ВЫРАЗИТЬ(ЗадачаЗадачиПользователя.БизнесПроцесс КАК БизнесПроцесс.DX_ОбработкаТикета).Контрагент, ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка))
        КОГДА ЗадачаЗадачиПользователя.БизнесПроцесс ССЫЛКА БизнесПроцесс.DX_Закупка
            ТОГДА "Закупки"
        ИНАЧЕ ИСТИНА
    КОНЕЦ КАК ГруппировочноеПоле
ИЗ
    Задача.ЗадачиПользователя КАК ЗадачаЗадачиПользователя
ГДЕ
    (ЗадачаЗадачиПользователя.Исполнитель = &Исполнитель
            ИЛИ ЗадачаЗадачиПользователя.DX_РольИсполнителя В
                (ВЫБРАТЬ
                    DX_РегистрАдресацииЗадач.DX_РольИсполнителя КАК DX_РольИсполнителя
                ИЗ
                    РегистрСведений.DX_РегистрАдресацииЗадач КАК DX_РегистрАдресацииЗадач
                ГДЕ
                    DX_РегистрАдресацииЗадач.Исполнитель = &Исполнитель
                    И DX_РегистрАдресацииЗадач.DX_РольИсполнителя В (&ВыбранныеРоли)))
    И НЕ ЗадачаЗадачиПользователя.ПометкаУдаления


Вопрос такой.

Почему в консоли запросов это выполняется практически мгновенно, а при открытии управляемой формы - до 5-7 секунд?
23 eddy_n
 
20.03.25
12:10
(22) В консоли - запрос голый, а форма может быть обременена не знамо чем.
24 Dirk Diggler
 
20.03.25
12:19
(23) ды в том и дело, что считай ничего в форме-то и нет...
25 eddy_n
 
20.03.25
12:28
(24) Чего-то явно не договариваешь. Подписка может какая сидит...
26 Dirk Diggler
 
20.03.25
12:42
(25) да ничего там особого нет.

похоже, это от платформы растет.

Если переключить режим отображения динамического списка с "Дерево" в "Иерархический список", форма открывается в несколько раз быстрее, секунды за 1.5-2.

минус, список теперь свернут...
27 Dirk Diggler
 
20.03.25
12:54
Чё. За. Фигня...
Я отключил группировку  у динамического списка.
Но он все равно в форме выводится с группировкой по полю "Контрагент", в виде дерева или иерархического списка....

полез в настройки списка, установил группировку по другому полю(ТочкаМаршрута). а выводится все равно с группировкой по первоначальному "Контрагент".

Все облазил, кэш чистил - не могу понять, откуда берется структура ДС?
28 H A D G E H O G s
 
20.03.25
13:31
(27) Ну ты в конфигураторе сбрось группировку и в предприятии установи настройки формы по умолчанию
29 Dirk Diggler
 
20.03.25
13:39
(28) не совсем понял что за настройки по умолчанию. Вставил костыль - поскольку тормозит непосредственно при построении формы на клиенте, то элементу поставил вид отображение "списком", а потом уже после построения формы в ПриОткрытии()
в конце добавил:

    Элементы.СписокЗадач.НачальноеОтображениеДерева = НачальноеОтображениеДерева.РаскрыватьВсеУровни;
    
    Если не Элементы.СписокЗадач.ТекущиеДанные.РодительскаяГруппировкаСтроки = Неопределено Тогда
        Элементы.СписокЗадач.ТекущаяСтрока = Элементы.СписокЗадач.ТекущиеДанные.РодительскаяГруппировкаСтроки;
    КонецЕсли;

    Элементы.СписокЗадач.Отображение = ОтображениеТаблицы.Список;     
    Элементы.СписокЗадач.Отображение = ОтображениеТаблицы.Дерево;


Открывается за 1-2 секунды. Пойдет.
30 Garykom
 
гуру
20.03.25
14:42
(29)А просто в начале ПриСозданииНаСервере видимость элемента ДС делать Ложь
И в конце ПриОткрытии = Истина
Не поможет?
31 Dirk Diggler
 
20.03.25
14:59
(30) Попробовал.

Да, плюс-минус тот же эффект.

Вот так и оставлю.
32 PR
 
20.03.25
16:02
(15) В 1С можно, но только в условиях
2 + 2 = 3.9999999999999999999999999999999...