Оптимизация отображения остатков номенклатуры в форме списка
Приветсвую!
Платформа 8.3.8.1502, обычные формы, база на SQL сервере.
В форме списка Номенклатуры выводятся остатки по 4-м складам.
Процедура для вывода остатков вроде стандартная:
Подскажите, пожалуйста, как оптимизировать этот вывод остатков, потому что список тормозит при скроллинге ?
Платформа 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;
КонецЦикла;
КонецПроцедуры
ПоказатьПодскажите, пожалуйста, как оптимизировать этот вывод остатков, потому что список тормозит при скроллинге ?
По теме из базы знаний
- Номенклатура (Расширенная форма списка) и Корзина для УТ11, ERP и КА2 [Расширение]
- Вывод остатка товаров на складе в документ Реализация товаров и услуг (для конфигурации Управление Торговлей 11.2 / 11.3 / 11.4)
- Конфигурация Flowcon
- Расширение для 1С: Розница 2.2 - 2.3. В подборе и списке товаров - колонки Остаток, Цены розничная и закупочная, Сальдо. В документах команда Остатки и цены - для просмотра по списку товаров из документа
- Опыт оптимизации 1С на PostgreSQL
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) тут оптимизировать нечего. Либо убрать остатки.
Либо использовать другой механизм.
Например, при открытии формы делать запрос ко всей номенклатуре и выгружать в переменную ТЗ и вешать обработчик ожидания, который потом будет обновлять эту таблицу.
А запрос в этой процедуре заменить на запрос к ТЗ. Тормозить будет скорее всего когда обновляться ТЗ будет.
Либо использовать другой механизм.
Например, при открытии формы делать запрос ко всей номенклатуре и выгружать в переменную ТЗ и вешать обработчик ожидания, который потом будет обновлять эту таблицу.
А запрос в этой процедуре заменить на запрос к ТЗ. Тормозить будет скорее всего когда обновляться ТЗ будет.
Одно и то же выполняете два раза подряд рядом: Справочники.МестаХранения.НайтиПоКоду(...
Это по сути отдельные запросы, можете попробовать вынести их в основной запрос (создать ВТ записей справочника с отбором по коду).
Это по сути отдельные запросы, можете попробовать вынести их в основной запрос (создать ВТ записей справочника с отбором по коду).
Склады= Новый СписокЗначений;
Склады.Добавить(Справочники.МестаХранения.НайтиПоКоду("1"));
Склады.Добавить(Справочники.МестаХранения.НайтиПоКоду("32"));
Склады.Добавить(Справочники.МестаХранения.НайтиПоКоду("34"));
Склады.Добавить(Справочники.МестаХранения.НайтиПоКоду("35"));
Запрос.УстановитьПараметр("Склады",Склады);
Запрос.УстановитьПараметр("Склад",Справочники.МестаХранения.НайтиПоКоду("1"));
Запрос.УстановитьПараметр("Склад2",Справочники.МестаХранения.НайтиПоКоду("32"));
Запрос.УстановитьПараметр("Склад3",Справочники.МестаХранения.НайтиПоКоду("34"));
Запрос.УстановитьПараметр("Склад4",Справочники.МестаХранения.НайтиПоКоду("35"));
Показать
Если оставлять запрос к виртуальной таблице регистра бухгалтерии, то попробуйте убрать группировку по вычисляемым полям, у вас тяжелый запрос. Лучше сделайте объединение нескольких ВТ, каждая из которых - это остаток по какому-то определенному складу. Как написали выше, прикручивайте кэширование.
Есть вариант использовать событие ПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки) для строк есть метод Строки.ПолучитьКлючи() и можно обходить данные этих строк через Строки.Получить(Ключ).Данные , то есть Вы можете заполнить массив номенклатуры из новых строк с пустыми остатками и таким образом массив номенклатуры у Вас всегда будет и в остаках по хозрасчетному не будет лишнего. Не гарантирую что будет прирост, но попробовать стоит)
Пока что решил следующим образом:
Запрос по остаткам пихаю в переменную ТЗНом при открытии формы, а потом в
Есть идея заполнить ТЗНом в ПриНачалеРаботыСистемы и при проведении документах прихода и расхода обновлять данные в ТЗНом.
Что думаете?
Запрос по остаткам пихаю в переменную ТЗНом при открытии формы, а потом в
Процедура СправочникСписокПриПолученииДанных(Элемент, ОформленияСтрок)
Для Каждого ТекСтрока Из ОформленияСтрок Цикл
ТекТовар = ТЗНом.Найти(ТекСтрока.ДанныеСтроки.Ссылка,"Товар");
Если ТекТовар <> Неопределено Тогда
ТекСтрока.Ячейки.Остаток.Значение = ТекТовар.Остаток;
ТекСтрока.Ячейки.Остаток2.Значение = ТекТовар.Остаток2;
ТекСтрока.Ячейки.Остаток3.Значение = ТекТовар.Остаток3;
ТекСтрока.Ячейки.Остаток4.Значение = ТекТовар.Остаток4;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
ПоказатьЕсть идея заполнить ТЗНом в ПриНачалеРаботыСистемы и при проведении документах прихода и расхода обновлять данные в ТЗНом.
Что думаете?
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот