Тормозит ВыполнитьЗапрос по счёту, созданному в режиме "Предприятие"

1. GrafB 10 01.09.15 14:30 Сейчас в теме
Добрый день, не знаю как найти что-то похожее, поэтому создаю тему. Есть отчёт, который сравнивает остатки по 4 счетам. На двух счетах ("41" и "002")просто остатки товара, на третьем ("ПР") в разрезе производителей, на 4м ("СРО.КИ") в разрезе сроков годности с субконто производители.
Вообщем когда делаю сверку даже по одному товару, то происходит всё как-то долго, сделал замер почему-то ВыполнитьЗапрос(кондата,кондата,"ПР") занимает около 95% времени, в то время как две других строчки с ВыполнитьЗапрос занимают 0,10% или 0,20% времени.
Обратил внимание что счёт "СРО.КИ" сделан через конфигуратор, а счёт "ПР" был сделан не в конфигураторе, а в режиме "1С:предприятие", может от этого зависит? можно что-то сделать не потеряв обороты?
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. warlock 01.09.15 15:20 Сейчас в теме
А более подробно - состав и тип значений субконто счета "ПР"? Может на нём просто очень много незакрытых остатков?
4. Dnki 4 01.09.15 16:41 Сейчас в теме
(2) warlock, Насчет "висящих" остатков поддерживаю.
Могут быть висяки по Субконто, по валюте, по сумме валютной.
3. Dnki 4 01.09.15 16:39 Сейчас в теме
Уверенно скажу: от того, какой счет в Конфигураторе или руками внесенный, не зависит. У меня в Конф было создано только 2-3 счета.
Что попробуйте:
- в свойстве вида Субконто есть галочка "Отбор". Я не включал, но, по аналогии, это подключение индекса.
- В разделе "Журналы" пункт "Графы отбора". Я создал графу "Клиент" и вписал туда: реквизиты "Клиент" у документов. Измерение "Клиент" у регистра.
В Вашем случает это Товары.
В ходе эксперимента у убедился - ускоряет выборку в разы.
5. GrafB 10 01.09.15 17:05 Сейчас в теме
только сейчас добрался сюда, спасибо за ответы, да незакрытых остатков куча, но не закрываются они по третьему виду субконто "ДокументДвижения"(не знаю зачем его создавали).
при выполнении запроса я его не использую, смотрю только по 2м субконто, это значения не имеет?
6. warlock 01.09.15 17:25 Сейчас в теме
(5) GrafB, тут есть разница между просто "не использовать" (не обращать внимания) и исключить из запроса
Должно быть:
ИспользоватьСубконто()

по двум нужным субконто
7. GrafB 10 02.09.15 10:49 Сейчас в теме
(6) warlock, ну да, именно так у меня и есть:

Ит.ИспользоватьСубконто(ВидыСубконто.Номенклатура);
	Ит.ИспользоватьСубконто(ВидыСубконто.Производитель); 
	Ит.ВыполнитьЗапрос(КонДата,КонДата,"ПР",,,,,"К");


(3) чем поможет отбор, если я перебираю всех? почему счёт сроки не тупит, у которого тоже есть субконто без галки отбор ?
и ещё не понятно чем поможетграфы отбора в журнале и можно ли там использовать табличную часть документа? там вроде обычно графы шапки
8. warlock 02.09.15 11:06 Сейчас в теме
(7) GrafB, нужно разделять два случая:

1. Запрос по всем товарам, как в примере из (7). Такой запрос может выполняться долго просто из-за большого количества остатков. (Хорошо бы понимать количество разрезов остатков по Вашим счетам)

2.
когда делаю сверку даже по одному товару
вот тут уже вопрос - почему медленно. Как вариант, индекс мог бы помочь

А вообще, приведите код полностью. Тот факт, что счет создан в режиме предприятия, не должен влиять на производительность.
9. GrafB 10 02.09.15 12:09 Сейчас в теме
(8) warlock,

ТабСрок = СоздатьОбъект("ТаблицаЗначений");
	ТабСрок.НоваяКолонка("МПЗ");
	ТабСрок.НоваяКолонка("Производитель");
	ТабСрок.НоваяКолонка("Срок");
	ТабСрок.НоваяКолонка("ОстатокСрок"); 
	ТабСрок.НоваяКолонка("ДатаКон");  
	ТабСрок.НоваяКолонка("ДатаНач");
		
	Ит = СоздатьОбъект("БухгалтерскиеИтоги");   
	Если СписокТоваров.РазмерСписка()>0 Тогда 
		Ит.ИспользоватьСубконто(ВидыСубконто.Номенклатура,СписокТоваров);	
	Иначе
		Ит.ИспользоватьСубконто(ВидыСубконто.Номенклатура);
	КонецЕсли; 
	Ит.ИспользоватьСубконто(ВидыСубконто.Сроки); 
	Ит.ИспользоватьСубконто(ВидыСубконто.МестаХранения,ВыбСклад); 
	Ит.ВыполнитьЗапрос(КонДата,КонДата,"СРО.КИ",,,,,"К"); 
	
	 
	Ит.ВыбратьСубконто(ВидыСубконто.Номенклатура); 
	ИтКолВсего=0;
	Пока Ит.ПолучитьСубконто(ВидыСубконто.Номенклатура) = 1 Цикл    
		ТекМПЗ = Ит.Субконто(1);
		Ит.ВыбратьСубконто(ВидыСубконто.Сроки); 
		Пока Ит.ПолучитьСубконто(ВидыСубконто.Сроки) = 1 Цикл
			ТабСрок.НоваяСтрока();
			ТабСрок.МПЗ = ТекМПЗ;
			ТабСрок.Срок = Ит.Субконто(2);
			ТабСрок.Производитель = ТабСрок.Срок.Производитель;
			ТабСрок.ОстатокСрок=Ит.СКД("К")-Ит.СКК("К"); 
			ТабСрок.ДатаКон=Ит.Субконто(ВидыСубконто.Сроки).ДатаКонца;  
			ТабСрок.ДатаНач=Ит.Субконто(ВидыСубконто.Сроки).ДатаНачала;				
		КонецЦикла;
	КонецЦикла;
	
	ТабПроизв = СоздатьОбъект("ТаблицаЗначений");
	ТабПроизв.НоваяКолонка("МПЗ");
	ТабПроизв.НоваяКолонка("ИндексПоиска");
	ТабПроизв.НоваяКолонка("ОстатокПроизв");
		
	Если СписокТоваров.РазмерСписка()>0 Тогда 
		Ит.ИспользоватьСубконто(ВидыСубконто.Номенклатура,СписокТоваров);	
	Иначе
		Ит.ИспользоватьСубконто(ВидыСубконто.Номенклатура);
	КонецЕсли; 
	Ит.ИспользоватьСубконто(ВидыСубконто.Производитель); 
	Ит.ВыполнитьЗапрос(КонДата,КонДата,"ПР",,,,,"К"); 
	
	 
	Ит.ВыбратьСубконто(ВидыСубконто.Номенклатура); 
	ИтКолВсего=0;
	Пока Ит.ПолучитьСубконто(ВидыСубконто.Номенклатура) = 1 Цикл
		ТекМПЗ = Ит.Субконто(1);
		Ит.ВыбратьСубконто(ВидыСубконто.Производитель); 
		Пока Ит.ПолучитьСубконто(ВидыСубконто.Производитель) = 1 Цикл
			ТабПроизв.НоваяСтрока();
			ТабПроизв.МПЗ = ТекМПЗ;
			ТабПроизв.ИндексПоиска = "" + ТекМПЗ + Ит.Субконто(2);
			ТабПроизв.ОстатокПроизв = Ит.СКД("К")-Ит.СКК("К");			
		КонецЦикла;
	КонецЦикла;
	
	ТабПроизвИТНом = СоздатьОбъект("ТаблицаЗначений");// для хранения итогов по номенклатуре по счёту ПР

	ТабПроизв.Выгрузить(ТабПроизвИТНом,,,"МПЗ, ОстатокПроизв");
	ТабПроизвИТНом.Свернуть("МПЗ", "ОстатокПроизв");

	Таб41 = СоздатьОбъект("ТаблицаЗначений");
	Таб41.НоваяКолонка("МПЗ");
	Таб41.НоваяКолонка("ОстатокНом");
		
	Если СписокТоваров.РазмерСписка()>0 Тогда 
		Ит.ИспользоватьСубконто(ВидыСубконто.Номенклатура,СписокТоваров);	
	Иначе
		Ит.ИспользоватьСубконто(ВидыСубконто.Номенклатура);
	КонецЕсли; 
	Ит.ИспользоватьСубконто(ВидыСубконто.МестаХранения,ВыбСклад); 
	Ит.ВыполнитьЗапрос(КонДата,КонДата,"41,002.2",,,,,"К"); 
	
	 
	Ит.ВыбратьСубконто(ВидыСубконто.Номенклатура); 
	ИтКолВсего=0;
	Пока Ит.ПолучитьСубконто(ВидыСубконто.Номенклатура) = 1 Цикл
		Таб41.НоваяСтрока();
		Таб41.МПЗ = Ит.Субконто(1);
		ТекОст = 0;
		Ит.ВыбратьСчета();
		Пока Ит.ПолучитьСчет()=1 Цикл
			ТекОст = ТекОст + Ит.СКД("К")-Ит.СКК("К");
		КонецЦикла;
		Таб41.ОстатокНом = ТекОст;
	КонецЦикла;
Показать


без отборки получаю вот что в замере:

Ит.ВыполнитьЗапрос(КонДата,КонДата,"ПР",,,,,"К");	1	24.097960	74.76
Ит.ВыполнитьЗапрос(КонДата,КонДата,"СРО.КИ",,,,,"К");	1	5.413555	16.80
Ит.ВыполнитьЗапрос(КонДата,КонДата,"41,002.2",,,,,"К");	1	1.331659	4.13
10. GrafB 10 02.09.15 12:11 Сейчас в теме
на один и тот же срок не может быть несколько производителей, но можеть быть много сроков по одному производителю, вот и не пойму почему так долго запрашиваются производители, наверно всётаки виною третье субконто...
11. warlock 02.09.15 14:53 Сейчас в теме
(10) GrafB, а если добавить
Ит = СоздатьОбъект("БухгалтерскиеИтоги"); 

для каждого запроса? У вас используется один и тот же объект Ит во всех запросах. И к нему одному применены все ИспользоватьСубконто
12. GrafB 10 02.09.15 15:20 Сейчас в теме
(11) warlock, не думаю, иначе он бы ругался когда я второй раз применял одно и то же субконто "Номенклатура".

попробовал просто ОСВ по счёту замерить, тоже третье субконто отключил
замер для "СРО.КИ":
Если Ит.ВыполнитьЗапрос(Дата1, Дата2, Счет) = 0 Тогда	1	2.425104	36.67


замер для "ПР":
Если Ит.ВыполнитьЗапрос(Дата1, Дата2, Счет) = 0 Тогда	1	22.789747	92.56


в 10 раз дольше...
13. warlock 02.09.15 16:55 Сейчас в теме
(12) GrafB, а количество строк, которое возвращает ОСВ, тоже в 10 раз больше?

PS база на SQL?
PPS ПР - это, случайно, не группа счетов?
15. GrafB 10 03.09.15 09:56 Сейчас в теме
(13) warlock, возвращается как раз наоборот по "СРО.КИ" больше строк, именно в отчёте осв: 1800 по "ПР" и 2400 по "СРО.КИ".
база dbf
"ПР" не группа

(14) Dnki, я всё ещё не согласен с вами. запроса 3, а тормозит только второй. плюс я уже написал что проверил на ОСВ. а ещё вот попробовал просто подряд написать использоватьсубконто():

Ит.ИспользоватьСубконто(ВидыСубконто.Номенклатура);
{УДАЛИТЬ.ERT(6)}: Повторное использование вида субконто "Номенклатура" в запросе!
14. Dnki 4 02.09.15 20:47 Сейчас в теме
(11) warlock писал: "У вас используется один и тот же объект Ит во всех запросах".

Точно! А я бегло не заметил. Надо обнулять ИТ перед каждым запросом.
К моменту выполнения по "ПР" к запросу применились все указанные ранее Субконто:
Ит.ИспользоватьСубконто(ВидыСубконто.Сроки); 
    Ит.ИспользоватьСубконто(ВидыСубконто.МестаХранения,ВыбСклад); 

а нужны только
Ит.ИспользоватьСубконто(ВидыСубконто.Номенклатура);
    Ит.ИспользоватьСубконто(ВидыСубконто.Производитель); 

я даже не знаю как повлияет повторное (2 раза).
 Ит.ИспользоватьСубконто(ВидыСубконто.Номенклатура);

А вдруг делает 2 вложенных цикла по товарам?
Но дефекта в запросе Вы не видите, т.к. программа говорит запросу: мне плевать сколько субкантов ты там навертела, дай мне цикл только по "ВидыСубконто.Производитель".
Кстати, Ит.ПолучитьСубконто(ВидыСубконто.Номенклатура) можно написать и так
Ит.ПолучитьСубконто(). Тогда сразу будут видна истинная вложенность данных.

Короче, проверьте.

Второе: во всех запросах стоят 2 даты: ВыполнитьЗапрос(КонДата,КонДата)
А данные берете только на конец. Наличие первой даты теоретически снижает (на малых не видно, и когда дата не конец месяца). Надо или:
ВыполнитьЗапрос(,КонДата)
или
ВыполнитьЗапрос(НачМесяца(КонДата),КонДата)

Третье: если в ОСВ Вы выбрали только нужные субконто и оно тормозит, то нефиг дергаться - просто много данных. Может мусорных (некорректно закрытых)
16. GrafB 10 03.09.15 10:00 Сейчас в теме
(14) Dnki,
Третье: если в ОСВ Вы выбрали только нужные субконто и оно тормозит, то нефиг дергаться - просто много данных. Может мусорных (некорректно закрытых)


вот это всё же основная проблема я думаю и не смотря на то что я не обращаюсь к третьему субконто объём то больше из которого выбирается, надо скорей всего почикать это субконто, сейчас я даже не могу точно понять зачем оно было добавлено.
17. GrafB 10 03.09.15 11:19 Сейчас в теме
(16), да так и есть. удалил на копии третье субконто, производительность скорость сразу возросла:

Ит.ВыполнитьЗапрос(КонДата,КонДата,"СРО.КИ",,,,,"К");	1	0.776550	21.55
Ит.ВыполнитьЗапрос(КонДата,КонДата,"41,002.2",,,,,"К");	1	0.727047	20.18
Ит.ВыполнитьЗапрос(КонДата,КонДата,"ПР",,,,,"К");	1	0.673886	18.70


теперь надо искать хвосты этого субконто и целесообразность его использования.
18. warlock 03.09.15 12:17 Сейчас в теме
Кстати, в такой ситуации построение индекса может ускорить выборку без удаления третьего субконто. Поэтому все-таки поставьте галочку "Отбор" на видах субконто "Номенклатура" и "Производитель"
19. GrafB 10 04.09.15 12:20 Сейчас в теме
(18) warlock, ставил, без изменений
20. Vortigaunt 99 04.11.15 18:02 Сейчас в теме
По поводу падения производительности. Есть такой нюанс: если Порядок вызовов метода ИспользоватьСубконто() отличен от порядка субконто в самом счете, то производительность будет падать.
Например первое субконто в счете СРО.КИ - срок, а второе номенклатура. Тогда запрос выполнится гораздо быстрее если верхняя группировка будет Срок, нижняя - Номенклатура, чем наоборот.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот