Почему тормозит запрос

1. Ann.prog1C 08.03.17 23:55 Сейчас в теме
Пытаюсь оптимизировать код. Самым тяжелым при проведении оказался этот запрос (контроль свободного остатка на складе):
Запрос.Текст =    "ВЫБРАТЬ
           |	РеализацияТоваровУслугТовары.Ссылка.Склад,
           |	РеализацияТоваровУслугТовары.Номенклатура,
	   |	СУММА(РеализацияТоваровУслугТовары.Количество * РеализацияТоваровУслугТовары.Коэффициент) КАК Необходимо,
	   |	СУММА(ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток) КАК ВРезерве,
           |	СУММА(ТоварыНаСкладахОстатки.КоличествоОстаток) КАК НаСкладе
           |ИЗ
           |	Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
           |		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(
           |				&ДатаДок,
           |				Склад = &Склад
           |					И Организация = &Организация) КАК ТоварыВРезервеНаСкладахОстатки
           |		ПО РеализацияТоваровУслугТовары.Номенклатура = ТоварыВРезервеНаСкладахОстатки.Номенклатура
           |		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(
           |				&ДатаДок,
           |				Склад = &Склад
           |					И Организация = &Организация) КАК ТоварыНаСкладахОстатки
           |		ПО РеализацияТоваровУслугТовары.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура
           |ГДЕ
           |	РеализацияТоваровУслугТовары.Ссылка = &Ссылка
           |
           |СГРУППИРОВАТЬ ПО
           |	РеализацияТоваровУслугТовары.Номенклатура,
           |	РеализацияТоваровУслугТовары.Ссылка.Склад,
           |	РеализацияТоваровУслугТовары.НомерСтроки
           |
           |ДЛЯ ИЗМЕНЕНИЯ";

Показать

Что здесь не так? Возможно из за блокировки для изменения?
По теме из базы знаний
Ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
7. ditp 91 10.03.17 10:09 Сейчас в теме
(1) попробуйте
ВЫБРАТЬ
	РеализацияТоваровУслугТовары.Номенклатура,
	СУММА(РеализацияТоваровУслугТовары.Количество * РеализацияТоваровУслугТовары.Коэффициент) КАК Необходимо,
	РеализацияТоваровУслугТовары.НомерСтроки
ПОМЕСТИТЬ тТовары
ИЗ
	Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ГДЕ
	РеализацияТоваровУслугТовары.Ссылка = &Ссылка

СГРУППИРОВАТЬ ПО
	РеализацияТоваровУслугТовары.Номенклатура,
	РеализацияТоваровУслугТовары.НомерСтроки
;

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

СГРУППИРОВАТЬ ПО
	тТовары.Номенклатура,
	тТовары.НомерСтроки,
	тТовары.Необходимо

УПОРЯДОЧИТЬ ПО
	НомерСтроки
Показать
Ann.prog1C; +1 Ответить
9. KazanKokos 10 10.03.17 10:14 Сейчас в теме
(7) вроде ускорить должно просто
 Левое соединение (Выбрать только нужные колонки.....) КАК 

У меня с ценами так было. С одним видом цен не тормозило сильно. А когда подцеплял еще раз регистр цен для другого вида цен то все тормозило. Сделал предварительный отбор только нужных колонок и полетело.
10. kolya_tlt 86 10.03.17 10:17 Сейчас в теме
(9) в поисках оптимизации производительности нельзя тупо перебирать все ранее примененные методы "потому что в прошлый раз помогло"
11. KazanKokos 10 10.03.17 10:19 Сейчас в теме
Напишите ваше сообщение
(10) ну здесь она же выбирает все колонки. А если выбирать только то что нужно(в данном случае сумму остатка по отбору) то должно помочь. имхо логично. Вон в (7) в итоге тоже самое делает что автор темы только через ВТ
8. kolya_tlt 86 10.03.17 10:13 Сейчас в теме
(1) странно что в РН Товары имеется организация.
(0) вам нужно передать максимальное количество полей (включая характеристику) в параметры виртуальной таблицы. ну а самое тяжелое в этом запросе 2 соединения, которые можно преобразовать в одно заменив их объединением
2. Vovan58 65 09.03.17 00:53 Сейчас в теме
Сначала временная таблица - выборка товаров из ТЧ,
за тем временные таблицы из Виртуальных с фильтрацией по Товарам из ТЧ
за тем - соединения. Обычно так делаю, так и на экзамене Спеца по платформе Гончаров требовал :)
PhoenixAOD; Ann.prog1C; +2 Ответить
3. user667308_icscloud 10.03.17 07:23 Сейчас в теме
(2) Плюс индексация временных таблиц
Vovan58; Ann.prog1C; +2 Ответить
13. Ann.prog1C 10.03.17 12:48 Сейчас в теме
Спасибо всем огромнейшее за обсуждение. Удалось сдвинуть этот запрос с почетного первого на четвертое место. Объективно на сколько ускорилось сказать не могу - на разных выборках тестировала.
Учла (2) и (3). и частично (12). Получилось так:
        "ВЫБРАТЬ
		                |	РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура,
		                |	СУММА(РеализацияТоваровУслугТовары.Количество * РеализацияТоваровУслугТовары.Коэффициент) КАК Необходимо
		                |ПОМЕСТИТЬ РН
		                |ИЗ
		                |	Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
		                |ГДЕ
		                |	РеализацияТоваровУслугТовары.Ссылка = &Ссылка
		                |
		                |СГРУППИРОВАТЬ ПО
		                |	РеализацияТоваровУслугТовары.Номенклатура,
		                |	РеализацияТоваровУслугТовары.НомерСтроки
		                |
		                |ИНДЕКСИРОВАТЬ ПО
		                |	Номенклатура
		                |;
		                |
		                |////////////////////////////////////////////////////////////­////////////////////
		                |ВЫБРАТЬ
		                |	ТоварыВРезервеНаСкладахОстатки.Номенклатура КАК Номенклатура,
		                |	СУММА(ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток) КАК ВРезерве
		                |ПОМЕСТИТЬ Зарезервировано
		                |ИЗ
		                |	РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(
		                |			&ДатаДок,
		                |			Склад = &Склад
		                |				И Организация = &Организация
		                |				И Номенклатура В
		                |					(ВЫБРАТЬ
		                |						РН.Номенклатура
		                |					ИЗ
		                |						РН КАК РН)) КАК ТоварыВРезервеНаСкладахОстатки
		                |
		                |СГРУППИРОВАТЬ ПО
		                |	ТоварыВРезервеНаСкладахОстатки.Номенклатура
		                |
		                |ИНДЕКСИРОВАТЬ ПО
		                |	Номенклатура
		                |;
		                |
		                |////////////////////////////////////////////////////////////­////////////////////
		                |ВЫБРАТЬ
		                |	ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
		                |	СУММА(ТоварыНаСкладахОстатки.КоличествоОстаток) КАК НаСкладе
		                |ПОМЕСТИТЬ ТоварыНаСкладе
		                |ИЗ
		                |	РегистрНакопления.ТоварыНаСкладах.Остатки(
		                |			&ДатаДок,
		                |			Склад = &Склад
		                |				И Организация = &Организация
		                |				И Номенклатура В
		                |					(ВЫБРАТЬ
		                |						РН.Номенклатура
		                |					ИЗ
		                |						РН КАК РН)) КАК ТоварыНаСкладахОстатки
		                |
		                |СГРУППИРОВАТЬ ПО
		                |	ТоварыНаСкладахОстатки.Склад,
		                |	ТоварыНаСкладахОстатки.Номенклатура
		                |
		                |ИНДЕКСИРОВАТЬ ПО
		                |	Номенклатура
		                |;
		                |
		                |////////////////////////////////////////////////////////////­////////////////////
		                |ВЫБРАТЬ
		                |	РН.Номенклатура,
		                |	РН.Необходимо КАК Необходимо,
		                |	Зарезервировано.ВРезерве КАК ВРезерве,
		                |	ТоварыНаСкладе.НаСкладе КАК НаСкладе
		                |ИЗ
		                |	РН КАК РН
		                |		ЛЕВОЕ СОЕДИНЕНИЕ Зарезервировано КАК Зарезервировано
		                |		ПО РН.Номенклатура = Зарезервировано.Номенклатура
		                |		ЛЕВОЕ СОЕДИНЕНИЕ ТоварыНаСкладе КАК ТоварыНаСкладе
		                |		ПО РН.Номенклатура = ТоварыНаСкладе.Номенклатура
		                |
		                |ДЛЯ ИЗМЕНЕНИЯ";			
Показать



(12), режим управления блокировками НЕ автоматический. Наверное действительно стоит задуматься над изменением технологии контроля остатков.

Всем огромнейшее спасибо за советы и обсуждение.
14. nickpugachev 10.03.17 19:01 Сейчас в теме
(13)
Наверное действительно стоит задуматься над изменением технологии контроля остатков

В случае управляемых блокировок у вас не действует ДЛЯ ИЗМЕНЕНИЯ в запросе. Блокировки не будет. Поэтому при такой схеме контроля остатков вам нужно ОБЯЗАТЕЛЬНО ставить управляемую блокировку на регистры накопления руками. В противном случае вы можете уйти в минус даже с этим контролем остатков.
4. qwer107 10.03.17 08:18 Сейчас в теме
|ДЛЯ ИЗМЕНЕНИЯ"; тормозит. Еще пару выразить Выразить (РеализацияТоваровУслугТовары.Ссылка.Склад как Справочник.Склады) в запрос добавить, но т.к это один документ то тормозит для изменения.
5. YanSergey 145 10.03.17 08:36 Сейчас в теме
(4)Что вы ерунду пишете. "ДЛЯ ИЗМЕНЕНИЯ" не может тормозить. Это флаг, накладывающий блокировку обновления.

(2)Владимир прав. Нельзя соединять реальные таблицы с виртуальными, а так же виртуальные с виртуальными. Нужно все помещать во временные таблицы.
"ДЛЯ ИЗМЕНЕНИЯ" также нужно доработать.
Нужно указывать только те таблицы, по которым в последующем будут делаться движения - что бы блокировались только они.
6. shnurov 10.03.17 10:06 Сейчас в теме
Скорее всего тормозят регистры, попробуйте загнать данные ТЧ документа в временную таблицу, а в отборе для регистров добавьте

номенклатура в (выбрать ВТЗ.номенклатура из ВТЗ сгруппировать по ВТЗ.Номенклатура), т.е. выберете только записи по нужной номенклатуре, а так он остатки по всей номенклатуре получает, а потом левое делает что долго.
12. nickpugachev 10.03.17 12:08 Сейчас в теме
1. Режим управления блокировкой данных - точно автоматический? Если да, то продолжаем, если нет - то зачем используется контроль остатков в таком виде? пишите движения и потом проверяйте остатки по регистрам, быстрее будет
2. Если режим управления блокировкой автоматический, то вам нужен обязательно отбор по номенклатуре в остатках регистров накопления, иначе вы установите излишнюю блокировку, которая может привести к ожиданиям либо у проводимого документа либо у тех кто будет что-то делать с регистром по тем же организации и складу
3. В зависимости от ожидаемого количества позиций в реализации - остатки во временные таблицы и соединяться уже с ними.
Ann.prog1C; +1 Ответить
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

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

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

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

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)