Как записать табличный документ в excel

  • Главная
  • О сайте
  • Главная
  • Содержание

Рукопашный бой Карташ

Категории

—>

рубрики: Excel | Дата: 15 июня, 2017

Если провести опрос среди программистов 1С на тему «Как сохранить информацию из 1С в файл ексель», то большинство голосов, как мне кажется займет вариант с созданием объекта Excel.Application с последующим заполнением листа с помощью методов и свойств встроенного в Excel языка VBA. Но многие ли из вас помнят вышеупомянутые методы и свойства? А ведь между тем есть способ который позволяет сделать это гораздо проще, только с использованием языка программирования 1С.

Для этого достаточно сформировать ТабличныйДокумент (сделать это можно как с использованием макета табличного документа, так и программно), а потом просто записать его с помощью метода Записать() сразу в файл Excel, благо платформа без проблем позволяет это сделать. Напомню, что синтаксис этого метода выглядит следующим образом

Записать(ИмяФайла, ТипФайлаТаблицы)
ИмяФайла — строка в которой указан путь к файлу;
ТипФайлаТаблицы — тип файла в который мы будем записывать табличный документ.
Платформа 1С предоставляет следующие типы файлов:

  • ANSITXT (ANSITXT)
  • DOCX (DOCX)
  • HTML (HTML)
  • HTML3 (HTML3)
  • HTML4 (HTML4)
  • HTML5 (HTML5)
  • MXL (MXL)
  • MXL7 (MXL7)
  • ODS (ODS)
  • PDF (PDF)
  • TXT (TXT)
  • XLS (XLS)
  • XLS95 (XLS95)
  • XLS97 (XLS97)
  • XLSX (XLSX)

Пример использования

В качестве примера создадим процедуру в которую в качестве параметра будет передаваться таблица значений, которую будем выводить в табличный документ, который в свою очередь будем сохранять в ексель.
Вот код этой процедуры




&НаСервере
Процедура ЗаписатьТаблицуЗначенийВФайлЕксель(Таблица)

	ТабДок = Новый ТабличныйДокумент;

	КоличествоКолонок = Таблица.Колонки.Количество();

	//Формируем строку с заголовками
	Для Счетчик = 1 По КоличествоКолонок Цикл

		ТекущаяКолонка = Таблица.Колонки[Счетчик - 1];
		ТабДок.Область("R1C" + Счетчик).Текст = ТекущаяКолонка.Имя;

	КонецЦикла;

	//Добавляем строки из таблицы
	НомерСтроки = 2;
	Для каждого СтрокаТаблицы Из Таблица Цикл

		Для НомерКолонки = 1 По КоличествоКолонок Цикл

			ТабДок.Область("R" + НомерСтроки + "C" + НомерКолонки).Текст = Строка(СтрокаТаблицы[НомерКолонки - 1]);

		КонецЦикла;
		НомерСтроки = НомерСтроки + 1;

	КонецЦикла;

	//Записываем табличный документ в файл Excel
	ТабДок.Записать("D:musorTest.xlsx", ТипФайлаТабличногоДокумента.XLSX);

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

В общем то все элементарно. Пусть у нас есть вот такая таблица значений:

Товар Количество
Яблоки 5
Груши 10

После того как прогнал ее через процедуру выше, получил вот такой результат в ексель

Достоинства метода

  • Простота. Не требуется знаний VBA. Доступны синтаксический контроль и отладка кода в процессе написания.
  • Не требуется наличия установленного Excel.

Недостатки метода

  • Если макет достаточно сложный, есть вероятность, что он может сохраниться недостаточно корректно. Плюс могут возникать проблемы с форматом данных.

 +4 

   

Распечатать

Процедура сохраняет табличный документ в файл excel и открывает его

Код 1C v 8.х

 Процедура ОткрытьТабличныйДокументВExcel(ТабДокумент,ИмяФайла) Экспорт
ИмяФайла = Строка(ИмяФайла) + ".xls";
Каталог = КаталогВременныхФайлов();
ПолныйПутьКФайлу = Каталог + ИмяФайла;
Попытка
ТабДокумент.Записать(ПолныйПутьКФайлу,ТипФайлаТабличногоДокумента.XLS);
Сообщить("Записан новый файл " + ПолныйПутьКФайлу);
ЗапуститьПриложение(ПолныйПутьКФайлу);
Исключение
СообщитьОбОшибке(ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры

Для анализа способов записи мы создали обработку, которая записывает файл Excel в двух вариантах. Форма обработки показана ниже:

Обработка выполняет запись 3 строк, в каждой строке 5 значений и одна картинка. Код обработки может выполняться как на клиенте, так и на сервере.

Вы можете скачать обработку и ознакомиться с ее работой по ссылке:

Выгрузка через Табличный документ

Это один из самых простых способов записи в xlsx и xls. В 1С в этом варианте Вы будете работать с объектом ТабличныйДокумент. Ниже показан пример записи в табличный документ, который Вы также можете найти в прилагаемой выше обработке:

&НаКлиенте
Процедура ВыполнитьЗаписьЧерезТабличныйДокумент()
	ТабДок = Новый ТабличныйДокумент;
	Для СтрокаНомер = 1 По 3 Цикл
		//Записываем значения строки
		Для КолонкаНомер = 1 По 5 Цикл
			Область = ТабДок.Область(СтрокаНомер, КолонкаНомер);
			Область.Текст = СтрокаНомер * КолонкаНомер;
		КонецЦикла;
		//Записываем изображение
		Область = ТабДок.Область(СтрокаНомер, 6);
		Область.Картинка = Элементы["Изображение" + СтрокаНомер].Картинка;
	КонецЦикла;
	ТипФайла = ТипФайлаТабличногоДокумента.XLSX; //Если запись в формате xls - тип файла ТипФайлаТабличногоДокумента.XLS97
	ТабДок.Записать(Каталог + "Тест.xlsx", ТипФайла);
КонецПроцедуры

Плюсы данного метода записи:

  • Не нужно устанавливать Excel на клиенте/сервере.
  • Не нужно реализовывать масштабирование изображений — Вы устанавливаете только ширину/высоту ячейки.
  • Высокая скорость записи т.к. не используется прослойка в виде COMОбъекта.

Минусы:

  • Нет возможности устанавливать формулы для ячеек.
  • Неконтролируемая конвертация табличного документа в документ Excel.  Как пример — могут смещаться изображения.

Замер производительности показывает общее время записи 0,28 сек.

Выгрузка через Excel

В этом варианте запись выполняется с помощью COMОбъекта Excel — устанавливаем соединение с Excel, создаем книгу и размещаем данные на ее листах. Обязательно закрываем книгу и соединение!

&НаКлиенте
Процедура ВыполнитьЗаписьЧерезExcel()
	Эксель = Новый COMОбъект("Excel.Application");
	Эксель.DisplayAlerts = 0;
	Эксель.ScreenUpdating = 0;
	Эксель.EnableEvents = 0;
	Книга = Эксель.WorkBooks.Add();
	Лист = Книга.WorkSheets(1);
	Для СтрокаНомер = 1 По 3 Цикл
		//Записываем значения строки
		Для КолонкаНомер = 1 По 5 Цикл
			Лист.Cells(СтрокаНомер, КолонкаНомер).Value = СтрокаНомер * КолонкаНомер;
		КонецЦикла;
		//Записываем изображение
		СтрокаКартинка = Элементы["Изображение" + СтрокаНомер].Картинка;
		ВременныйФайл = ПолучитьИмяВременногоФайла("" + СтрокаКартинка.Формат());
		СтрокаКартинка.Записать(ВременныйФайл);
		ЛистИзображение = Лист.Shapes.AddPicture(ВременныйФайл, Ложь, Истина, Лист.Cells(СтрокаНомер, 6).Left + 1, Лист.Cells(СтрокаНомер, 6).Top + 1, -1, -1);
		ЛистИзображение.Placement = 1;
		ЛистИзображение.LockAspectRatio = 0;
		//Масштабирование изображения
		ЛистИзображение.Width = 47;
		ЛистИзображение.Height = 29;
		Лист.Rows(СтрокаНомер).RowHeight = 33;
		ЛистИзображение.Height = 29;
		УдалитьФайлы(ВременныйФайл);
	КонецЦикла;
	ТипФайла = 51; //Если запись в формате xls - тип файла -4143
	Книга.SaveAs(Каталог + "Тест.xlsx", ТипФайла);
	Попытка
		Книга.Close(Ложь);
		Эксель.DisplayAlerts = 1;
		Эксель.Quit();
	Исключение
		Информация = ИнформацияОбОшибке();
		Сообщить(Информация.Описание);
	КонецПопытки;
КонецПроцедуры

Плюсы данного метода записи:

  • Полный контроль над процессом записи.
  • Доступ практически ко всем возможностям Excel.

Минусы:

  • Нужно устанавливать Excel на клиенте/сервере.
  • Нужно реализовывать масштабирование изображений. Алгоритм записи должен позиционировать изображение в ячейке устанавливая ширину и высоту. Также нужно настраивать высоту строки.
  • Низкая скорость записи.

Замер производительности показывает общее время записи 0,86 сек. Это в 3 раза медленнее чем запись через Табличный документ. По своему опыту можем отметить — медленнее может быть в 10 и более раз!

Итоги

При выборе варианта выгрузки лучше смотреть на поставленную задачу. Оптимально использовать запись через Табличный документ — многие моменты записи будут упрощены. Можно объединять 2 варианта записи — основу записывать через Табличный документ, а формулы добавлять с использованием Excel. Такая запись будет производительнее чем полная запись через Excel.

Наши разработки:

Содержание

Механизм создания табличных документов и печатных форм в 1С достаточно продуман и хорошо проработан, однако, до функциональных возможностей, реализованных в Microsoft Excel, ему, конечно же, далеко. Поэтому многие пользователи предпочитают действовать по следующему алгоритму:

  • Сформировать печатную форму в 1С;
  • Сохранить данные как лист Excel (Рис.1)или скопировать таблицу;
  • Продолжить работу с информацией в другой программе.

Рис.1

И, нередко, у них возникает вопрос: как осуществить непосредственную выгрузку информации из 1С в Excel, минуя дополнительные шаги?

Два главных требования, которые должны быть выполнены

Для безошибочного функционирования нашей обработки, необходимо:

  1. Чтобы на компьютере пользователя был установлен Microsoft Office и, в частности, Excel (мы будем подключаться к приложению посредством создания COM-объекта);
  2. Представлять себе структуру хранения данных в Excel (понимать, как формируются имена ячеек, знать, что такое лист, книга и т.д.).

Только убедившись, что два этих пункта выполнены, следует приступать к дальнейшей разработке.

Алгоритм при выгрузке и его реализация в 1С

Последовательность действий при выгрузке из 1С в Excel можно представить следующей последовательностью шагов:

  1. Формируем набор данных, которые необходимо сохранить в Excel;
  2. Создаем подключение к приложению (запускаем его);
  3. Заполняем файл выгружаемыми данными;
  4. Сохраняем файл;
  5. Закрываем открытое приложение.

Теперь по этому списку подробнее.

Формирование набора данных

В качестве источника данных может выступать результат выполнения запроса, печатная форма табличного документа, любая выборка элементов. В нашем случае мы будем выгружать реестр документов «Поступление товаров и услуг» за текущий месяц (Рис.2)

Рис.2

Осуществляем программный запуск приложения

Как было сказано выше, для того, чтобы запуститься, мы будем использовать режим Com-соединения. Код на Рис.3 показывает, как это можно осуществить.

Рис.3

Процедуру создания нового объекта мы сознательно вставили в конструкцию Попытка — Исключение-КонецПопытки, для того, чтобы исключить всевозможные нестандартные ситуации в дальнейшем ходе обработки.

Заполнение файла, его сохранение и завершение работы приложения

В первую очередь следует определиться, что мы хотим сделать: выгрузить данные в существующий файл или создать новый:

  • В первом случае нам необходимо запустить диалог выбора файла и получить полное имя существующего хранилища информации;
  • Во втором случае мы должны самостоятельно придумать имя создаваемого файла и определиться с его местоположением (именно из этих двух слагаемых будет создано имя файла).

Решив, где мы будем хранить наши данные, приступим к непосредственному заполнению файла , для этого создадим процедуру и передадим в нее в качестве параметра нашу выборку документов за текущий месяц. (Рис.4)

Рис.4

Как видно из кода, в первую очередь мы создали книгу, в которой будет храниться наша таблица. По умолчанию программа Excel при первом запуске создает в книге три листа. Для внесения данных мы можем выбрать любой из них, просто указав номер листа в качестве параметра для метода WorkSheets(). Если же нам понадобилось бы добавить новый лист в книгу, мы должны бы были записать строку вида:

НовыйЛист=НоваяКнига.Sheets.Add();

На этом мы закончили формировать общую структуру документа и приступаем к его заполнению.

Циклом со счетчиком перебираем строки и колонки нашей таблицы значений, для получения данных конкретной ячейки и их переноса в конечную таблицу.

Здесь важно иметь ввиду, что индексы строк и колонок таблицы значения в 1С начинаются с 0 и заканчиваются на числе на 1 меньшем, чем количество этих строк и колонок, а нумерация строк и колонок ячеек в Exel начинается с 1.

Перебрав нашу таблицу и перенеся её в новое место, мы должны сохранить созданный файл. Параметр ПутьКФайлу, указанный в процедуре SaveAs, должен содержать полный путь к файлу, включая его имя.

Если на компьютере установлен Microsoft Office версии 2007 года или более поздний, у Вас, вероятно, может возникнуть необходимость в сохранении табличного документа в формате Excel 2003, программно это можно сделать, если указать в качестве второго параметра процедуры SaveAs значение (-4143). Именно это число указывает на формат сохраняемого файла, соответсвующий расширению xls.

В случае ошибки (допустим сохраняемый файл уже открыт), наша обработка должна предупредить пользователя о нестандартной ситуации, что и прописано в процедуре Сообщить().

Так как мы не планируем дальше продолжать работу с Excel, мы должны закрыть приложение. Здесь следует отметить, что визуально отследить выполнение нашей обработки можно только воспользовавшись диспетчером задач, в списке открытых окон его видно не будет. Опять же, если не прописать закрытие приложения, оно будет занимать место в оперативной памяти и может привести к конфликтам запуска дополнительных копий Excel.

Дополнительный способ сохранения табличного документа из 1С в Excel

Еще один способ выгрузки — непосредственное сохранение табличного документа на диск без его вывода на экран или перед выводом, код соответствующей процедуры показан на (Рис.5).

Рис.5

Одно очень важное замечание: в программах 1С и Excel различаются разделители целой и дробной части в числовых значениях, этот момент следует учитывать при выгрузке во избежание перекоса в данных.

8.1 да, не сохраняет. Я делал так: создал пустую конфигу, при начале работы системы передаю параметр, открываю ее:

//Финт ушами    
   V8 = Новый COMОбъект(«V81.Application»);
   Соединение = V8.Connect(«File=»»E:1C_BASEConvtoExcel»»; Usr=»»Convertor»»; Pwd=»»»»;»);
   ИмяФайлаДляКонв = ИмяФайла;
   Результат = V8.ВыполнитьКонвертацию(ИмяФайлаДляКонв);
   V8 = Неопределено;

А в ней:

Процедура ПередНачаломРаботыСистемы(Отказ)  

       ИмяФайла = «E:ssh1CReport»+СокрЛП(Строка(НачалоДня(ТекущаяДата())));      
   ИмяФайла = СтрЗаменить(ИмяФайла,».»,»_»);
   ИмяФайла = СтрЗаменить(ИмяФайла,» 0:00:00″,»»);
   ИмяФайла = ИмяФайла +».mxl»;      

       ТабличныйДокументБУ = Новый ТабличныйДокумент;
   ТабличныйДокументБУ.Прочитать(ИмяФайла);    
   ТабличныйДокументБУ.Вывод = ИспользованиеВывода.Разрешить;
   ИмяФайла = СтрЗаменить(ИмяФайла,».mxl»,».xls»);
   ТабличныйДокументБУ.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLS);

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

Понравилась статья? Поделить с друзьями:

А вот еще интересные статьи:

  • Как записать таблицу значений в excel
  • Как записать процент от числа в excel
  • Как записать таблицу в файл excel
  • Как записать производную в excel
  • Как записать сумму ячеек в excel

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии