Как ускорить вывод таблицы (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С невозможно.

Злоп

Поддерживаю вышесказанное.
я, например, большие таблицы формирую исключительно "для себя". тупо когда делать нечего или нападает роботун непонятный типа хочется прекрасного. Потом смотрю глазками лениво листая туда-сюда.. Оппа, краснота какая-то вылезла... оппа... тут что-то явно не то... ну то есть типа огрехи увидеть аналитическим умом мимо проходя...

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

Да, понятно, что могут быть частные варианты. И у меня нет отчетов, где вывод самой формы занимает больше 40 секунд, даже на пару сотен тысяч строк с расшифровками.
И понятно, что карточку счета 10 могут вывести за квартал, а могут за 10 лет - и потом крутить её в своих excelях без меня. Я не буду же специализированную форму делать - но приятно, если год сформируется не за 6 секунд, а за 3.

Просто хотелось понять общие вещи, как получать форму быстрее. Тем более, что выводов -  аж 4 варианта.
Для moxel вынес пока только 2 точных факта для ускорения:
использование строковой переменной для установки значения ячейки;
меньше ячеек.

Всё остальное - повод поразбираться.
ПрисоединитьСекцию - не увидел значимого замедления, потестю;
Использование ПолучитьСекцию() вместо ВывестиСекцию() выглядело многообещающе, но у меня ломалось на расшифровке;
Фиксированная высота, рамки, шрифты,  объединение, "по выделенным столбцам", наличие колонтитулов и прочая - надо будет посмотреть влияние этого всего на вывод;
Расшифровку - укоротить(?), использовать #(?), если список значений, то может как-то в текстовую строку его пихать сразу(?) - надо потестить;
Именованные ячейки;
Может выводить без рамок, потом постобработкой делать единой областью установку рамок;
Другое использование смешанного вывода - часть через ПолучитьСекцию(), часть из языка.
Ну и тд и тп.

ADirks дал хорошую заготовку теста от Олега Садовникова - покручу на досуге разные варианты. Но боюсь, что всё вышеперечисленное не даст какой-то значимой оптимизации.