Имя: Пароль:
1C
 
запрос работает неприлично долго
,
0 Shur1cIT
 
06.09.21
14:31
https://ibb.co/5GJSw5x
90 процентов выполнение запроса.
реквизит рткЗаявкаНаТранспортДокументыОснования.Документ имеет тип "Документ" те все документы,
те в результате запроса может быть любой  документ, вопрос возник, как ускорить данный запрос?
1 Shur1cIT
 
06.09.21
14:34
(0) есть гипотеза, с начало получить просто документы во временную таблицу, а потом уже нужные поля выдирать, но не уверен что поможет
2 Мультук
 
гуру
06.09.21
14:36
(1) Ты не пробуй дальше, особенно тут пробовать 5 мин переписать запрос
3 Shur1cIT
 
06.09.21
14:37
как понял в данном запросе запрос получает все документы, а потом уже накладывает условия, если бы можно было бы сразу условия при выборке наложить
4 ads55
 
06.09.21
14:37
(0) а зачем выбирать документ, если нужны только номер и дата?
5 osa1C
 
06.09.21
14:38
(0) А запрос в Функции, он не в цикл ли попал?
6 Chai Nic
 
06.09.21
14:39
Постгрес небось..?
7 Shur1cIT
 
06.09.21
14:39
(5) нет это реально одиночный запрос так долго обрабатывает, смотрел отладчиком.
(6) нет
8 ads55
 
06.09.21
14:40
(0) много оснований для распоряжения. Да и через точку ещё. Сократить виды документов-оснований можно?
9 Shur1cIT
 
06.09.21
14:41
(8) нет к сожалению
10 Shur1cIT
 
06.09.21
14:42
(8) это давно уже до меня делали, задача ускорить насколько возможно
11 osa1C
 
06.09.21
14:42
(7) ну как в (4)  документ тебе не нужен, тебе только номер и дата вроде нужна... убери документ из запроса
12 MyNick
 
06.09.21
14:46
(0) для получения представления поля Документ делается неявное соединение с таблицами всех документов.
13 ads55
 
06.09.21
14:46
(10) сделай регистр номера и даты оснований, пусть туда все номер, дата и ссылка на основание пишется. А запрос уже к нему делай.
14 patapum
 
06.09.21
14:46
(0) И реально там может быть любой документ из конфигурации, а не 5-6 разных типов? Не верю!
15 Недопустимый
 
06.09.21
14:49
(0) 90 процентов выполнение запроса.
90% от какого времени?
16 Megas
 
06.09.21
14:53
ВЫБРАТЬ
    &Ссылка
ПОМЕСТИТЬ врТаб
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    врТаб.Ссылка.Дата,
    врТаб.Ссылка.Номер
ИЗ
    врТаб КАК врТаб

Даже так работает =)
17 acht
 
06.09.21
14:55
(16) > ВЫБРАТЬ &Ссылка
Вот здесь ты неявно типизировал колонку, поэтому дальнейшее левое соединение будет только с одной таблицей.
18 Chai Nic
 
06.09.21
14:59
В mssql очень неплохой профайлер, перехватывай запрос, смотри план
19 Dmitrii
 
гуру
06.09.21
15:00
(16) Ему нужны номер и дата не от &Ссылка, а от документов, которые лежат в реквизите Документ табличной части &Ссылка.ДокументыОснования.
20 Dmitrii
 
гуру
06.09.21
15:01
+ к (19) И полагаю, что тип у этого реквизита составной на множество различных ДокументСсылка.
21 polosov
 
06.09.21
15:02
(0) В таком случае, я бы сначала выбрал все типы в выборке, потом на основе этих данных динамически собрал бы запрос с ВЫРАЗИТЬ(рткЗаявкаНаТранспортДокументыОснования.Документ КАК ТвойТипДокумента).Дата/Номер - по всем типам из первого запроса. Да, в 2 запроса + код, но должно быть быстрее.
22 1Сергей
 
06.09.21
15:02
(20) Главное (0) не читай
23 1Сергей
 
06.09.21
15:03
Зачем в 2021 веке может понадобится дата и номер? В третью систему что-то выгружаете?
24 Почему 1С
 
06.09.21
15:03
(0) Какая архитектура такой и запрос, у тебя тут соединение со всеми документами конфигурации
25 Ёпрст
 
06.09.21
15:04
(23) печатная форма жешь..
26 polosov
 
06.09.21
15:06
(0) Или делай избыточность данных - в ТЧ добавляй поля Дата/Номер и заполняй их при создании документа.
27 Почему 1С
 
06.09.21
15:06
(0) Ответ, в момент записи документа записывай номер и дату основания в реквизиты документа, решение не очень но для такой продуманной архитектуры конфигурации пойдет
28 Deal with it
 
06.09.21
15:09
(0) вот ради интереса, если вообще не использовать запрос, а тупо перебрать циклом все документы в массиве/тз "рткЗаявкаНаТранспортДокументыОснования". Будет ли быстрее? У тебя есть ссылка на сам документ Заявки, а значит и доступ к реквизиту ДокументыОснования. Попробуй циклом перебрать.
29 polosov
 
06.09.21
15:10
(28) Запросы в цикле к каждому документу?
30 УдавВПопугаях
 
06.09.21
15:14
а сколько там данных в этой ТЧ? и 90% времени от скольки в секундах/минутах? + (1) и (16) надо попробовать то или как? логика в этом есть, если неявно преобразует и сделает только необходимые связи, то должно ускорить
31 Deal with it
 
06.09.21
15:15
(29) есть просто цикл типа
Для каждого Документ из ДокументыОснования Цикл
  Результат = Документ.Дата + "" Документ.Номер//или как там
КонецЦикла;
Может так быстрее будет
Не всегда запрос эффективнее тупого перебора.
32 Deal with it
 
06.09.21
15:16
(31) + точнее
ТЗ = рткЗаявкаНаТранспорт.ДокументыОснования.ВЫГРУЗИТЬ();

Для каждого Документ Из ТЗ цикл
33 polosov
 
06.09.21
15:17
Тема - перепись говнокодеров.
34 Deal with it
 
06.09.21
15:17
прост если у всех документов есть эти 2 параметра, то нам даже на тип их проверять не надо.
35 УдавВПопугаях
 
06.09.21
15:18
(34) бывают документы без номера или даты?
36 Deal with it
 
06.09.21
15:18
(33) вопрос не говнокода, а производительности, если это будет быстрее, то это не говнокод, а вынужденная мера.
37 Deal with it
 
06.09.21
15:19
в общем я как вариант предложил, дальше ТС сам пусть решает
38 УдавВПопугаях
 
06.09.21
15:20
(33) по теме: + 1 в переписи
39 Dmitrii
 
гуру
06.09.21
15:20
Поэтому либо пробовать (1) и надеяться на то, что СУБД построит правильный план запроса, либо (13). Других способов нет.
Ну или извратиться с получением типов значений реквизита Документ, попавших в выборку, а потом в цикле собрать текст запроса, где уже обращаться к документам конкретных типов.
Подойдёт только если количество различных типов документов, попавших в табличную часть одного конкретно взятого документа рткЗаявкаНаТранспортДокументыОснования невелико.
По сути это аналог (31),(32). И кстати возможно, что (31) будет работать быстрее, если табличная часть ДокументыОснования небольшая (а весьма вероятно, что она небольшая).
40 ads55
 
06.09.21
15:22
(33) самый скрепный штоле?
человек попросил помощь - он советы получил. Свой код покажи, раз обвиняешь.
41 polosov
 
06.09.21
15:24
(40) Выше смотри, внимательно.
42 arsik
 
гуру
06.09.21
15:25
(0) Сначала выбери все документы без их реквизитов. Потом уже реквизиты получай через:
СтруктураРеквизитовДокумента = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Выборка.Документ, "Номер, Дата");
43 ads55
 
06.09.21
15:26
(41) в (38) - Точно!
44 polosov
 
06.09.21
15:28
(43) Вот жеж обиженка. По делу есть что?
45 Shur1cIT
 
06.09.21
15:30
Значительно ускорил выкинув Документ из полей получения, дальше как ускорять незнаю, другого варианта не вижу, странно что документ даёт такой тормоз это же по сути гуид и он такой же "общий" как номер и дата.
46 Deal with it
 
06.09.21
15:30
Вот интересно, предлагать добавить в уже существующий документ 2 реквизита, которые заполняются только при записи, а значит предложить ТСу перезаписать все уже созданные для этого документы,чтобы смочь их вытянуть запросом -  не говноподход, а мой вариант сразу фи.
Само собой, что по хорошему это нужно было сделать еще на этапе проектирования этой доработки с документами основания, но мы имеем что имеем.
47 ads55
 
06.09.21
15:30
(44) что было - сказал.
утверждение твое в (33) не понравилось. А так - без претензий.
48 banco
 
06.09.21
15:33
(0) Пробуй ОбщегоНазначения.ЗначенияРеквизитовОбъектов()
49 arsik
 
гуру
06.09.21
15:33
(45) А если оставить только документ, без всех полей?
50 ptiz
 
06.09.21
15:34
(45) Сравни профайлером запрос до и после выкидывания.
51 ads55
 
06.09.21
15:36
(44) кстати, посмотри (4) и (45)
52 acht
 
06.09.21
15:37
(45) > это же по сути гуид
Нет. Это два поля - поле типа и поле двоичных данных ссылки. Добрая 1С скрывает это от тебя, но иногда строит запрос весьма пикантным образом.
53 polosov
 
06.09.21
15:38
(51) Тупое ускорение, которое не может дать прироста.
У него в принципе запрос по одному документу, поэтому (42) хватит.
54 lodger
 
06.09.21
16:58
(33) держи ещё один план выполнения задачи:

берем ссылку и пишем первый запрос по ней:
выбрать
документ как Доку
типзначение(документ) как ТипДоку
из ...
где ...
итоги по ТипДоку

делаем выборку с итогами

Результат = Неопределено;
Пока ВыборкаТипов.Следующий() Цикл
Запрос = новый Запрос();
Запрос.Текст = ФункияСборкиЗапросаПоТипу(ВыборкаТипов.ТипДоку);
ПараметрЗапроса = новый СписокЗначений();
детальки = ВыборкаТипов.Выбрать();
пока детальки.Следующий() Цикл
ПараметрЗапроса.Добавить(детальки.Доку);
конеццикла;
Запрос.УстановитьПараметр("Доки",ПараметрЗапроса);

Если Результат = неопределено Тогда
Результат = Запрос.Выполнить().Выгрузить();
Иначе
Выборка = Запрос.Выполнить().Выбрать();
Пока выборка.Следующий() Цикл
заполнитьзначениесвойств(Результат.добавить(),выборка);
конеццикла;
конецесли;
конеццикла;
55 youalex
 
06.09.21
17:47
по идее еще можно ТЧ выгрузить в ТЗ ,создать там доп. колонку с ОписаниеТипов - из конкретных типов, и цепляться уже по ней.
Как-то так:


    Запрос.Текст = "ВЫБРАТЬ ТЧ.Документ КАК Документ,  ТипЗначения(ТЧ.Документ) КАК ТипОбъекта ИЗ ТЧ";
    РезультатЗапроса = Запрос.Выполнить();
    
    ТЗ = РезультатЗапроса.Выгрузить();
    ТЗ.Колонки.Добавить("Документ2", Новый ОписаниеТипов(ОбщегоНазначенияКлиентСервер.СвернутьМассив(ТЗ.ВыгрузитьКолонку("ТипОбъекта"))));
    ТЗ.ЗагрузитьКолонку(ТЗ.ВыгрузитьКолонку(0), "Документ2");    

    Запрос.Текст =
    "ВЫБРАТЬ вт.Документ2 поместить вт ИЗ &Таблица как вт; ВЫБРАТЬ вт.Документ2.Номер, Вт.Документ2.Дата ИЗ Вт вт ";
    Запрос.УстановитьПараметр("Таблица", ТЗ);
    Запрос.Выполнить();
56 osa1C
 
07.09.21
06:26
(51)  и ещё плюс (11)  :-)
57 rphosts
 
07.09.21
06:45
(0) Эээээ а если добавить в запрос ещё одно условие " И ТипЗначения(рткЗаявкаНаТранспортДокументыОснования.Ссылка) = ТипЗначения(&Ссылка)"  легче запросу не станет?
58 Мультук
 
гуру
07.09.21
07:28
(57) У запроса нет проблем с полем "ссылка". у него проблема  с полем "документ"
59 rphosts
 
07.09.21
07:45
(58) тогда таки типизация должна спасти отца русской демократии
60 Вафель
 
07.09.21
08:31
Если есть общий журнал какой то можно дату номер оттуда брать
61 ИУБиПовиц
 
07.09.21
09:37
Можно попробовать запросом во временную таблицу положить ТипЗначения(Документ)
А в запросе выборке
1. Соединиться со  временной таблицей левой
2. Через объединить перечислить все типы документов где документ ССЫЛКА док1 объединить где документ  ССЫЛКа док2.  (ну и док, док.номер, дата обернуть в выразить)
хз может будет побыстрее.
т.е. через ссылку и выразить мы типизируем а связью по типам отсекаем ненужные соединения
62 lodger
 
07.09.21
10:14
(61) делать такого кадавра в запросе выйдет дороже по ресурсам и километрам кода, чем просто запросить 2 раза.
можно замоддить (54) на постройку запроса с объединением для второй итерации.
получится один запрос к ТЧ и типизации, второй запрос уже к конкретным таблицам с конкретными типами и ссылками. писать - одна страница кода. выполнятся будет - молниеносно, по сравнению с соединениями всех таблиц документов.
63 Малыш Джон
 
07.09.21
10:15
(0) 90% - это, конечно, хорошо, а сколько раз он вызывается? а то может у тебя эта функция в цикле крутится
64 Малыш Джон
 
07.09.21
10:18
(62) а хз, сколько там типов документов по факту используется. А то может только 2-3 типа и есть в таблице. Тогда не кадавр, а вполне себе милый запросик получается.
65 lodger
 
07.09.21
10:25
(64) завтра приделают ещё один документ к этому делу.
через неделю ещё.
в следующем году по закону обяжут сделать к каждому документу зеркальный.
кадавр с каждой итерацией будет расти и тяжелеть в чтении, редактуре и исполнении, а самогенерирующийся код не устаревает, как Буханка, работает надежно, как АК, и быстро, как МиГ.
66 Малыш Джон
 
07.09.21
10:32
(65) генерирующийся на ходу текст запроса весьма хренов в отладке (привет от ЗУП 3).
А раз в неделю документы не приделывают. Если несколько лет использовался только 2-3 вида документа - это значит схема отлажена и менять её на ходу не будут, а если будут, то изменить конкретно этот запрос  - это вот прям самая небольшая проблема будет.
Это же не регучет, это оперативный учет, внутренний для компании.
67 lodger
 
07.09.21
10:41
(66) ты точно (0) читал? там именно внутренний упр учёт, который сегодня так, завтра директору жахнуло в голову сяк, а после отпуска он проспался и переиначил як.
когда есть ресурсы на перестройку цифровых бизнес процессов на лету - их перестраивают на лету.
68 Ботаник Гарден Меран
 
07.09.21
10:46
В типовых для таких случаев есть регистр сведений ДанныеПервичныхДокументов
69 Малыш Джон
 
07.09.21
10:49
(67) читал. ТС немного неверно оценивает ситуацию. Если там МОГУТ БЫТЬ все типы документов, это не значит, что там ЕСТЬ все типы документов.

>>там именно внутренний упр учёт

ну, во-первых, не управленческий, а оперативный; во-вторых, я так и написал: внутренний оперативный учет.

>>который сегодня так, завтра директору жахнуло в голову сяк, а после отпуска он проспался и переиначил як.

Все может быть. Я не говорю, что этого быть не может. Я говорю, что это комплексный процесс, который затрагивает не только конкретно этот запрос. И на фоне общих затрат на добавление нового типа документа, ресурсы на изменение конкретно этого запроса - это очень и очень немного. Хоть каждый раз по-новому его переделывай.
70 2mugik
 
07.09.21
10:59
(0)Тоже кстати удивлялся что данных нет, а 100500 таблиц пустых время прямо капитально увеличивают. везде выразить теперь.