|
|
|
Оптимизация запроса | ☑ | ||
|---|---|---|---|---|
|
0
Хрусталев
04.03.25
✎
12:56
|
Здравствуйте, помогите с оптимизацией запроса, пожалуйста, кому не лень
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПоступлениеДопРасходов.Содержание КАК Содержание,
| ПоступлениеДопРасходов.Номенклатура КАК Номенклатура,
| СУММА(ПоступлениеДопРасходов.Сумма) КАК Сумма,
| МАКСИМУМ(ЗаказПоставщикуОтгруженный.Количество) КАК Количество,
| ПоступлениеДопРасходов.Валюта КАК Валюта,
| ПоступлениеДопРасходов.Курс КАК Курс,
| ПоступлениеДопРасходов.Контрагент КАК Контрагент,
| ПоступлениеДопРасходов.ДоговорВзаиморасчетов КАК Договор
|ИЗ
| (ВЫБРАТЬ
| ""ГТД: Таможенная пошлина"" КАК Содержание,
| ГТДИмпортТовары.Номенклатура КАК Номенклатура,
| ГТДИмпортТовары.Количество КАК Количество,
| ГТДИмпортТовары.СуммаПошлины КАК Сумма,
| ГТДИмпортТовары.Ссылка.ДоговорВзаиморасчетов.ВалютаВзаиморасчетов КАК Валюта,
| ГТДИмпортТовары.Ссылка.КурсВзаиморасчетов КАК Курс,
| ГТДИмпортТовары.Ссылка.Контрагент КАК Контрагент,
| ГТДИмпортТовары.Ссылка.ДоговорВзаиморасчетов КАК ДоговорВзаиморасчетов
| ИЗ
| Документ.ГТДИмпорт.Товары КАК ГТДИмпортТовары
| ГДЕ
| ГТДИмпортТовары.Ссылка.ДокументОснование = &Основание
| И ГТДИмпортТовары.Ссылка.Проведен
| И ГТДИмпортТовары.Номенклатура В(&МассивНоменклатуры)
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| ""ГТД: НДС"",
| ГТДИмпортТовары.Номенклатура,
| ГТДИмпортТовары.Количество,
| ГТДИмпортТовары.СуммаНДС,
| ГТДИмпортТовары.Ссылка.ДоговорВзаиморасчетов.ВалютаВзаиморасчетов,
| ГТДИмпортТовары.Ссылка.КурсВзаиморасчетов,
| ГТДИмпортТовары.Ссылка.Контрагент,
| ГТДИмпортТовары.Ссылка.ДоговорВзаиморасчетов
| ИЗ
| Документ.ГТДИмпорт.Товары КАК ГТДИмпортТовары
| ГДЕ
| ГТДИмпортТовары.Ссылка.ДокументОснование = &Основание
| И ГТДИмпортТовары.Ссылка.Проведен
| И ГТДИмпортТовары.Номенклатура В(&МассивНоменклатуры)
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| ""ГТД: Таможенный сбор"",
| ГТДИмпортТовары.Номенклатура,
| ГТДИмпортТовары.Количество,
| ГТДИмпортТовары.СуммаТаможня,
| ГТДИмпортТовары.Ссылка.ДоговорВзаиморасчетов.ВалютаВзаиморасчетов,
| ГТДИмпортТовары.Ссылка.КурсВзаиморасчетов,
| ГТДИмпортТовары.Ссылка.Контрагент,
| ГТДИмпортТовары.Ссылка.ДоговорВзаиморасчетов
| ИЗ
| Документ.ГТДИмпорт.Товары КАК ГТДИмпортТовары
| ГДЕ
| ГТДИмпортТовары.Ссылка.ДокументОснование = &Основание
| И ГТДИмпортТовары.Ссылка.Проведен
| И ГТДИмпортТовары.Номенклатура В(&МассивНоменклатуры)
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| ""ДР: "" + ПоступлениеДопРасходовИмпортТовары.Ссылка.Содержание,
| ПоступлениеДопРасходовИмпортТовары.Номенклатура,
| ПоступлениеДопРасходовИмпортТовары.Количество,
| ПоступлениеДопРасходовИмпортТовары.Сумма,
| ПоступлениеДопРасходовИмпортТовары.Ссылка.ВалютаДокумента,
| ПоступлениеДопРасходовИмпортТовары.Ссылка.КурсДокумента,
| ПоступлениеДопРасходовИмпортТовары.Ссылка.Контрагент,
| ПоступлениеДопРасходовИмпортТовары.Ссылка.ДоговорВзаиморасчетов
| ИЗ
| Документ.ПоступлениеДопРасходовИмпорт.Товары КАК ПоступлениеДопРасходовИмпортТовары
| ГДЕ
| ПоступлениеДопРасходовИмпортТовары.Ссылка.ДокументОснование = &Основание
| И ПоступлениеДопРасходовИмпортТовары.Ссылка.Проведен
| И ПоступлениеДопРасходовИмпортТовары.Номенклатура В(&МассивНоменклатуры)) КАК ПоступлениеДопРасходов
| ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
| ЗаказПоставщикуОтгруженныйТовары.Номенклатура КАК Номенклатура,
| СУММА(ЗаказПоставщикуОтгруженныйТовары.Количество) КАК Количество
| ИЗ
| Документ.ЗаказПоставщикуОтгруженный.Товары КАК ЗаказПоставщикуОтгруженныйТовары
| ГДЕ
| ЗаказПоставщикуОтгруженныйТовары.Ссылка = &Основание
|
| СГРУППИРОВАТЬ ПО
| ЗаказПоставщикуОтгруженныйТовары.Номенклатура) КАК ЗаказПоставщикуОтгруженный
| ПО ПоступлениеДопРасходов.Номенклатура = ЗаказПоставщикуОтгруженный.Номенклатура
|
|СГРУППИРОВАТЬ ПО
| ПоступлениеДопРасходов.Содержание,
| ПоступлениеДопРасходов.Номенклатура,
| ПоступлениеДопРасходов.Валюта,
| ПоступлениеДопРасходов.Курс,
| ПоступлениеДопРасходов.Контрагент,
| ПоступлениеДопРасходов.ДоговорВзаиморасчетов";
Запрос.УстановитьПараметр("Основание", ПоступлениеТоваровИмпорт.ДокументОснование);
Запрос.УстановитьПараметр("МассивНоменклатуры", ПоступлениеТоваровИмпорт.Товары.ВыгрузитьКолонку("Номенклатура"));
ТЗ_Товары = ПоступлениеТоваровИмпорт.Товары.Выгрузить();
ТЗ_Товары.Свернуть("Номенклатура", "Количество");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
НоваяСтрокаТЧ = ДопРасходыИмпортДокументы.Добавить();
НоваяСтрокаТЧ.Содержание = Выборка.Содержание;
НоваяСтрокаТЧ.Контрагент = Выборка.Контрагент;
НоваяСтрокаТЧ.Договор = Выборка.Договор;
НоваяСтрокаТЧ.Валюта = Выборка.Валюта;
НоваяСтрокаТЧ.Курс = Выборка.Курс;
НоваяСтрокаТЧ.Часть = "ПОСЛЕ";
нс = ТЗ_Товары.Найти(Выборка.Номенклатура, "Номенклатура");
КолТовар = нс.Количество;
Если КолТовар = Выборка.Количество Тогда
НоваяСтрокаТЧ.Сумма = Выборка.Сумма;
Иначе
НоваяСтрокаТЧ.Сумма = Окр(Выборка.Сумма / Выборка.Количество * КолТовар, 2, 1);
КонецЕсли;
НоваяСтрокаТЧ.СуммаРуб = НоваяСтрокаТЧ.Сумма * НоваяСтрокаТЧ.Курс;
НоваяСтрокаТЧ.СуммаУпр = _обПересчет(НоваяСтрокаТЧ.Сумма, НоваяСтрокаТЧ.Валюта, НоваяСтрокаТЧ.Курс, Константы.ВалютаУправленческогоУчетаКомпании.Получить(), ?(ЗначениеЗаполнено(ПоступлениеТоваровИмпорт.Дата), ПоступлениеТоваровИмпорт.Дата, ТекущаяДата()));
КонецЦикла;
ДопРасходыИмпортДокументы.Свернуть("Содержание,Контрагент,Договор,Валюта,Курс,Часть", "Сумма,СуммаРуб,СуммаУпр");
ДопРасходыИмпортДокументы.Сортировать("Содержание,Часть"); |
|||
|
1
Волшебник
04.03.25
✎
12:56
|
Меня всё устраивает
|
|||
|
2
Мультук
гуру
04.03.25
✎
13:02
|
(1)
+1 1) Если "взрослые" придираются, то можно вынести подзапросы во временные таблицы, но так как строк там "кот наплакал", толку особо не будет. 2) Данные которые выбираются в "ОБЪЕДИНИТЬ ВСЕ" можно заранее выбрать в ВТ, а затем выбирать из неё. Но это всё "бантики". Поэтому вопрос -- а ради чего оптимизация ? Нет индекса по полю "ДокументОснование" ? ГТДИмпортТовары.Ссылка.ДокументОснование = &Основание |
|||
|
3
Garykom
гуру
04.03.25
✎
13:05
|
(0) использовать ВТ
и добавить сразу в запрос код обработки который после запроса |
|||
|
4
Гипервизор
04.03.25
✎
13:19
|
С такой фамилией и про запросы спрашивать..
https://v8.1c.ru/metod/books/193205.htm |
|||
|
5
lucky_
04.03.25
✎
13:31
|
Константу в цикле получаешь, дату в цикле получаешь, текдату в цикле получаешь.
это первое, от чего кровь брызгает. по запросу согласен с (3) |
|||
|
6
oleg_km
04.03.25
✎
14:49
|
А что не устраивает? Если просто долго и хочется понять где, то есть эмпирический способ: пошагово добавляешь в запрос подзапросы, на котором споткнулся, тот и начинаешь оптимизировать. А так оптимизировать сферического коня можно долго
|
|||
|
7
TormozIT
гуру
04.03.25
✎
15:29
|
(4) Возможно это не он. Пол то не совпадает.
|
|||
|
8
Галахад
гуру
04.03.25
✎
15:14
|
Ну например, для чего первые три таблицы подзапроса, когда данные можно получить одной?
Зачем таблица ЗаполнитьНаОснованииАвизоИсходящее? |
|||
|
9
ILM
гуру
05.03.25
✎
07:04
|
1. Включить Справочник.ДоговорыКОнтаргентов в запрос, чтобы не получать "ВалютаВзаиморасчетов".
2. Сделать запрос таблицы содержания из 3-х строк и соединить его с запросом к таблице "Документ.ГТДИмпорт.Товары", чтобы 3 раза не обращаться к таблице 3. С параметрами бы ещё разобраться. Может стоит по основанию выбрать и отобрать то, что нужно. Думаю есть куда покопать в сторону улучшения. |
|||
|
10
SleepyHead
гуру
05.03.25
✎
07:17
|
(5) Плюс к этому проиндексировать таблицу значений по колонке "Номенклатура", поиск будет быстрее.
|
|||
|
11
lucky_
05.03.25
✎
08:26
|
(10) ох уж эти любители рисовать индексы, там где не надо)
|
|||
|
12
АнализДанных
05.03.25
✎
13:09
|
(0) Соединение с вложенной таблицей "ЗаказПоставщикуОтгруженный" сделать соединением с временной таблицей. Предварительно "ЗаказПоставщикуОтгруженный" положить во временную таблицу.
|
|||
|
13
mikecool
05.03.25
✎
13:31
|
(11) аргументируй
|
|||
|
14
mikecool
05.03.25
✎
13:32
|
(12) а это уже зависит от кол-ва строк в документе, может вырасти время за счет создания-индексирования ВТ
|
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |