1. Обращаясь через точку к реквизиту, мы обращаемся в БД за всей таблицей с данными, а нам нужны конкретные. В Вашем случае с диска в память тянутся все реквизиты из таблицы в которой хранятся реквизиты шапки и если там пару реквизитов, то может быстро отработать, а если документ сложный, то вот весь он и помещается в память, а потом Вам возвращается только одно значение. Дальнейшее обращение к этому же реквизиту возвращает уже значение, которое находится в оперативной памяти, поэтому отрабатывает быстро.
2. Обращение через точку это запрос. В описанной процедуре это запрос в цикле, а при скролинге списка имеем постоянный запрос в цикле, что конечно отражается на быстродействии работы с формой
По правильному необходимо заполнить ИтогВес в данных и выводить в списке уже стандартно.
Если же нет возможности хранить (а такое вполне бывает) ,то я б использовал следующую схему:
// 1. подготавливаем таблицы для оформления строк
тз = Новый ТаблицаЗначений;
тз.Колонки.Добавить("Ссылка");
тз.Колонки.Добавить("СтрокаОформления");
тз.Индексы.Добавить("Ссылка");
спДокументов = Новый СписокЗначений;
Для каждого СтрокаОформления Из ОформленияСтрок Цикл
ДокументСсылка = СтрокаОформления.ДанныеСтроки.Ссылка;
Если спДокументов.НайтиПоЗначению(ДокументСсылка) = Неопределено;
спДокументов.Добавить(ДокументСсылка);
КонецЕсли;
// запоминаем строку оформления, которая соответствует ссылке
СтрокаТЗ = тз.Добавить();
СтрокаТЗ.Ссылка = ДокументСсылка;
СтрокаТЗ.СтрокаОформления = СтрокаОформления;
КонецЦикла;
// 2. одним запросом получаем необходимые данные по всем "видимым" ссылкам
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| МойДокумент.Ссылка,
| МойДокумент.Ссылка.ИтогВес КАК ВесПоШапке,
| СУММА(МойДокумент.Вес) КАК ВесПоСтрокам
|ИЗ
| Документ.МойДокумент.Товары КАК МойДокумент
|ГДЕ
| МойДокумент.Ссылка В(&спДокументов)
|
|СГРУППИРОВАТЬ ПО
| МойДокумент.Ссылка,
| МойДокумент.Ссылка.ИтогВес";
Запрос.УстановитьПараметр("спДокументов", спДокументов);
РезультатЗапроса = Запрос.Выполнить();
// 3. Обходим запрос, находим строку оформления по ссылке и делаем в ней то что нужно
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("Ссылка", Выборка.Ссылка);
НайденныеСтроки = тз.НайтиСтроки(ПараметрыОтбора);
Для каждого НайденнаяСтрока Из НайденныеСтроки Цикл
СтрокаОформления = НайденнаяСтрока.СтрокаОформления;
Если Выборка.ВесПоШапке > 0 Тогда
ВесИтого = Выборка.ВесПоШапке;
Иначе
ВесИтого = Выборка.ВесПоСтрокам;
КонецЕсли;
Строкаоформления.Ячейки.Вес.Значение = ВесИтого;
КонецЦикла;
КонецЦикла;
КонецЕсли;
Описал для веса, в том же запросе получаем и другую информацию.
В итоге имеем один запрос вместо кучи (это условно конечно, т.к. всё таки он будет выполняться при любом скролинге списка) и этот запрос вытягивает только интересующие нас данные, а не все подряд
Сообщение отредактировал Batchir - 12.05.20, 11:54