Всем привет! Кто нибудь знает как максимально быстро преобразовать выборку запроса или таблицу значений в лист Эксель. Особенность в том, что платформа 8.1. Если бы была 8.3, то естественно можно было бы сохранить в xlsx, но 8.1 не поддерживает xlsx, в xls ограничение на 65000 записей, а нужно выгружать около миллиона записей, а то и больше. Нашел вот такое https://helpf.pro/faq/view/995.html, через СОМ, но работает не реально медленно, десятки записей мурыжит несколько минут. Может можно и через СОМ, как то манипулируя методами объекта Эксель?, типа через преобразование ТЗ в COMSafeArray, а там как то разом записать в лист, но я не имею представления как это сделать...
(1)основная идея:
1. преобразовать ТЗ в массив массивов по столбцам
2. Из массива массивов сделать многомерный ComSafeArray
3. С помощью метода Range() листа EXCEL присвоить нужной области ComSafeArray
(1)основная идея:
1. преобразовать ТЗ в массив массивов по столбцам
2. Из массива массивов сделать многомерный ComSafeArray
3. С помощью метода Range() листа EXCEL присвоить нужной области ComSafeArray
(17)Оно работает в обе стороны: присвоить и получить - именно эта возможность не оставляет ни 1С, ни libre/Open Office ни малейшего шанса при загрузке/выгрузке реально больших таблиц в файл по скорости работы.
Может 1С когда-нибудь таки добавят в платформу такую же возможность, чтобы можно было в среде *NIX так же быстро читать и сохранять файлы без привлечения ADO.
Да, это та самая волшебная строка! Задача решена, спасибо! Заполнение листа выполняется моментально! Да же с учетом того, что я результат запроса не в ТЗ выгружаю, т.к. 1С может вылететь от нехватки памяти, а делаю обход выборки, алгоритм отрабатывает достаточно быстро. Перед выборкой предварительно создаю матрицу нужного размера (как ни странно большие массивы 1С переносит лучше чем, большие ТЗ) и при обходе выборки заполняю матрицу, затем создаю ComSafeArray и присваиваю его. Дольше всего конечно же отрабатывает обход выборки, но это помимо прочего позволяет дополнительно обработать значения записей полученных из запроса, например привести к нужному формату. В итоге пол ляма записей за 2,5 минуты поместились в матрицу, а само преобразование матрицы в ComSafeArray и его присвоение заняло не больше 2 секунд.
(21)если данные получаются запросом, то лично я все делал бы в самом запросе по максимуму, чтобы избежать построчного обхода выборки и формировать массив через ТЗ.ВыгрузитьКолонку().
(22) Полностью согласен, так еще быстрее, но есть шанс падения 1С при выгрузке в ТЗ, ну и дату в нужный формат в запросе не приведешь. Но если случай не извращенный и выгрузка в несколько сотен тысяч записей, то вариант вообще идеальный для выгрузки из 8.1 в XLSX.
(4) Главбух Глафира Петровна ерунды не скажет. Так что грузим в excel и крыжим с линейкой. Понапридумывали тут всяких серверных баз данных и работать не хотят.
(8) Совершенно согласен, пытался писать в CSV, и основная проблема не в записи, а как раз в том, что бы в кавычки поместить и соединить значения строки через разделитель. Тормозит именно на формировании строк которые в файл пишутся, а не сама запись. Максимальной скорости которой я смог добиться это 500 записей в секунду с размером строки в 20 колонок. В среднем в колонке значение в 30-40 символов. Если кто то может записать в CSV быстрее, то приведите пример алгоритма.
(1) Я бы начал с изменения постановки задачи. Выгрузка в Эксель это "исходные данные", которые в Экселе еще потом надо корячить.
Поэтому в 1С обработать до конечного результата как нужно клиенту и выводить в отчет.
попробуйте обратный подход (если осилите)
из самого Екселя внешним соединением соединитесь с 1С, запросом получите нужные данные из 1С и разместите их на листе
создайте кнопку в екселе, ПолучитьДанныеИз1С
на VBA напишите небольшую программку, и все!
Совет из (2), если он рабочий, выглядит неплохо. Интересно узнать быстродействие. У меня похожая задача – проблема в том, что табдок слишком долго сохраняет в xlsx.
xlsx - это зазипованный xml. 8.1. вроде как с XML умеет работать. А если и не умеет, то запись текста поможет. Сделать в экселе две строки с шапкой и номерами колонок в значении ячеек второй строки. Дальше раззиповать, открыть в блокноте, подставить между 1/2/3/4/5... какой-нить полезный значок, который потом заменить на значения колонок. Ну и выгрузить это все в xml, добавить шапку и подвал этого xml-ля. После выгрузки упаковать в уже имеющийся архив xlsx..
Макет = ПолучитьМакет("Товары");
Область = Макет.ПолучитьОбласть("Шапка");
ТабДок = Новый ТабличныйДокумент;
//ТабДок.ТолькоПросмотр = Истина;
ТабДок.ФиксацияСверху = 1;
ТабДок.Вывести(Область);
Для каждого стр из Рез цикл
Область = Макет.ПолучитьОбласть("Строка");
Область.Параметры.Заполнить(стр);
ТабДок.Вывести(Область);
КонецЦикла;
ВремПутьКФайлуОтчета = "C:\1c_auto_ostatki\остатки.XLSX";
ТабДок.Записать(ВремПутьКФайлуОтчета, ТипФайлаТабличногоДокумента.XLSX);