Последние сообщения

#61
7.7 / Re: Как ускорить вывод таблицы...
Последний ответ от Харлампий Дымба - 25 ноября 2025, 00:10
Да, понятно, что могут быть частные варианты. И у меня нет отчетов, где вывод самой формы занимает больше 40 секунд, даже на пару сотен тысяч строк с расшифровками.
И понятно, что карточку счета 10 могут вывести за квартал, а могут за 10 лет - и потом крутить её в своих excelях без меня. Я не буду же специализированную форму делать - но приятно, если год сформируется не за 6 секунд, а за 3.

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

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

ADirks дал хорошую заготовку теста от Олега Садовникова - покручу на досуге разные варианты. Но боюсь, что всё вышеперечисленное не даст какой-то значимой оптимизации.
#62
7.7 / порядок вариантов сохранения в...
Последний ответ от ЯнСмит - 24 ноября 2025, 22:47
Штатно при сохранении в файл печатной формы первым предлагается "родной" формат .mxl, а хотелось бы чтобы первым был excel (.xls / .xlxs), возможно ли?
#63
7.7 / Re: Как ускорить вывод таблицы...
Последний ответ от Злоп - 24 ноября 2025, 22:24
Поддерживаю вышесказанное.
я, например, большие таблицы формирую исключительно "для себя". тупо когда делать нечего или нападает роботун непонятный типа хочется прекрасного. Потом смотрю глазками лениво листая туда-сюда.. Оппа, краснота какая-то вылезла... оппа... тут что-то явно не то... ну то есть типа огрехи увидеть аналитическим умом мимо проходя...
#64
7.7 / Re: Как ускорить вывод таблицы...
Последний ответ от Ветер в поле - 23 ноября 2025, 21:58
Немного поэкспериментировал. У меня таблица с 18 колонками и 14600 строками формировалась за 30 секунд без всякой оптимизации вывода. Причем со сложными расшифровками. Вывод в файл занимал в районе 8 секунд. Не принципиальная разница. Не думаю, что отчеты на десятки тысяч строк формируют каждые 5 минут и сложно подождать минуту-другую. Вот сотни тысяч уже в таблицу не выведешь. А если выведешь, то работать с ней в 1С невозможно.
#65
7.7 / Re: Как ускорить вывод таблицы...
Последний ответ от Ветер в поле - 23 ноября 2025, 21:18
Можно, конечно, поиграться с выводом, но вряд ли скорость вывода существенно вырастет - слишком большой объем данных выводится. Порочна сама практика формирования отчетов больше, чем на считанное количество тысяч строк. Люди всё же не компьютеры, чтобы суметь обработать такой массив информации. Другое дело, если данные из 1С потом обрабатываются всяким OLAP-программами, хотя бы тем же экселем. Вот тогда такой массив данных вполне имеет смысл. Но не стоит его выводить в таблицу 1С. У меня все стандартные отчеты имеют опцию "Данные для анализа OLAP". Тогда перед формированием у пользователя спросят имя файла и в него выгрузят данные отчета в формате CSV (использую для выгрузки метод ВФайл(стрИмяФайла, чФормат = 4, Индекс = "", чСИменамиКолонок = 1) объекта ИндексированнаяТаблица). Вот тогда даже сотни тысяч строк со многими колонками очень быстро выгружаются. Не скажу, правда, что быстро формируется - иногда и час может затратиться. В любом случае, таблица на многие десятки тысяч строк в программе еле шевелится и работать с ней почти невозможно. Чтобы не упираться в 1.5 ГБ памяти, я применил патч 4 ГБ.
 
#66
7.7 / ТЗ, вывод с ячейку в несколько...
Последний ответ от Злоп - 22 ноября 2025, 14:33
можно ли такое сделать?
или ТЗ - жестко фиксированной высоты строки сделаны и никак?
#67
7.7 / Re: Йоксель.ГрафическийКонверт...
Последний ответ от alyuev - 21 ноября 2025, 14:57
Можно использовать принтер pdfFactory
#68
7.7 / Re: Как ускорить вывод таблицы...
Последний ответ от alyuev - 21 ноября 2025, 14:53
Я запоминал секции в отдельные переменные и перед выводом заполнял текст нужным значением и потом выводил. Было быстрее, чем ВывестиСекцию().
#69
7.7 / Re: Передать таблицу значений ...
Последний ответ от trad - 20 ноября 2025, 11:05

Процедура УложитьТаблицу(пТЗ, ИмяТаб, Колонки="", ПервичныйКлюч="") Экспорт
	Перем ТЗ;
	
	Если ПустаяСтрока(Колонки)=1 Тогда
		ТЗ=пТЗ;
	Иначе
		пТЗ.Выгрузить(ТЗ,,,Колонки);
	КонецЕсли;
	СтрCreate="create table %Имя% (/*column_definition*/ /*pk*/)";
	СтрInsert="insert into %Имя% values(/*?*/)";
	Тип="";
	Длина="";
	Точность="";
	ФорматнаяСтрока="";
	КолонкиЕсть=0;
	Для Тек=1 По ТЗ.КоличествоКолонок() Цикл
		Идентификатор=ТЗ.ПолучитьПараметрыКолонки(Тек,Тип,Длина,Точность,,,ФорматнаяСтрока);
		Если (ПустаяСтрока(Колонки)=0)И(Найти(Колонки,Идентификатор)=0) Тогда
			Продолжить;
		КонецЕсли;
		КолонкиЕсть=1;
		Если ПустаяСтрока(ФорматнаяСтрока)=0 Тогда
			SQL_тип=ФорматнаяСтрока;
			рс.ДобПараметр(1,);
		ИначеЕсли ПустаяСтрока(Тип)=1 Тогда
			SQL_тип="char(9)";
			рс.ДобПараметр(1,14,9,0);
		ИначеЕсли Тип="Число" Тогда
			Если Длина=0 Тогда
				Длина=38;
				Точность=10;
			КонецЕсли;
			SQL_тип="numeric(%p%,%s%)";
			SQL_тип=СтрЗаменить(SQL_тип,"%p%",Длина);
			SQL_тип=СтрЗаменить(SQL_тип,"%s%",Точность);
			рс.ДобПараметр(1,11,Длина,Точность);
		ИначеЕсли Тип="Строка" Тогда
			Если Длина=0 Тогда
				SQL_тип="varchar(%n%)";
				SQL_тип=СтрЗаменить(SQL_тип,"%n%",255);
				рс.ДобПараметр(1,15,255,0);
			Иначе
				SQL_тип="char(%n%)";
				SQL_тип=СтрЗаменить(SQL_тип,"%n%",Длина);
				рс.ДобПараметр(1,14,Длина,0);
			КонецЕсли;
		ИначеЕсли Тип="Дата" Тогда
			SQL_тип="datetime";
			рс.ДобПараметр(1,10,8,0);
		ИначеЕсли Найти(Тип,".")>0 Тогда
			SQL_тип="char(9)";
			рс.ДобПараметр(1,14,9,0);
		Иначе
			SQL_тип="char(13)";
			рс.ДобПараметр(1,14,13,0);
		КонецЕсли;
		СтрCreate=СтрЗаменить(СтрCreate,"/*,*/",", ");
		СтрCreate=СтрЗаменить(СтрCreate,"/*column_definition*/",Идентификатор+" "+SQL_тип+"/*,*//*column_definition*/");
		СтрInsert=СтрЗаменить(СтрInsert,"/*,*/",", ");
		СтрInsert=СтрЗаменить(СтрInsert,"/*?*/","?/*,*//*?*/");
	КонецЦикла;
	Если ПустаяСтрока(ПервичныйКлюч)=0 Тогда
		СтрCreate=СтрЗаменить(СтрCreate,"/*pk*/","primary key clustered ("+ПервичныйКлюч+")");
	КонецЕсли;
	Если КолонкиЕсть=1 Тогда
		ТекстЗапроса="
		|set nocount on
		|if exists (select * from tempdb..sysobjects where id=object_id('tempdb..%Имя%') and sysstat & 0xf = 3 )
		|  drop table %Имя%;
		|"+СтрCreate+"
		|";
		рс=СоздатьОбъект("ODBCRecordset");
		рс.ВыполнитьИнструкцию(СтрЗаменить(ТекстЗапроса,"%Имя%",ИмяТаб));
		рс.Подготовить(СтрЗаменить(СтрInsert,"%Имя%",ИмяТаб));
		рс.ВыполнитьSQL_ИзТЗ(ТЗ,100);
		рс.Закрыть();
	КонецЕсли;
КонецПроцедуры
#70
7.7 / Re: Передать таблицу значений ...
Последний ответ от ADirks - 20 ноября 2025, 10:58
например так
    МД = СоздатьОбъект("MetaDataWork")
    тзп_Объекты = ""; зпт = "";
    тз.ВыбратьСтроки();
    Пока тз.ПолучитьСтроку() = 1 Цикл
        идОбъект = МД.ЗначениеВСтрокуБД(тз.Объект);
        тзп_Объекты = тзп_Объекты + зпт + "select '"+идОбъект+"' Объект";
        зпт = "
        |union all
        |";
    КонецЦикла;
    
    ТекстЗапроса = "
    |SELECT
    |    Объекты.Объект
    |FROM
    |    ("+тзп_Объекты+") Объекты
    |";