Как ускорить вывод таблицы (moxel)?

Автор Харлампий Дымба, 17 ноября 2025, 23:49

« назад - далее »

Харлампий Дымба

Может кто разбирался в теме или ссылкой поделится.
Ну вот любят построить отчет на 10000+ строк и на 20+ колонок, да с расшифровкой.
Понятно, что всё содержимое ячеек я готовлю в модуле, и в макет вывожу уже строковое значение. Но всё равно львиная доля времени формирования отчета тратится именно на вывод макета.
Какой способ вывода в moxel самый быстрый?

ADirks

Вот такой вот есть простенький тест

trad

Убрать автовысоту строк таблицы, сделать ее фиксированной

Харлампий Дымба

Цитата: ADirks от 18 ноября 2025, 07:30Вот такой вот есть простенький тест
Да, именно это и искал. Спасибо огромное!
Помнил же, что обсуждали когда-то, что через .ПолучитьСекцию() быстрее всего, но не нашёл.
Буду пробовать.

Цитата: trad от 18 ноября 2025, 09:09Убрать автовысоту строк таблицы, сделать ее фиксированной
Есть такое, в среднем процентов десять прибавки.
Ну и, насколько помню, это ещё и один из рецептов для проблемы "долго сохраняет в Excel".

Харлампий Дымба

Цитата: ADirks от 18 ноября 2025, 07:30Вот такой вот есть простенький тест
.ПолучитьСекцию() точно быстрее (раза в 2), но не так феноменально, как казалось с первых запусков.
Тест лукавит по скорости .ПолучитьСекцию(), потому что выводит три раза одну и ту же секцию, в то время как для .ВывестиСекцию() те же три раза выводятся как бы разные секции - ведь их приходится заново заполнять при выводе (пусть и одним и тем же текстом).
Ведь никто не выводит одну и ту же информацию в разных колонках одной строки.
Если непонятно написал, то честный тест для режима  .ПолучитьСекцию() будет, по моему мнению, такой:
секцияТовар1    = Т.ПолучитьСекцию("Строка_3|К1");
облТовар1    = секцияТовар1.Область(1, 1);

секцияТовар2    = Т.ПолучитьСекцию("Строка_3|К1");
облТовар2    = секцияТовар2.Область(1, 1);

секцияТовар3    = Т.ПолучитьСекцию("Строка_3|К1");
облТовар3    = секцияТовар3.Область(1, 1);
    
тзДанные.ВыбратьСтроки();
Пока тзДанные.ПолучитьСтроку() = 1 Цикл
    стрЗначение		= тзДанные.Наименование;
        
    облТовар1.Текст    = стрЗначение;
    Т.ВывестиСекцию(секцияТовар1);
        
    облТовар2.Текст    = стрЗначение;
    Т.ПрисоединитьСекцию(секцияТовар2);

    облТовар3.Текст    = стрЗначение;
    Т.ПрисоединитьСекцию(секцияТовар3);

КонецЦикла;


Харлампий Дымба

..А потом добавил расшифровку и скорость практически сравнялась :'(
Ну ладно, в любом случае, есть пища для ума.

Злоп

для увеличения скорости (исключительно на собственном опыте)
- убирать расшифровки
- убирать мелкую нарезку ячеек для точного построения макетов/выравниыаний
- убирать ПрисоединитьСекцию()

alyuev

Я запоминал секции в отдельные переменные и перед выводом заполнял текст нужным значением и потом выводил. Было быстрее, чем ВывестиСекцию().

Ветер в поле

Можно, конечно, поиграться с выводом, но вряд ли скорость вывода существенно вырастет - слишком большой объем данных выводится. Порочна сама практика формирования отчетов больше, чем на считанное количество тысяч строк. Люди всё же не компьютеры, чтобы суметь обработать такой массив информации. Другое дело, если данные из 1С потом обрабатываются всяким OLAP-программами, хотя бы тем же экселем. Вот тогда такой массив данных вполне имеет смысл. Но не стоит его выводить в таблицу 1С. У меня все стандартные отчеты имеют опцию "Данные для анализа OLAP". Тогда перед формированием у пользователя спросят имя файла и в него выгрузят данные отчета в формате CSV (использую для выгрузки метод ВФайл(стрИмяФайла, чФормат = 4, Индекс = "", чСИменамиКолонок = 1) объекта ИндексированнаяТаблица). Вот тогда даже сотни тысяч строк со многими колонками очень быстро выгружаются. Не скажу, правда, что быстро формируется - иногда и час может затратиться. В любом случае, таблица на многие десятки тысяч строк в программе еле шевелится и работать с ней почти невозможно. Чтобы не упираться в 1.5 ГБ памяти, я применил патч 4 ГБ.
 

Ветер в поле

Немного поэкспериментировал. У меня таблица с 18 колонками и 14600 строками формировалась за 30 секунд без всякой оптимизации вывода. Причем со сложными расшифровками. Вывод в файл занимал в районе 8 секунд. Не принципиальная разница. Не думаю, что отчеты на десятки тысяч строк формируют каждые 5 минут и сложно подождать минуту-другую. Вот сотни тысяч уже в таблицу не выведешь. А если выведешь, то работать с ней в 1С невозможно.