1. user1202776 26.03.20 13:38 Сейчас в теме

Оптимизация запроса

Как максимально оптимизировать этот запрос,чтобы быстрее работал?В СКД формируется запрос и этот запрос выгружается в xlsx файл.
Формируется свыше 50 тыс. строк.
ВЫБРАТЬ
	ВозвратТоваровОтПокупателяДокументыРасчетовСКонтрагентом.ДокументРасчетовСКонтрагентом КАК Реализация,
	ВозвратТоваровОтПокупателяДокументыРасчетовСКонтрагентом.Ссылка КАК ДокументВозврата,
	ВозвратТоваровОтПокупателяДокументыРасчетовСКонтрагентом.ДокументРасчетовСКонтрагентом.Сделка КАК Заказ
ПОМЕСТИТЬ Возвраты
ИЗ
	Документ.ВозвратТоваровОтПокупателя.ДокументыРасчетовСКонтрагентом КАК ВозвратТоваровОтПокупателяДокументыРасчетовСКонтрагентом
ГДЕ
	ВозвратТоваровОтПокупателяДокументыРасчетовСКонтрагентом.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
	И ВозвратТоваровОтПокупателяДокументыРасчетовСКонтрагентом.Ссылка.Проведен = ИСТИНА

ИНДЕКСИРОВАТЬ ПО
	Заказ
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ЗаказыОстатки.Ссылка КАК Ссылка,
	ЗаказыОстатки.Номенклатура КАК Номенклатура,
	ЗаказыОстатки.Количество,
	ЗаказыОстатки.КоличествоОтгружено,
	ЗаказыОстатки.Размещение КАК Склад,
	ОстаткиИОбороты.КоличествоКонечныйОстаток КАК ОстатокНаСкладе,
	ЕСТЬNULL(Возвраты.ДокументВозврата, ЗНАЧЕНИЕ(Документ.ВозвратТоваровОтПокупателя.ПустаяСсылка)) КАК Возврат
ПОМЕСТИТЬ ЗаказыСОстатками
ИЗ
	(ВЫБРАТЬ
		Заказы.Ссылка КАК Ссылка,
		Заказы.Номенклатура КАК Номенклатура,
		Заказы.Количество КАК Количество,
		Заказы.КоличествоОтгружено КАК КоличествоОтгружено,
		МАКСИМУМ(Остатки.Период) КАК ПериодОст,
		Заказы.Размещение КАК Размещение
	ИЗ
		Документ.ЗаказПокупателя.Товары КАК Заказы
			ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(, , Секунда, ДвиженияИГраницыПериода, ) КАК Остатки
			ПО Заказы.Номенклатура = Остатки.Номенклатура
				И Заказы.Размещение = Остатки.Склад
				И Заказы.Ссылка.Дата >= Остатки.Период
	
	СГРУППИРОВАТЬ ПО
		Заказы.Ссылка,
		Заказы.Количество,
		Заказы.КоличествоОтгружено,
		Заказы.Номенклатура,
		Заказы.Размещение) КАК ЗаказыОстатки
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(, , Секунда, ДвиженияИГраницыПериода, ) КАК ОстаткиИОбороты
		ПО ЗаказыОстатки.Номенклатура = ОстаткиИОбороты.Номенклатура
			И ЗаказыОстатки.Размещение = ОстаткиИОбороты.Склад
			И ЗаказыОстатки.ПериодОст = ОстаткиИОбороты.Период
		ЛЕВОЕ СОЕДИНЕНИЕ Возвраты КАК Возвраты
		ПО ЗаказыОстатки.Ссылка = Возвраты.Заказ
ГДЕ
	ЗаказыОстатки.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода
	И ЗаказыОстатки.Ссылка.Проведен = ИСТИНА

ИНДЕКСИРОВАТЬ ПО
	Номенклатура,
	Ссылка
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ПРЕДСТАВЛЕНИЕССЫЛКИ(ЗаказыСОстатками.Ссылка) КАК Заказ,
	ПРЕДСТАВЛЕНИЕССЫЛКИ(ЗаказыСОстатками.Номенклатура) КАК Номенклатура,
	ЗаказыСОстатками.Количество КАК КоличествоПослеКК,
	"В заказе" КАК Состояние,
	ЕСТЬNULL(ЛогРедактированияДокументов.Было, ЗаказыСОстатками.Количество) КАК КоличествоДО,
	ЗаказыСОстатками.КоличествоОтгружено,
	ЕСТЬNULL(ЛогРедактированияДокументов.Остаток - ЛогРедактированияДокументов.Резерв, ЗаказыСОстатками.ОстатокНаСкладе) КАК ОстатокНаСкладе,
	ЕСТЬNULL(ВозвратТоваровОтПокупателяТовары.Количество, 0) КАК КоличествоВозврата,
	ПРЕДСТАВЛЕНИЕССЫЛКИ(ЗаказыСОстатками.Ссылка.Подразделение) КАК ПодразделениеДляОтбора
ИЗ
	ЗаказыСОстатками КАК ЗаказыСОстатками
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЛогРедактированияДокументов КАК ЛогРедактированияДокументов
		ПО ЗаказыСОстатками.Номенклатура = ЛогРедактированияДокументов.Товар
			И ЗаказыСОстатками.Ссылка = ЛогРедактированияДокументов.Документ
		ЛЕВОЕ СОЕДИНЕНИЕ Документ.ВозвратТоваровОтПокупателя.Товары КАК ВозвратТоваровОтПокупателяТовары
		ПО ЗаказыСОстатками.Возврат = ВозвратТоваровОтПокупателяТовары.Ссылка
			И ЗаказыСОстатками.Номенклатура = ВозвратТоваровОтПокупателяТовары.Номенклатура
ГДЕ
	ЗаказыСОстатками.Ссылка.Проведен = ИСТИНА

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	ПРЕДСТАВЛЕНИЕССЫЛКИ(ЛогРедактированияДокументов.Документ),
	ПРЕДСТАВЛЕНИЕССЫЛКИ(ЛогРедактированияДокументов.Товар),
	0,
	"Урезано",
	ЛогРедактированияДокументов.Было,
	0,
	ЛогРедактированияДокументов.Остаток - ЛогРедактированияДокументов.Резерв,
	0,
	ПРЕДСТАВЛЕНИЕССЫЛКИ(ЛогРедактированияДокументов.Документ.Подразделение)
ИЗ
	РегистрСведений.ЛогРедактированияДокументов КАК ЛогРедактированияДокументов
ГДЕ
	ЛогРедактированияДокументов.Стало = 0
	И ЛогРедактированияДокументов.Документ.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
	И ЛогРедактированияДокументов.Документ.Проведен = ИСТИНА
	И ТИПЗНАЧЕНИЯ(ЛогРедактированияДокументов.Документ) = ТИП(Документ.ЗаказПокупателя)
Показать
Ответы
Избранное Подписка Сортировка: Древо развёрнутое
Свернуть все
2. alex-l19041 8 26.03.20 13:49 Сейчас в теме
сделайте замер... может на выборку данных расходуется меньше времени чем на формирование xlsx
(сомневаюсь что на таком количестве строк можно что-то ускорить... )
3. user1202776 26.03.20 13:55 Сейчас в теме
(2)если просто долго формировался было бы нормально.Отчет берет с начала месяца и после 24 числа выводит стал выводить ошибку "На сервере недостаточно памяти для выполнения задания.". Выполняется через рег. задание. Судя по тому,когда выдает ошибку, отчет норм формируется, но не получается выгрузить в xlsx.
До 24 числа у 1С получалось отправлять отчет, потому что было меньше строк
4. nomad_irk 48 26.03.20 13:57 Сейчас в теме
1. Не брать данные из документов, а использовать регистры накопления, по возможности их виртуальные таблицы.
2. не использовать вложенные запросы вообще. вместо них использовать пакеты запросов.
3. Конструкция

ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(, , Секунда, ДвиженияИГраницыПериода, ) КАК Остатки
ПО Заказы.Номенклатура = Остатки.Номенклатура
И Заказы.Размещение = Остатки.Склад
И Заказы.Ссылка.Дата >= Остатки.Период

Лично для меня вообще находится за гранью понимания.....
HAMAZ; Fox-trot; +2 Ответить
5. HAMAZ 8 26.03.20 15:41 Сейчас в теме
В консоле запросов выполните запрос - отобразится время выполнения запроса. (4) дал уже вектор приложения усилий. Рекомендации по оптимизации запрос есть в открытом доступе: Рекомендации по оптимизации запросов
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Программист, аналитик, эксперт 1С
Санкт-Петербург
По совместительству

Программист 1С
Новосибирск
зарплата от 30 000 руб.
Временный (на проект)

Программист 1С
Москва
зарплата от 100 000 руб. до 150 000 руб.
Полный день

Автор новостных обзоров на тему 1С и бухучета
Санкт-Петербург
По совместительству

Специалист внедрения и сопровождения 1С
Москва
зарплата от 80 000 руб.
Полный день