gifts2017

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

Опубликовал Ден (den_valley) в раздел Программирование - Универсальные функции

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

1. Сначала сохраняем табличное поле как файл формата "Документ HTML4" (http://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 = Истина;



См. также

Подписаться Добавить вознаграждение

Комментарии

1. Марина Чирина (chmv) 07.08.14 17:25
А я тоже в свое время пришла к такому же решению
2. Марина Чирина (chmv) 07.08.14 17:25
Я по-моему только через mlx
3. Ruslan (rus128) 13.08.14 12:09
Супер! Была недавно такая проблема - пришлось отчет формировать поквартально вместо ежегодного...
Знал бы тогда о такой методике - было бы проще.
4. bulpi bulpi (bulpi) 13.08.14 13:32
"типовая 1с ругается при превышении их числа в 65535"
Не понял. Это ограничение не 1с , а листа Excel. И как же тебе удалось это обойти ? Сохраняй хоть откуда, но на лист больше не влезет.
5. mikhailovaew (mikhailovaew) 13.08.14 13:24
(4) bulpi, это для "старого" экселя, с расширением xls.
В 2007 экселе (расширение xlsx) на листе допускается 1 048 576 строк и 16 384 столбца.
6. Ден (den_valley) 13.08.14 11:29
(4) bulpi,
У Экселя такого ограничения давно нет, а вот 1С все время ругается на число строк при попытке сохранить в любой формат Экселя (хоть 97 хоть 2007).
dunaeva1986; +1 Ответить 1
7. ediks (ediks) 13.08.14 18:20
(6) Позвольте не согласиться, коллега. Только что сохранил табличный документ в Excel 2007.
Платформа 8.2.14.540
Прикрепленные файлы:
8. Ден (den_valley) 14.08.14 17:14
(7) ediks,
Возможно где-то типовое сохранение и работает. Все варианты не тестировал.
У меня на отчете в 15 колонок и 300000 строк при выполнении команды "Сохранить как..." вылетает по нехватке памяти.

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

И только конвертация через HTML4 отрабатывает нормально. А поскольку сам я в итоге потратил на поиск решения пару дней и энное количество танцев с бубном, решил другим облегчить жизнь.
9. Андрей Киреев (FractonKireyev) 18.08.14 10:51
Это решение проблемы обязательно возьму на заметку. Идея заслуживает внимания.
В описанной методике я не понял одного - что значит строка кода:
Книга.SaveAs(ПутьКФайлу,51);

Что значит число 51? Подскажите, кто знает.
10. Ден (den_valley) 18.08.14 08:41
(9) FractonKireyev,
http://www.rondebruin.nl/mac/mac020.htm
51 = xlOpenXMLWorkbook (without macro's in 2007-2013, xlsx)
11. Just (Just) 19.08.14 22:57
Хотел уточнить, а конфа "1С:Предприятие - Работа с файлами", тоже не справляется? Всегда ей пользовался для сохранения в эксель файлов *.mxl. Файлы по 100 000 строк нормально сохранялись, больше не пробовал. Помню какой геморой был в 77, когда это конфа вышла, думал вопрос с сохранением решен, кто пробовал отпишитесь об ограничениях, если они там есть.
12. Ден (den_valley) 20.08.14 01:44
(11) Just,
Да нормально она сохраняет, но хотелось напрямую из отчета. Плюс - проблема с памятью при больших отчетах.
Я например вчера специально стал проверять, и как нарочно, ни одной ошибки со стандартным сохранением из 1с (безо всяких конвертаций). А когда надо было сделать тоже самое срочно - работать не хотела.
В общем - чем больше под рукой будет разных вариантов, тем лучше.:)
13. Максим Жохов (ZhokhovM) 28.10.14 14:19
жаль что не выгружает отчет с картинками, выдает ошибку в самой картинке:
не удается отобразить связанный. возможно., этот файл был перемещен, переименован или удален. убедитесь, что ссылка указывает на правильный файл и верное размещение.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа