Простой способ программного сохранения больших отчетов из СКД в формат Excel

Перерыв весь интернет не смог найти простого способа сохранить отчет с большим числом строк в формате Excel. Везде предлагалось писать процедуры построчной записи, ADO, COMSafeArray и прочее.
Метод же, используемый во всех найденный публикациях "Результат.Записать(ИмяФайла,ТипФайлаТабличногоДокумента.XLSX)", не работает при большом числе строк.
Публикация http://infostart.ru/public/77128/ натолкнула на простую идею, которую и реализовал.
Для того чтобы сохранить результат любого отчета (главное чтобы результат выводился в ТабличноеПоле) в формате Excel с большим числом строк (типовая 1с ругается при превышении их числа в 65535),
используется следующий простой метод.

1. Сначала сохраняем табличное поле как файл формата «Документ HTML4» (//infostart.ru/public/77128/).
2. Полученный файл программно открываем и пересохраняем в нужном формате Excel.

Для реализации — в реквизиты формы отчета добавляем «ПутьКФайлу» — тип строка, к которому добавим функцию «ПутьКФайлуНачалоВыбора»

&НаКлиенте
Процедура ПутьКФайлуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

СтандартнаяОбработка = Ложь;
РежимДиалога = РежимДиалогаВыбораФайла.Сохранение;
ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалога);
ДиалогВыбораФайла.МножественныйВыбор = Ложь;
ДиалогВыбораФайла.Заголовок = "Укажите путь выгрузки файла...";
ДиалогВыбораФайла.ПолноеИмяФайла = ПутьКФайлу;
ДиалогВыбораФайла.Фильтр = "Excel(2007)(*.xlsx)|*.xlsx";
Если ДиалогВыбораФайла.Выбрать() Тогда
ПутьКФайлу = ДиалогВыбораФайла.ПолноеИмяФайла;
КонецЕсли;

КонецПроцедуры

Также на форму выводим кнопку «ФормаКнопкаСохранитьВЭксель», с командой «СохранитьВЭксель»

&НаКлиенте
Процедура СохранитьВЭксель(Команда)

ИмяФайлаHTML4 = СтрЗаменить(ПутьКФайлу,"xlsx","htm");
    Результат.Записать(ИмяФайлаHTML4,ТипФайлаТабличногоДокумента.HTML4);

Попытка
ЭксельОбъект = Новый COMОбъект("Excel.Application");
ЭксельОбъект.Application.Visible = Ложь;
Книга = ЭксельОбъект.Application.Workbooks.Open(ИмяФайлаHTML4);
Книга.Windows(1).Visible = Истина;
Книга.Application.DisplayAlerts = False;
Книга.SaveAs(ПутьКФайлу,51);
Книга.Close();
ЭксельОбъект.Application.Quit();
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;

КонецПроцедуры

Дополнительно.
Для того чтобы не было потери информации (особенно в части чисел), рекомендуется использовать в 1С, при выводе числовых показателей, следующий формат сумм:
ЧЦ=15; ЧДЦ=2; ЧРД=,; ЧГ=0

P.S. Исправлена строчка кода (приводила к невозможности в некоторых случаях увидеть полученный результат), новая строка выглядит так: 

Книга.Windows(1).Visible = Истина;



14 Comments

  1. chmv

    А я тоже в свое время пришла к такому же решению

    Reply
  2. chmv

    Я по-моему только через mlx

    Reply
  3. den_valley

    (4) bulpi,

    У Экселя такого ограничения давно нет, а вот 1С все время ругается на число строк при попытке сохранить в любой формат Экселя (хоть 97 хоть 2007).

    Reply
  4. rus128

    Супер! Была недавно такая проблема — пришлось отчет формировать поквартально вместо ежегодного…

    Знал бы тогда о такой методике — было бы проще.

    Reply
  5. mikhailovaew

    (4) bulpi, это для «старого» экселя, с расширением xls.

    В 2007 экселе (расширение xlsx) на листе допускается 1 048 576 строк и 16 384 столбца.

    Reply
  6. bulpi

    «типовая 1с ругается при превышении их числа в 65535»

    Не понял. Это ограничение не 1с , а листа Excel. И как же тебе удалось это обойти ? Сохраняй хоть откуда, но на лист больше не влезет.

    Reply
  7. ediks

    (6) Позвольте не согласиться, коллега. Только что сохранил табличный документ в Excel 2007.

    Платформа 8.2.14.540

    Reply
  8. den_valley

    (7) ediks,

    Возможно где-то типовое сохранение и работает. Все варианты не тестировал.

    У меня на отчете в 15 колонок и 300000 строк при выполнении команды «Сохранить как…» вылетает по нехватке памяти.

    При обработке команды «Результат.Записать(ПутьКФайлу,ТипФайлаТабличногоДокумента.XLSX)» ругается на число строк (причем поминает Excel 97 при этом). Платформа (8.3.4.465)

    И только конвертация через HTML4 отрабатывает нормально. А поскольку сам я в итоге потратил на поиск решения пару дней и энное количество танцев с бубном, решил другим облегчить жизнь.

    Reply
  9. den_valley

    (9) FractonKireyev,

    http://www.rondebruin.nl/mac/mac020.htm

    51 = xlOpenXMLWorkbook (without macro’s in 2007-2013, xlsx)
    Reply
  10. FractonKireyev

    Это решение проблемы обязательно возьму на заметку. Идея заслуживает внимания.

    В описанной методике я не понял одного — что значит строка кода:

    Книга.SaveAs(ПутьКФайлу,51);

    Что значит число 51? Подскажите, кто знает.

    Reply
  11. Just

    Хотел уточнить, а конфа «1С:Предприятие — Работа с файлами», тоже не справляется? Всегда ей пользовался для сохранения в эксель файлов *.mxl. Файлы по 100 000 строк нормально сохранялись, больше не пробовал. Помню какой геморой был в 77, когда это конфа вышла, думал вопрос с сохранением решен, кто пробовал отпишитесь об ограничениях, если они там есть.

    Reply
  12. den_valley

    (11) Just,

    Да нормально она сохраняет, но хотелось напрямую из отчета. Плюс — проблема с памятью при больших отчетах.

    Я например вчера специально стал проверять, и как нарочно, ни одной ошибки со стандартным сохранением из 1с (безо всяких конвертаций). А когда надо было сделать тоже самое срочно — работать не хотела.

    В общем — чем больше под рукой будет разных вариантов, тем лучше.:)

    Reply
  13. ZhokhovM

    жаль что не выгружает отчет с картинками, выдает ошибку в самой картинке:

    не удается отобразить связанный. возможно., этот файл был перемещен, переименован или удален. убедитесь, что ссылка указывает на правильный файл и верное размещение.

    Reply
  14. pt_olga

    старая статья, а для меня стала откровением 🙂 спасибо автору большое!

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *