Быстрое преобразование таблицы значений в лист Эксель

1. frkbvfnjh 799 26.04.23 13:50 Сейчас в теме
Всем привет! Кто нибудь знает как максимально быстро преобразовать выборку запроса или таблицу значений в лист Эксель. Особенность в том, что платформа 8.1. Если бы была 8.3, то естественно можно было бы сохранить в xlsx, но 8.1 не поддерживает xlsx, в xls ограничение на 65000 записей, а нужно выгружать около миллиона записей, а то и больше. Нашел вот такое https://helpf.pro/faq/view/995.html, через СОМ, но работает не реально медленно, десятки записей мурыжит несколько минут. Может можно и через СОМ, как то манипулируя методами объекта Эксель?, типа через преобразование ТЗ в COMSafeArray, а там как то разом записать в лист, но я не имею представления как это сделать...
По теме из базы знаний
Найденные решения
2. nomad_irk 76 26.04.23 14:21 Сейчас в теме
(1)основная идея:
1. преобразовать ТЗ в массив массивов по столбцам
2. Из массива массивов сделать многомерный ComSafeArray
3. С помощью метода Range() листа EXCEL присвоить нужной области ComSafeArray
Лист.Range(Лист.Cells(1, 1), Лист.Cells(Y, X)).Value = ComSafeArray;
wertep; frkbvfnjh; PlatonStepan; SlavaKron; +4 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. nomad_irk 76 26.04.23 14:21 Сейчас в теме
(1)основная идея:
1. преобразовать ТЗ в массив массивов по столбцам
2. Из массива массивов сделать многомерный ComSafeArray
3. С помощью метода Range() листа EXCEL присвоить нужной области ComSafeArray
Лист.Range(Лист.Cells(1, 1), Лист.Cells(Y, X)).Value = ComSafeArray;
wertep; frkbvfnjh; PlatonStepan; SlavaKron; +4 Ответить
17. frkbvfnjh 799 27.04.23 08:07 Сейчас в теме
(2) Вот что такое крутилось, если присвоение ComSafeArray к Range работает, то должно быть само то. Попробую Ваш способ.
18. nomad_irk 76 27.04.23 08:28 Сейчас в теме
(17)Оно работает в обе стороны: присвоить и получить - именно эта возможность не оставляет ни 1С, ни libre/Open Office ни малейшего шанса при загрузке/выгрузке реально больших таблиц в файл по скорости работы.

Может 1С когда-нибудь таки добавят в платформу такую же возможность, чтобы можно было в среде *NIX так же быстро читать и сохранять файлы без привлечения ADO.
21. frkbvfnjh 799 27.04.23 13:34 Сейчас в теме
(2)
Лист.Range(Лист.Cells(1, 1), Лист.Cells(Y, X)).Value = ComSafeArray;

Да, это та самая волшебная строка! Задача решена, спасибо! Заполнение листа выполняется моментально! Да же с учетом того, что я результат запроса не в ТЗ выгружаю, т.к. 1С может вылететь от нехватки памяти, а делаю обход выборки, алгоритм отрабатывает достаточно быстро. Перед выборкой предварительно создаю матрицу нужного размера (как ни странно большие массивы 1С переносит лучше чем, большие ТЗ) и при обходе выборки заполняю матрицу, затем создаю ComSafeArray и присваиваю его. Дольше всего конечно же отрабатывает обход выборки, но это помимо прочего позволяет дополнительно обработать значения записей полученных из запроса, например привести к нужному формату. В итоге пол ляма записей за 2,5 минуты поместились в матрицу, а само преобразование матрицы в ComSafeArray и его присвоение заняло не больше 2 секунд.
22. nomad_irk 76 27.04.23 13:39 Сейчас в теме
(21)если данные получаются запросом, то лично я все делал бы в самом запросе по максимуму, чтобы избежать построчного обхода выборки и формировать массив через ТЗ.ВыгрузитьКолонку().
23. frkbvfnjh 799 27.04.23 13:46 Сейчас в теме
(22) Полностью согласен, так еще быстрее, но есть шанс падения 1С при выгрузке в ТЗ, ну и дату в нужный формат в запросе не приведешь. Но если случай не извращенный и выгрузка в несколько сотен тысяч записей, то вариант вообще идеальный для выгрузки из 8.1 в XLSX.
24. nomad_irk 76 27.04.23 13:52 Сейчас в теме
(23)
дату в нужный формат в запросе не приведешь

Всмысле? оно выгружается как дата, вот с пустой датой - да, нужно либо Неопределено передавать, либо 31.12.1899
4. user856012 14 26.04.23 15:14 Сейчас в теме
(1)
нужно выгружать около миллиона записей, а то и больше.
Что-то много "миллионеров" развелось в последнее время: https://forum.infostart.ru/forum9/topic296662/
11. DesertPunk 26.04.23 18:27 Сейчас в теме
(4) Главбух Глафира Петровна ерунды не скажет. Так что грузим в excel и крыжим с линейкой. Понапридумывали тут всяких серверных баз данных и работать не хотят.
5. glek 120 26.04.23 15:16 Сейчас в теме
(1) Попробуйте через ADO. Вроде на ИС есть статья на эту тему.
7. independ 1541 26.04.23 15:24 Сейчас в теме
(1) в текстовый csv, потом программно открыть в excel и программно сохранить в xlsx
8. SlavaKron 26.04.23 15:29 Сейчас в теме
(7) А разве есть нативное сохранение в csv? Можно, конечно, свой костыль сделать, но там же нужен контроль кавычек и разделителей.
frkbvfnjh; +1 Ответить
9. independ 1541 26.04.23 15:33 Сейчас в теме
(8) для миллиона записей придется чем-то пожертвовать (кавычки, апострофы и точки с запятой)
15. frkbvfnjh 799 27.04.23 08:03 Сейчас в теме
(8) Совершенно согласен, пытался писать в CSV, и основная проблема не в записи, а как раз в том, что бы в кавычки поместить и соединить значения строки через разделитель. Тормозит именно на формировании строк которые в файл пишутся, а не сама запись. Максимальной скорости которой я смог добиться это 500 записей в секунду с размером строки в 20 колонок. В среднем в колонке значение в 30-40 символов. Если кто то может записать в CSV быстрее, то приведите пример алгоритма.
20. wertep 24 27.04.23 10:48 Сейчас в теме
(1) Я бы начал с изменения постановки задачи. Выгрузка в Эксель это "исходные данные", которые в Экселе еще потом надо корячить.
Поэтому в 1С обработать до конечного результата как нужно клиенту и выводить в отчет.
3. soft_wind 26.04.23 14:22 Сейчас в теме
попробуйте обратный подход (если осилите)
из самого Екселя внешним соединением соединитесь с 1С, запросом получите нужные данные из 1С и разместите их на листе
создайте кнопку в екселе, ПолучитьДанныеИз1С
на VBA напишите небольшую программку, и все!

должно значительно быстрее получиться
6. SlavaKron 26.04.23 15:23 Сейчас в теме
Совет из (2), если он рабочий, выглядит неплохо. Интересно узнать быстродействие. У меня похожая задача – проблема в том, что табдок слишком долго сохраняет в xlsx.
ТабДок.Записать(ИмяФайлаXLSX, ТипФайлаТабличногоДокумента.XLSX);
10. nomad_irk 76 26.04.23 15:37 Сейчас в теме
(6)Он прям очень рабочий и быстродействие выше(значительно), чем
ТабДок.Записать(ИмяФайлаXLSX, ТипФайлаТабличногоДокумента.XLSX);
PlatonStepan; +1 Ответить
12. starik-2005 3060 26.04.23 20:33 Сейчас в теме
xlsx - это зазипованный xml. 8.1. вроде как с XML умеет работать. А если и не умеет, то запись текста поможет. Сделать в экселе две строки с шапкой и номерами колонок в значении ячеек второй строки. Дальше раззиповать, открыть в блокноте, подставить между 1/2/3/4/5... какой-нить полезный значок, который потом заменить на значения колонок. Ну и выгрузить это все в xml, добавить шапку и подвал этого xml-ля. После выгрузки упаковать в уже имеющийся архив xlsx..
independ; +1 Ответить
13. karamazoff 112 26.04.23 23:25 Сейчас в теме
а так не?
Макет =  ПолучитьМакет("Товары");
	
	Область = Макет.ПолучитьОбласть("Шапка");
	ТабДок = Новый ТабличныйДокумент;
	//ТабДок.ТолькоПросмотр = Истина;
	ТабДок.ФиксацияСверху = 1;
	ТабДок.Вывести(Область);
	
	Для каждого стр из Рез цикл
		Область = Макет.ПолучитьОбласть("Строка");
		Область.Параметры.Заполнить(стр);
		ТабДок.Вывести(Область);
	КонецЦикла;	
	
	ВремПутьКФайлуОтчета = "C:\1c_auto_ostatki\остатки.XLSX";	
	ТабДок.Записать(ВремПутьКФайлуОтчета, ТипФайлаТабличногоДокумента.XLSX);
Показать

Пример рабочий 4 года успешно фигачит
14. nomad_irk 76 27.04.23 06:13 Сейчас в теме
(13)и сколько по времени выполняется сохранение в файл при простыне, скажем, в 50к строк с 20 колонками?
19. karamazoff 112 27.04.23 09:38 Сейчас в теме
(14)да вроде не долго, да это и не очень важно, оно делается в фоне регламентным, есть не просит, пока никто не жаловался
16. frkbvfnjh 799 27.04.23 08:06 Сейчас в теме
(13) Да нету в 8.1 поддержи xlsx. Я бы и рад хоть так писать, но нет такой возможности.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот