Имя: Пароль:
1C
1С v8
Сохранение таблицы в Эксель. Вылет с Недостаточно памяти
0 Пол Ньюман
 
28.10.13
15:14
Отчет в 300 000 строк необходимо сохранить в файл Эксель.
Стандартное сохранение вылетает с "Недостаточно памяти". Каковы обходные пути программного сохранения?

Пытался выгрузить первую сотню тысяч строк в файл, остальные дописывать через ОЛЕДБ, но там тоже постоянно ошибки, то формат файла не соотвествует ожидаемому и лечится почему-то открытием файла в Экселе, то при исполнении Insert пишет "Не удается дополнить именованный диапазон", а что это такое и как с этим бороться, так и не смог понять.

Может есть у кого успешный опыт программного сохранения подобных файлов с сохранением форматирования? Заранее благодарен.
1 H A D G E H O G s
 
28.10.13
15:16
Отчет - тупо на пустом месте, или есть макет оформления, сделанный hand made?
2 Пол Ньюман
 
28.10.13
15:17
(1) СКД без расшифровки
3 Пол Ньюман
 
28.10.13
15:17
28 колонок и 320 000 строк
4 H A D G E H O G s
 
28.10.13
15:21
Отправь его на сервер и там сохраняй.
5 Пол Ньюман
 
28.10.13
16:31
Есть ещё вариант с сохранением в txt И открытием в Эксель через Excel Application OpenText, но там требует параметр

Array(Array(1, 1), Array(2, 1))

как его передать через 1С не понимаю, код

М = Новый Массив(2);
    М1 = Новый Массив(2);
    М1[0] = 1;
    М1[1] = 1;
    
    М2 = Новый Массив(2);
    М2[0] = 2;
    М2[1] = 1;
    
    М[0] = М1;
    М[1] = М2;

    xlApp.Workbooks.OpenText(Путь, 65001 , 1, 1, 1, Ложь, Истина, Ложь, Ложь, Ложь, Ложь, М, Истина);

Не работает
6 Пол Ньюман
 
28.10.13
16:59
Сорри, этот параметр опциональный, нормально отрабатывает без него. Теряется лишь форматирование, но для моего конкретного случая это не сильно большая проблема. Могу установить через тот же Excel.Application. В итоге код следующий

ДиалогОткрытия = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
    ДиалогОткрытия.Заголовок = "Выберите папку сохранения";

    Если НЕ ДиалогОткрытия.Выбрать() Тогда
        Возврат;
    КонецЕсли;
    
    Каталог = ДиалогОткрытия.Каталог;
    Путь = Каталог + "\Врем.txt";
    
    ТаблицаОтчета = ЭлементыФормы.ТаблицаРезультата;
    ТаблицаОтчета.Записать(Путь, ТипФайлаТабличногоДокумента.TXT);
    
    xlApp = Новый COMОбъект("Excel.Application");

    xlApp.Visible = Ложь;
    xlApp.DisplayAlrts = Ложь;
    
    xlApp.Workbooks.OpenText(Путь, 65001, 1, 1, 1, Ложь, Истина, Ложь, Ложь, Ложь, Ложь);
    xlWorkBook = xlApp.ActiveWorkBook;
    
    xlWorkbook.SaveAs(Каталог + "\Отчет.xlsx");
    xlWorkbook.Close();
    
    xlApp.Quit();
7 Пол Ньюман
 
28.10.13
17:03
xlApp.DisplayAlErts = Ложь;
8 Пол Ньюман
 
28.10.13
17:06
(4) Работает, но кабздец как долго
9 H A D G E H O G s
 
28.10.13
17:21
(8) Что медленно то?
10 H A D G E H O G s
 
28.10.13
17:22
(8) Херачь его во временное хранилище, не передавай как параметр функции, и не упаковывая в Двоичные Данные. Только через Временное. Будет шустро.

dimoff, ты меня пугаешь.
11 Холодильник
 
28.10.13
17:26
кто такой dimoff?
12 Пол Ньюман
 
28.10.13
17:29
(10) В 8 имеется виду Сохранить копию на сервер, а не на локальный диск, сохранялось полчаса, не вылетело и то слава нуралиевым.

А твое "Херачь его во временное хранилище, не передавай как параметр функции, и не упаковывая в Двоичные Данные"

для меня то же самое что задорновское "положь колдобину со стороны загогулины", не знаю таких слов, если охоты повыпендриваться - готов признать что ты крут ваще, если где-то в тайниках души есть желание помочь - выражайся пожалуйста понятней, желательно примерами кода.
13 H A D G E H O G s
 
28.10.13
17:51
dimoff, ты меня пугаешь.

Для УФ это так:

&НаСервереБезКонтекста
Функция Сохранить(АдресХранилища,ПутьКФайлу)
    Если НЕ ЗначениеЗаполнено(АдресХранилища) ИЛИ ТипЗнч(АдресХранилища)<>Тип("Строка") Тогда
        Возврат Ложь;
    КонецЕсли;
    Если Не ЭтоАдресВременногоХранилища(АдресХранилища) Тогда
        Возврат Ложь;
    КонецЕсли;
    Попытка
        ТабличныйДокумент=ПолучитьИзВременногоХранилища(АдресХранилища);
    Исключение
        Возврат Ложь;
    КонецПопытки;
    Если ТипЗнч(ТабличныйДокумент)<>Тип("ТабличныйДокумент") Тогда
        Возврат Ложь;
    КонецЕсли;
    УдалитьИзВременногоХранилища(АдресХранилища);
    ТабличныйДокумент.Записать(ПутьКФайлу,ТипФайлаТабличногоДокумента.XLS);
    
КонецФункции

&НаКлиенте
Процедура СохранитьНаСервере(Команда)
    АдресХранилища=ПоместитьВоВременноеХранилище(ЭтаФорма.Результат,ЭтаФорма.УникальныйИдентификатор);
    ПутьКФайлу="C:\out.xls";
    Сохранить(АдресХранилища,ПутьКФайлу);
КонецПроцедуры
14 H A D G E H O G s
 
28.10.13
17:51
Для обычной формы прикрути ОМ на сервере.
15 Пол Ньюман
 
28.10.13
18:43
(13) "dimoff, ты меня пугаешь. "

Я 2 года к 1С не прикасался, я не в курсе ваших новоявленных блатных жаргонов
16 ilkoder
 
28.10.13
19:29
сохрани в формате csv или html - и импортируй в екселе
17 Адимр
 
28.10.13
19:30
(0) Если форматирование не важно, тогда программно обходи таблицу и формируй csv файл. Excel должен нормально открыть такой файл с разделителями.
18 Пол Ньюман
 
29.10.13
16:01
(16)(17) Он и txt открывает в xls, но при открытии выдает диалоговое окно как что преобразовывать, хочется этого по возможности избежать, ну или просто ради общего развития решить задачку без пользовательских дополнительных действий.

В (6) описал как программно создать файл txt и через Excel.Application сохранить в xlsx, Но увы он строку "13.1" считает за дату, а передать параметры чтобы нужная колонка читалась как текст, мне не удалось.
19 Пол Ньюман
 
30.10.13
12:19
(16) С Html отлично получилось! Спасибо, идеальный вариант.
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.