Оптимизация отображения остатков номенклатуры в форме списка

1. wmonref1 03.02.19 22:20 Сейчас в теме
Приветсвую!

Платформа 8.3.8.1502, обычные формы, база на SQL сервере.
В форме списка Номенклатуры выводятся остатки по 4-м складам.
Процедура для вывода остатков вроде стандартная:

Процедура СправочникСписокПриПолученииДанных(Элемент, ОформленияСтрок)
	

		МассивНоменклатуры = Новый Массив;
		Соответствие = Новый Соответствие;
		
		Для Каждого  Строка Из ОформленияСтрок Цикл
			МассивНоменклатуры.Добавить(Строка.ДанныеСтроки.Ссылка);
			Соответствие.Вставить(Строка.ДанныеСтроки.Ссылка,Строка);
		КонецЦикла;
		
		Запрос = Новый Запрос(
		"ВЫБРАТЬ
		|		ХозрасчетныйОстатки.Субконто1 КАК Товар,
		|		СУММА(ВЫБОР КОГДА ХозрасчетныйОстатки.Субконто2 = &Склад      ТОГДА
		|			ХозрасчетныйОстатки.КоличествоОстатокДт 
		|		КОНЕЦ) КАК Остаток,
		|		СУММА(ВЫБОР КОГДА Субконто2 = &Склад2 ТОГДА
		|			ХозрасчетныйОстатки.КоличествоОстатокДт 
		|		КОНЕЦ) КАК Остаток2,
		|		СУММА(ВЫБОР КОГДА Субконто2 = &Склад3 ТОГДА
		|			ХозрасчетныйОстатки.КоличествоОстатокДт 
		|		КОНЕЦ) КАК Остаток3,
		|		СУММА(ВЫБОР КОГДА Субконто2 = &Склад4 ТОГДА
		|			ХозрасчетныйОстатки.КоличествоОстатокДт 
		|		КОНЕЦ) КАК Остаток4  
		|ИЗ
		|	РегистрБухгалтерии.Хозрасчетный.Остатки(
		|&ДатаОстатка, 
		|Счет В (&СписокСчетов),
		|,
		|"+?(ЗначениеНеЗаполнено(МассивНоменклатуры)," "," Субконто1 В(&Субконто1) И ")+" Субконто2 В (&Склады)
		| ) КАК ХозрасчетныйОстатки
		| СГРУППИРОВАТЬ ПО ХозрасчетныйОстатки.Субконто1 " );
	
		
		Запрос.УстановитьПараметр("ДатаОстатка",КонецДня(ДатаОстатка));
		СпСчетов = Новый СписокЗначений;
		СпСчетов.Добавить(ПланыСчетов.Хозрасчетный._216_1); 
		СпСчетов.Добавить(ПланыСчетов.Хозрасчетный._217_1); 
		СпСчетов.Добавить(ПланыСчетов.Хозрасчетный._217_2); 
		
		Запрос.УстановитьПараметр("СписокСчетов",СпСчетов);
		
		ЕСли ЗначениеЗаполнено(МассивНоменклатуры) Тогда
			Запрос.УстановитьПараметр("Субконто1",МассивНоменклатуры);
		КонецЕсли;
		
		Склады= Новый СписокЗначений;
		Склады.Добавить(Справочники.МестаХранения.НайтиПоКоду("1"));
		Склады.Добавить(Справочники.МестаХранения.НайтиПоКоду("32"));
		Склады.Добавить(Справочники.МестаХранения.НайтиПоКоду("34"));
		Склады.Добавить(Справочники.МестаХранения.НайтиПоКоду("35"));
		
		Запрос.УстановитьПараметр("Склады",Склады);
		Запрос.УстановитьПараметр("Склад",Справочники.МестаХранения.НайтиПоКоду("1"));
		Запрос.УстановитьПараметр("Склад2",Справочники.МестаХранения.НайтиПоКоду("32"));
		Запрос.УстановитьПараметр("Склад3",Справочники.МестаХранения.НайтиПоКоду("34"));
		Запрос.УстановитьПараметр("Склад4",Справочники.МестаХранения.НайтиПоКоду("35"));
		
		Выборка = Запрос.Выполнить().Выбрать();
		Пока Выборка.Следующий() Цикл
			Соответствие.Получить(Выборка.Товар.Ссылка).Ячейки.Остаток.Значение  = Выборка.Остаток;
			Соответствие.Получить(Выборка.Товар.Ссылка).Ячейки.Остаток2.Значение = Выборка.Остаток2;
			Соответствие.Получить(Выборка.Товар.Ссылка).Ячейки.Остаток3.Значение = Выборка.Остаток3;
			Соответствие.Получить(Выборка.Товар.Ссылка).Ячейки.Остаток4.Значение = Выборка.Остаток4;
		КонецЦикла;
КонецПроцедуры
Показать


Подскажите, пожалуйста, как оптимизировать этот вывод остатков, потому что список тормозит при скроллинге ?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
5. Xershi 1488 04.02.19 00:26 Сейчас в теме
(1) тут оптимизировать нечего. Либо убрать остатки.
Либо использовать другой механизм.
Например, при открытии формы делать запрос ко всей номенклатуре и выгружать в переменную ТЗ и вешать обработчик ожидания, который потом будет обновлять эту таблицу.
А запрос в этой процедуре заменить на запрос к ТЗ. Тормозить будет скорее всего когда обновляться ТЗ будет.
10. wmonref1 04.02.19 11:20 Сейчас в теме
(5)Да, это вариант. Но!
Получается что при каждом открытии списка будет жестокий тормоз на +-10 сек....
Что посоветуете?
11. Xershi 1488 04.02.19 11:48 Сейчас в теме
15. wmonref1 05.02.19 08:18 Сейчас в теме
(11) А по конкретней можно, пожалуйста? :)
17. Xershi 1488 05.02.19 10:36 Сейчас в теме
(15) сделать допустим 1 склад. Или обновлять по кнопке.
Тут уже от фантазии зависит.
12. oleg-x 27 04.02.19 12:06 Сейчас в теме
(10) Как вариант, сделайте форму списка на управляемых формах и сделайте динамический список. В динамическом запросе, сделайте запрос остатков.
Возможно придется включить возможность работать с УФ в свойствах конфигуратора.
13. wmonref1 04.02.19 20:16 Сейчас в теме
(12) Спасибо, но у меня обычные формы :/
16. oleg-x 27 05.02.19 09:19 Сейчас в теме
(13) У меня УТ 10.3 тоже на обычных формах, но при этом прекрасно работают УФ. Сделано несколько обработок и списки документов.
Открыть внешнюю обработку на УФ нельзя, но если УФ в самой конфигурации, то все прекрасно работает.
2. SedovSU@mail.ru 297 03.02.19 22:32 Сейчас в теме
Ну как почему - представьте что она постоянно вызывается при малейшем изменении списка. Использовать хоз расчётный для процедуры приполученииданных не есть оптимально. Выберите менее тяжёлый регистр
3. acanta 03.02.19 22:36 Сейчас в теме
Обработка ожидания на форме и таблица значений с остатками во временном хранилище значения, обновляемая на сервере фоновым заданием не поможет?
4. wmonref1 04.02.19 00:18 Сейчас в теме
(3)

Можете примерчик скинуть?
Спасибо
6. Dmitrij-2 45 04.02.19 06:44 Сейчас в теме
(3) Фоновое задание выполнять каждую минуту?
7. spe1c 5 04.02.19 09:17 Сейчас в теме
Одно и то же выполняете два раза подряд рядом: Справочники.МестаХранения.НайтиПоКоду(...
Это по сути отдельные запросы, можете попробовать вынести их в основной запрос (создать ВТ записей справочника с отбором по коду).
        Склады= Новый СписокЗначений;
        Склады.Добавить(Справочники.МестаХранения.НайтиПоКоду("1"));
        Склады.Добавить(Справочники.МестаХранения.НайтиПоКоду("32"));
        Склады.Добавить(Справочники.МестаХранения.НайтиПоКоду("34"));
        Склады.Добавить(Справочники.МестаХранения.НайтиПоКоду("35"));
        
        Запрос.УстановитьПараметр("Склады",Склады);
        Запрос.УстановитьПараметр("Склад",Справочники.МестаХранения.НайтиПоКоду("1"));
        Запрос.УстановитьПараметр("Склад2",Справочники.МестаХранения.НайтиПоКоду("32"));
        Запрос.УстановитьПараметр("Склад3",Справочники.МестаХранения.НайтиПоКоду("34"));
        Запрос.УстановитьПараметр("Склад4",Справочники.МестаХранения.НайтиПоКоду("35"));
Показать
8. spe1c 5 04.02.19 09:18 Сейчас в теме
Если остатки есть где то еще кроме регистра бухгалтерии, то лучше брать не из регистра бухгалтерии, т.к. запрос тяжелый, а регистр бухгалтерии плохо подходит для оперативного отображения остатков.
9. spe1c 5 04.02.19 09:21 Сейчас в теме
Если оставлять запрос к виртуальной таблице регистра бухгалтерии, то попробуйте убрать группировку по вычисляемым полям, у вас тяжелый запрос. Лучше сделайте объединение нескольких ВТ, каждая из которых - это остаток по какому-то определенному складу. Как написали выше, прикручивайте кэширование.
14. wmonref1 04.02.19 20:17 Сейчас в теме
(9)Спасибо, это вариант... Попробую
18. zarankony 305 05.02.19 13:01 Сейчас в теме
Есть вариант использовать событие ПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки) для строк есть метод Строки.ПолучитьКлючи() и можно обходить данные этих строк через Строки.Получить(Ключ).Данные , то есть Вы можете заполнить массив номенклатуры из новых строк с пустыми остатками и таким образом массив номенклатуры у Вас всегда будет и в остаках по хозрасчетному не будет лишнего. Не гарантирую что будет прирост, но попробовать стоит)
19. wmonref1 06.02.19 22:07 Сейчас в теме
Пока что решил следующим образом:
Запрос по остаткам пихаю в переменную ТЗНом при открытии формы, а потом в

Процедура СправочникСписокПриПолученииДанных(Элемент, ОформленияСтрок)

		Для Каждого ТекСтрока Из ОформленияСтрок Цикл
			ТекТовар = ТЗНом.Найти(ТекСтрока.ДанныеСтроки.Ссылка,"Товар");
			Если ТекТовар <> Неопределено Тогда 
				ТекСтрока.Ячейки.Остаток.Значение = ТекТовар.Остаток;
				ТекСтрока.Ячейки.Остаток2.Значение = ТекТовар.Остаток2;
				ТекСтрока.Ячейки.Остаток3.Значение = ТекТовар.Остаток3;
				ТекСтрока.Ячейки.Остаток4.Значение = ТекТовар.Остаток4;
			КонецЕсли;
		КонецЦикла;

КонецПроцедуры 
Показать


Есть идея заполнить ТЗНом в ПриНачалеРаботыСистемы и при проведении документах прихода и расхода обновлять данные в ТЗНом.

Что думаете?
Оставьте свое сообщение

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