Имя: Пароль:
1C
 
Оптимизация запроса
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) а это уже зависит от кол-ва строк в документе, может вырасти время за счет создания-индексирования ВТ