1 — 08.10.18 — 18:51
(0) ПРОЧЕЕ
Экспорт пакета отображаемых документов. Несколько табличных документов «1С:Предприятия» можно сохранить на разных листах результирующего документа, имеющего формат табличного процессора (XLS, XLSX, ODT). Эта возможность позволит, например, сохранять отчет, содержащий несколько разделов, в формате Microsoft Excel.
2 — 08.10.18 — 18:53
(1) +1
Реализована возможность экспорта пакета отображаемых документов в форматы XLS (Microsoft Excel 97-2003), Microsoft Office OpenXML (Microsoft Excel 2007 и старше) и ODT (OpenDocument). При этом реализована возможность сохранения каждого табличного документа пакета на отдельном листе результирующего документа.
Реализовано свойство ЭлементПакетаОтображаемыхДокументов.Наименование, которое используется для указания имени листа.
Для объекта ПакетОтображаемыхДокументов реализованы методы Записать() и НачатьЗапись().
3 — 08.10.18 — 18:58
(2)+1
https://its.1c.ru/db/metod8dev#content:5792:hdoc:_top:пакетотображаемыхдокументов
Особенности пакетной печати табличных документов
Режим пакетной печати предназначен для печати нескольких табличных документов. Для печати используются объекты встроенного языка: ПакетОтображаемыхДокументов, ЭлементыПакетаОтображаемыхДокументов, ЭлементПакетаОтображаемыхДокументов.
ПакетОтображаемыхДокументов – это собственно сам пакет, который содержит документы и настройки печати. У него есть свойство Состав, представляющее собой объект ЭлементыПакетаОтображаемыхДокументов – коллекцию объектов ЭлементПакетаОтображаемыхДокументов.
ЭлементПакетаОтображаемыхДокументов – объект, который содержит либо адрес временного хранилища, в котором расположен табличный документ, либо объект ПакетОтображаемыхДокументов, обозначающий вложенный пакет документов.
Настройки печати устанавливаются для всего пакета, индивидуальные настройки печати документов игнорируются. Доступны настройки КоличествоЭкземпляров, РазборПоКопиям, ИмяПринтера, ДвусторонняяПечать, ТочностьПечати, Вывод.
Чтобы установить индивидуальные параметры печати для конкретного документа, следует добавить вложенный пакет, поместить документ в него и установить параметры печати для этого вложенного пакета.
Например, необходимо распечатать 3 табличных документа, причем два из них по 5 экземпляров каждый, а третий — в 2 экземплярах:
Копировать в буфер обмена
// Создаем пакет
Пакет = Новый ПакетОтображаемыхДокументов;
// Документы, находящиеся в этом пакете, печатаются в 5 экземплярах
Пакет.КоличествоЭкземпляров = 5;
// Добавляем документы в пакет
ЭлементПакета1 = Пакет.Состав.Добавить();
ЭлементПакета1.Данные = ПоместитьВоВременноеХранилище(ТабличныйДокумент1, УникальныйИдентификатор);
ЭлементПакета2 = Пакет.Состав.Добавить();
ЭлементПакета2.Данные = ПоместитьВоВременноеХранилище(ТабличныйДокумент2, УникальныйИдентификатор);
// Добавляем вложенный пакет для третьего документа
ВложенныйПакет = Новый ПакетОтображаемыхДокументов;
ЭлементПакета3 = Пакет.Состав.Добавить();
ЭлементПакета3.Данные = ВложенныйПакет;
// Документ во вложенном пакете печатается в 2 экземплярах
ВложенныйПакет.КоличествоЭкземпляров = 2;
// Добавляем документ во вложенный пакет
ЭлементВложенногоПакета1 = ВложенныйПакет.Состав.Добавить();
ЭлементВложенногоПакета1.Данные = ПоместитьВоВременноеХранилище(ТабличныйДокумент3, УникальныйИдентификатор);
// Печатаем пакет
Пакет.Напечатать();
Для вложенного пакета можно установить те же параметры печати, что и для всего пакета, при этом если какие-то параметры не установлены, то они определяются из параметров родительского пакета.
Пакет позволяет также экспортировать табличные документы в один PDF файл. Для этого предназначен метод пакета ЗаписатьФайлДляПечати(), которому передается полное имя файла.
4 — 08.10.18 — 19:28
shuhard, спасибо огромное, выручил!!!
кому надо вот рабочий кусок кода, для сохранения в эксель
Пакет = Новый ПакетОтображаемыхДокументов;
Пакет.КоличествоЭкземпляров = 2;
ЭлементПакета1 = Пакет.Состав.Добавить();
ЭлементПакета1.Данные = ПоместитьВоВременноеХранилище(ТабДокРеестр);
ЭлементПакета2 = Пакет.Состав.Добавить();
ЭлементПакета2.Данные = ПоместитьВоВременноеХранилище(ТабДок);
Пакет.Записать(СокрЛП(ИмяФайла)+».xls»,ТипФайлаПакетаОтображаемыхДокументов.XLS);
В последнее время мне очень часто приходится работать с таблицами Excel из 1С. Это первая статья, посвященная работе с Excel из 1С и в ней я покажу как сохранять несколько табличный документов в одном, многостраничном файле Excel.
С помощью объекта ПакетОтображаемыхДокументов
Начиная с версии 8.3.3 платформы 1С реализован объект ПакетОтображаемыхДокументов, через который и реализована печать во всех современных типовых конфигурациях. С помощью этого объекта очень легко сформировать многостраничную книгу Excel, т.е. каждый табличный документ выводится на своем листе.
Процедура СформироватьФайлПакетом(ИмяФайла, МассивДанных) Пакет = Новый ПакетОтображаемыхДокументов; Для Каждого ДанныеЛиста Из МассивДанных Цикл АдресВХранилище = ДанныеЛиста[«АдресВХранилище»]; ЭлементПакета = Пакет.Состав.Добавить(); ЭлементПакета.Наименование = ДанныеЛиста[«Имя»]; ЭлементПакета.Данные = АдресВХранилище; КонецЦикла; Попытка Пакет.Записать(ИмяФайла, ТипФайлаПакетаОтображаемыхДокументов.XLSX); ПоказатьПредупреждение(, «Файл выгружен в « + ИмяФайла); Исключение ПоказатьПредупреждение(,«Ошибка выгрузки в « + ИмяФайла); Сообщить(ОписаниеОшибки()); КонецПопытки; КонецПроцедуры
ИмяФайла – имя файла в который будет сохранена книга. Можно перед вызовом функции предлагать пользователю указать каталог, куда будет сохраняться файл, и в параметр передать полный путь до файла, например “D:ФайлыМойФайлЭксель.xlsx”.
МассивДанных — массив соответствий с данными для формирования книги. Массив собираю на сервере. Соответствие представляет из себя коллекцию значений в связки с ключем. Ключи — Имя (имя листа в книге) и АдресВХранилище (адрес табличного документа во временном хранилище).
В отличие от второго варианта файл сохраняется значительно быстрее.
С помощью COM-объекта Excel.Application
Этот вариант подойдет тем, кому приходится работать со старыми версиями платформы. 1С позволяет сохранять табличный документ в эксель:
ТабличныйДокумента.Записать(<ИмяФайла>, <ТипФайлаТаблицы>);
Указав в качестве типа файла таблицы ТипФайлаТабличногоДокумента.XLSX в итоге получим файл Эксель, но в нем мы не увидим привычных листов, соответственно и сохранить несколько табличных документов в одну книгу не получится.
В результате изучения проблемы и поисков в интернете, родился следующий алгоритм, который был реализован в качестве процедуры:
- Открываем Эксель;
- Создаем новую книгу с 1 листом (переменная Книга);
- В цикле каждое табличный документ сохраняем в файл с типом xlsx;
- Открываем файл с выгруженным табличным документом, и копируем лист в нашу рабочую книгу, вставляя последним листом;
- Закрываем временный файл, удаляем из временного хранилища и переходим к следующему табличному документу;
- Последним шагом — сохраняем книгу, закрываем эксель.
&НаКлиенте Процедура СформироватьФайл(ИмяФайла, МассивДанных) ОбъектЭксель = ПолучитьCOMОбъект("", "Excel.Application"); ОбъектЭксель.SheetsInNewWorkbook = 1; ОбъектЭксель.DisplayAlerts = False; Книга = ОбъектЭксель.Workbooks.Add(); Попытка НомерЛиста = 1; Для Каждого ДанныеЛиста Из МассивДанных Цикл АдресВХранилище = ДанныеЛиста["АдресВХранилище"]; ТабличныйДокумента = ПолучитьИзВременногоХранилища(АдресВХранилище); ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx"); ТабличныйДокумента.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.XLSX); ВременнаяКнига = ОбъектЭксель.Workbooks.Open(ИмяВременногоФайла); ЛистИсточник = ВременнаяКнига.WorkSheets(1); ЛистИсточник.Copy(Книга.WorkSheets(НомерЛиста)); Книга.WorkSheets(НомерЛиста).Name = ДанныеЛиста["Имя"]; ВременнаяКнига.Close(0); УдалитьИзВременногоХранилища(АдресВХранилище); НомерЛиста = НомерЛиста + 1; КонецЦикла; Книга.Sheets(НомерЛиста).Delete(); ОбъектЭксель.Workbooks(1).Activate(); Книга.Worksheets(1).Activate(); Книга.SaveAs(ИмяФайла); Книга.Close(0); ОбъектЭксель.Quit(); ОбъектЭксель = Неопределено; ПоказатьПредупреждение(,"Файл выгружен в " + ИмяФайла); Исключение ПоказатьПредупреждение(,"Ошибка выгрузки в " + ИмяФайла); Сообщить(ОписаниеОшибки()); Если ОбъектЭксель <> Неопределено Тогда ОбъектЭксель.Quit(); ОбъектЭксель = Неопределено; КонецЕсли; КонецПопытки; КонецПроцедуры
Dolphinbet
24.06.14 — 13:58
Maxus43
1 — 24.06.14 — 14:01
если ты думаешь что я буду читать там, а потом отвечать тут, когда даже не ты автор темы той — ошибаешся…
описывай проблему тут свою
f_vadim
2 — 24.06.14 — 14:06
если ты думаешь что я буду читать там, тут, а потом отвечать, когда даже не ты автор темы той — ошибаешся…
описывать проблему не нужно
Dolphinbet
3 — 24.06.14 — 14:09
1С 8.3.5 (32-битный). Excel 2010 (64-битный).
Создаю обработку с кодом:
&НаСервере
Процедура ТестExcel(ПутьКФайлу)
excel = Новый COMОбъект("Excel.Application");
excel.WorkBooks.Open(ПутьКФайлу);
КонецПроцедуры
Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (Microsoft Excel): Приложению Microsoft Excel не удается получить доступ к файлу «c:Excel.xls»…
f_vadim
4 — 24.06.14 — 14:09
&НаСервере
не за что
Dolphinbet
5 — 24.06.14 — 14:10
(4) а что с сервером не так?
f_vadim
6 — 24.06.14 — 14:12
(5) всё так, читай теорию, пользуйся поиском, тема обсуждается 2 раза в неделю точно.
Dolphinbet
7 — 24.06.14 — 14:13
(6) погуглил, много разных советов но ничего не подходит. Решения проблемы не нашел в общем
GreatOne
8 — 24.06.14 — 14:13
Что ты хочешь делать с этим файлом дальше? Почему на сервере?
Kalambur
9 — 24.06.14 — 14:13
Доступ
Segate
10 — 24.06.14 — 14:13
(5) у тебя код &наСервере
а файл
>>Локально.
>>c:Excel.xls
Дальше объяснять?
ЗЫ и да, я прочитал тему по ссылке
Dolphinbet
11 — 24.06.14 — 14:14
(10) у меня локально = на сервере
Dolphinbet
12 — 24.06.14 — 14:14
Все крутится на одном компе в общем
Segate
13 — 24.06.14 — 14:15
(12) и у сервера есть доступ на диск C?
Dolphinbet
14 — 24.06.14 — 14:15
(9) доступ к файлу есть у всез пользователей
Dolphinbet
15 — 24.06.14 — 14:16
(13)конечно
GreatOne
16 — 24.06.14 — 14:16
ПИШИ НА КЛИЕНТЕ!!!
Dolphinbet
17 — 24.06.14 — 14:16
(15) + по крайней мере файлы создаются нормально
Dolphinbet
18 — 24.06.14 — 14:16
(16)мне надо в регламентном задании
f_vadim
19 — 24.06.14 — 14:17
(17) а если сделать &НаКлиенте ?
Dolphinbet
20 — 24.06.14 — 14:18
(19) все отрабатывает
Kalambur
21 — 24.06.14 — 14:18
(14) кроме него..
Dolphinbet
22 — 24.06.14 — 14:19
(21) у меня создается файл под этим же пользователем, как у него не может быть доступа на созданный файл?
Segate
23 — 24.06.14 — 14:20
(12) Объясню для людей которых забанили в гугле, на клиенте обращаешься к файлику, пихаешь во временное хранилище, и производишь манипуляции, данные передаешь на сервер и обрабатываешь
f_vadim
24 — 24.06.14 — 14:20
(22) база файловая?
или серверная?
Dolphinbet
25 — 24.06.14 — 14:20
(23) а смысл?
Dolphinbet
26 — 24.06.14 — 14:20
(24) серверная
Dolphinbet
27 — 24.06.14 — 14:21
кто-нибудь может сделать аналогичную простенькую обработку и проверить у себя?)
GreatOne
28 — 24.06.14 — 14:21
(25) нет смысла. Ты все правильно делаешь. 1С сырая еще
f_vadim
29 — 24.06.14 — 14:21
(26) у пользователя от которого запущен сервер не доступа к файлу
Dolphinbet
30 — 24.06.14 — 14:22
(29) я же говорю, что под этим же пользователем и создаю файл…
GreatOne
31 — 24.06.14 — 14:23
(29) на сервере))
GreatOne
32 — 24.06.14 — 14:24
(31) это к 30
f_vadim
33 — 24.06.14 — 14:24
(30) чудес не бывает
попробуй создай его 1с-кой &НаСервере
Dolphinbet
34 — 24.06.14 — 14:25
(32) да, создаю файл отчета в формате xls на сервере, и затем пытаюсь его открыть (на сервере)
Segate
35 — 24.06.14 — 14:26
(25) давай так, если я напишу твою обработку в течении сегодняшнего дня, используя гугл, и то что я тебе сказал, с пруфами конечно, то ты мне платишь 5000? Норм?
Dolphinbet
36 — 24.06.14 — 14:27
(35) а если нет, ты мне?)
f_vadim
37 — 24.06.14 — 14:28
курить права на каталог и файл
проверить, может файл захвачен в момент открытия
Dolphinbet
38 — 24.06.14 — 14:30
(37) это все проверено. У меня встречное предложение, чтобы кто-нибудь потратил 5 минут и написал подобную обработку и отписался о результатах
f_vadim
39 — 24.06.14 — 14:32
(38) написать не проблема — проверить негде )
а текстовый файл без COMа прочитает?
Dolphinbet
40 — 24.06.14 — 14:34
Полный код:
&НаСервере
Функция СформироватьОтчет()
ОтчетПоЦенам = Отчеты.ОтчетПоЦенамГоризонтальный.Создать();
ТабДок = Новый ТабличныйДокумент;
ОтчетПоЦенам.СкомпоноватьРезультат(ТабДок);
ПутьКФайлуотчета= ПутьКОтчету + "" + "ОтчетПоЦенам_" + Формат(ТекущаяДата() , "ДФ=yyyy-MM-dd") + ".XLSX";
ТабДок.Записать(ПутьКФайлуотчета, ТипФайлаТабличногоДокумента.XLSX);
excel = Новый COMОбъект("Excel.Application");
excel.DisplayAlerts = 0;
excel.EnableEvents = 0;
excel.WorkBooks.Open(ПутьКФайлуотчета);
КонецФункции
Dolphinbet
41 — 24.06.14 — 14:37
(39) да, читает
f_vadim
42 — 24.06.14 — 14:38
(41) а если паузу сделать перед
excel.WorkBooks.Open(ПутьКФайлуотчета);
?
Segate
43 — 24.06.14 — 14:39
(38) я уже написал, у меня все работает.
А тебе я советую читать гугл. У тебя 100 пудов 32 разрядный ексель и 64 разрядный 1с или наоборот, так что у меня все отработало без проблем, и это не значит что проблемы нет, но беглый гуглинг кинул меня на сайт где описан подобный метод:
To resolve this issue follow these steps
1. Login to the server as a administrator.
2. Go to «Start» -> «Run» and enter «taskmgr»
3. Go to the process tab in task manager and check «Show Processes from all users»
4. If there are any «Excel.exe» entries on the list, right click on the entry and select «End Process»
5. Close task manager.
6. Go to «Start» -> «Run» and enter «services.msc»
7. Stop the service automating Excel if it is running.
8. Go to «Start» -> «Run» and enter «dcomcnfg»
9. This will bring up the component services window, expand out «Console Root» -> «Computers» -> «DCOM Config»
10. Find «Microsoft Excel Application» in the list of components.
11. Right click on the entry and select «Properties»
12. Go to the «Identity» tab on the properties dialog.
13. Select «The interactive user.»
14. Click the «OK» button.
15. Switch to the services console
16. Start the service automating Excel
17. Test you application again.
hhhh
44 — 24.06.14 — 14:39
(40) но реально проверил пользователя usr1cv8?
Segate
45 — 24.06.14 — 14:40
(40) и вообще… есть тонна ВК, котоыре работают лучше и быстрее, чем ексель поднятый по ком, задумайтесь об этом.
Segate
46 — 24.06.14 — 14:42
+(44)так же предлагаю попробовать создать папки
C:WindowsSysWOW64configsystemprofileDesktop
C:WindowsSystem32configsystemprofileDesktop
Хз зачем, может пользователь из службы excel их исползует… не разбирался
Kalambur
47 — 24.06.14 — 14:43
ПутьКФайлуотчета неправельный
Dolphinbet
48 — 24.06.14 — 15:16
(45) Какие?)
Dolphinbet
49 — 24.06.14 — 15:19
(43) ну у меня вроде все так и есть.. только в службах у меня нет «service automating Excel»
Dolphinbet
50 — 24.06.14 — 15:20
(43) а com-объект запускается под «запускающим пользователем»
Dolphinbet
51 — 24.06.14 — 15:22
(50) о, поставил запускать под текущим пользователем и заработало!
Dolphinbet
52 — 24.06.14 — 15:26
Segate, спасибо!
Segate
53 — 24.06.14 — 15:28
Не за что.
Как я и говорил — 30 секунд гугла решило проблему. с тебя 5к )))
Dolphinbet
54 — 24.06.14 — 15:28
и все-таки что за ВК которые лучше excel?)
Dolphinbet
55 — 24.06.14 — 15:31
мне и самому не нравится excel по кому, но надо кое-что подправить в отчете…
Segate
56 — 24.06.14 — 15:40
Dolphinbet
57 — 24.06.14 — 16:00
(56) это чисто чтение, отформатировать содержимое документа там нельзя…
Segate
58 — 24.06.14 — 16:05
(57) не, тебя что, правда в гугле забанили? Ну поищи чуть чуть, найди нужную… может не нативную, но все же
Dolphinbet
59 — 24.06.14 — 16:07
На чтение 9 мин Просмотров 26.4к. Опубликовано 09.11.2017
MS Excel давно стал стандартом для работы с электронными таблицами. В статье рассматриваются способы программной выгрузки и загрузки из 1С в файлы Excel.
Существует несколько способов программной работы с файлами Excel из 1С. Каждый из них имеет свои преимущества и недостатки.
Содержание
- Обмен через табличный документ
- Обмен через OLE
- Использование COMSafeArray
- Обмен через ADO
- Выгрузка без программирования
Обмен через табличный документ
Данный способ простой. Его суть заключается в том, что объект ТабличныйДокумент имеет методы:
- Записать(<ИмяФайла>, <ТипФайлаТаблицы>) для выгрузки данных в файл;
- Прочитать(<ИмяФайла>, <СпособЧтенияЗначений>) для загрузки данных из файла.
Внимание!
Метод Записать() доступен как на клиенте, так и на сервере. Метод Прочитать() доступен только на стороне сервера. Необходимо помнить об этом
при планировании клиент-серверного взаимодействия.
Рассмотрим пример сохранения табличного документа в файл. Необходимо любым способом создать и заполнить объект ТабличныйДокумент, а выгрузка в файл осуществляется всего лишь одной строкой:
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);
Здесь ТабДок — сформированный табличный документ, ПутьКФайлу — имя файла для выгрузки, ТипФайлаТабличногоДокумента.XLSX — формат создаваемого файла. Поддерживаются следующие форматы Excel:
- XLS95 — формат Excel 95;
- XLS97 — формат Excel 97;
- XLSX — формат Excel 2007.
Загрузка из файла осуществляется также достаточно просто:
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Значение);
Здесь ПутьКФайлу — путь к загружаемому файлу Excel. СпособЧтенияЗначенийТабличногоДокумента.Значение определяет, каким образом нужно интерпретировать данные, считываемые из исходного документа. Доступны варианты:
- Значение;
- Текст.
Обмен через OLE
Обмен через технологию OLE automation, пожалуй, самый распространенный вариант программной работы с файлами Excel. Он позволяет использовать весь функционал, предоставляемый Excel, но отличается медленной скоростью работы по сравнению с другими способами. Для обмена через OLE требуется установка MS Excel:
- На компьютере конечного пользователя, если обмен происходит на стороне клиента;
- На компьютере сервера 1С:Предприятие, если обмен происходит на стороне сервера.
Пример выгрузки:
// Создание COM-объекта
Эксель = Новый COMОбъект(«Excel.Application»);
// Отключение вывода предупреждений и вопросов
Эксель.DisplayAlerts = Ложь;
// Создание новой книги
Книга = Эксель.WorkBooks.Add();
// Позиционирование на первом листе
Лист = Книга.Worksheets(1);// Запись значения в ячейку
Лист.Cells(НомерСтроки, НомерКолонки).Value = ЗначениеЯчейки;// Сохранение файла
Книга.SaveAs(ИмяФайла);// Закрытие Эксель и освобождение памяти
Эксель.Quit();
Эксель = 0;
Примеры чтения:
// —— ВАРИАНТ 1 ——
// Создание COM-объекта
Эксель = Новый COMОбъект(«Excel.Application»);
// Открытие книги
Книга = Эксель.Workbooks.Open(ПутьКФайлу);
// Позиционирование на нужном листе
Лист = Книга.Worksheets(1);// Чтение значения ячейки, обычно здесь располагается цикл обхода ячеек
ЗначениеЯчейки = Лист.Cells(НомерСтроки, НомерКолонки).Value;// Закрытие книги
Книга.Close(0);// Закрытие Эксель и освобождение памяти
Эксель.Quit();
Эксель = 0;// —— ВАРИАНТ 2 ——
// Открытие книги
Книга = ПолучитьCOMОбъект(ПутьКФайлу);
// Позиционирование на нужном листе
Лист = Книга.Worksheets(1);// Чтение значения ячейки, обычно здесь располагается цикл обхода ячеек
ЗначениеЯчейки = Лист.Cells(НомерСтроки, НомерКолонки).Value;// Закрытие книги
Книга.Application.Quit();
Для обхода всех заполненных строк листа Excel можно использовать следующие приемы:
// —— ВАРИАНТ 1 ——
КоличествоСтрок = Лист.Cells(1, 1).SpecialCells(11).Row;
Для НомерСтроки = 1 По КоличествоСтрок Цикл
ЗначениеЯчейки = Лист.Cells(НомерСтроки, НомерКолонки).Value;
КонецЦикла;// —— ВАРИАНТ 2 ——
НомерСтроки = 0;
Пока Истина Цикл
НомерСтроки = НомерСтроки + 1;
ЗначениеЯчейки = Лист.Cells(НомерСтроки, НомерКолонки).Value;
Если НЕ ЗначениеЗаполнено(ЗначениеЯчейки) Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Вместо последовательного обхода всех строк листа можно выгрузить все данные в массив и работать с ним. Такой подход будет быстрее при чтении большого объема данных:
ВсегоКолонок = Лист.Cells(1, 1).SpecialCells(11).Column;
ВсегоСтрок = Лист.Cells(1, 1).SpecialCells(11).Row;Область = Лист.Range(Лист.Cells(1, 1), Лист.Cells(ВсегоСтрок, ВсегоКолонок));
Данные = Область.Value.Выгрузить();
В таблице ниже приведены наиболее востребованные свойства и методы для работы с Excel через OLE:
Действие | Код | Комментарий |
Работа с приложением | ||
Установка видимости окна приложения | Эксель.Visible = Ложь; | |
Установка режима вывода предупреждений (выводить/не выводить) | Эксель.DisplayAlerts = Ложь; | |
Закрытие приложения | Эксель.Quit(); | |
Работа с книгой | ||
Создание новой книги | Книга = Эксель.WorkBooks.Add(); | |
Открытие существующей книги | Книга = Эксель.WorkBooks.Open(ИмяФайла); | |
Сохранение книги | Книга.SaveAs(ИмяФайла); | |
Закрытие книги | Книга.Close(0); | |
Работа с листом | ||
Установка текущего листа | Лист = Книга.WorkSheets(НомерЛиста); | |
Установка имени | Лист.Name = Имя; | |
Установка защиты | Лист.Protect(); | |
Снятие защиты | Лист.UnProtect(); | |
Установка ориентации страницы | Лист.PageSetup.Orientation = 2; | 1 — книжная, 2 — альбомная |
Установка левой границы | Лист.PageSetup.LeftMargin = Эксель.CentimetersToPoints(Сантиметры); | |
Установка верхней границы | Лист.PageSetup.TopMargin = Эксель.CentimetersToPoints(Сантиметры); | |
Установка правой границы | Лист.PageSetup.RightMargin = Эксель.CentimetersToPoints(Сантиметры); | |
Установка нижней границы | Лист.PageSetup.BottomMargin = Эксель.CentimetersToPoints(Сантиметры); | |
Работа со строками, колонками, ячейками | ||
Установка ширины колонки | Лист.Columns(НомерКолонки).ColumnWidth = Ширина; | |
Удаление строки | Лист.Rows(НомерСтроки).Delete(); | |
Удаление колонки | Лист.Columns(НомерКолонки).Delete(); | |
Удаление ячейки | Лист.Cells(НомерСтроки, НомерКолонки).Delete(); | |
Установка значения | Лист.Cells(НомерСтроки, НомерКолонки).Value = Значение; | |
Объединение ячеек | Лист.Range(Лист.Cells(НомерСтроки, НомерКолонки), Лист.Cells(НомерСтроки1, НомерКолонки1)).Merge(); | |
Установка шрифта | Лист.Cells(НомерСтроки, НомерКолонки).Font.Name = ИмяШрифта; | |
Установка размера шрифта | Лист.Cells(НомерСтроки, НомерКолонки).Font.Size = РазмерШрифта; | |
Установка жирного шрифта | Лист.Cells(НомерСтроки, НомерКолонки).Font.Bold = 1; | 1 — жирный шрифт, 0 — нормальный |
Установка курсива | Лист.Cells(НомерСтроки, НомерКолонки).Font.Italic = 1; | 1 — курсив, 0 — нормальный |
Установка подчеркнутого шрифта | Лист.Cells(НомерСтроки, НомерКолонки).Font.Underline = 2; | 2 — подчеркнутый, 1 — нет |
Для того, чтобы узнать какое свойство нужно менять или какой метод вызвать можно воспользоваться макросами Excel. Если записать макрос с требуемыми действиями, то после можно посмотреть программный код на VBA записанного макроса.
Использование COMSafeArray
При выгрузке больших объемов данных из 1С в Excel для ускорения можно использовать объект COMSafeArray. Согласно определению из синтакс-помощника, COMSafeArray — объектная оболочка над многомерным массивом SafeArray из COM. Позволяет создавать и использовать SafeArray для обмена данными между COM-объектами. Проще говоря, это массив значений, который можно использовать для обмена между приложениями по технологии OLE.
// Создание COMSafeArray
МассивКом = Новый COMSafeArray(«VT_Variant», ВсегоКолонок, ВсегоСтрок);
// Заполнение COMSafeArray
Для Стр = 0 По ВсегоСтрок — 1 Цикл
Для Кол = 0 По ВсегоКолонок — 1 Цикл
МассивКом.SetValue(Кол, Стр, Значение);
КонецЦикла;
КонецЦикла;
// Присвоение области листа Excel значений из COMSafeArray
Лист.Range(Лист.Cells(1, 1), Лист.Cells(ВсегоСтрок, ВсегоКолонок)).Value = МассивКом;
Обмен через ADO
Файл Excel при обмене через ADO представляет собой базу данных, к которой можно обращаться при помощи SQL-запросов. Установка MS Excel не требуется, но обязательно наличие драйвера ODBC, при помощи которого будет осуществляться доступ. Используемый драйвер ODBC определяется при указании строки соединения к файлу. Обычно требуемый драйвер уже установлен на компьютере.
Обмен через ADO заметно быстрее обмена через OLE, но при выгрузке нет возможности использовать функционал Excel для оформления ячеек, разметки страниц, задания формул и т.д.
Пример выгрузки:
// Создание COM-объекта для соединения
Соединение = Новый COMОбъект(«ADODB.Connection»);// Установка строки соединения
Соединение.ConnectionString = «
|Provider=Microsoft.ACE.OLEDB.12.0;
|Data Source=»+ИмяФайла+«;
|Extended Properties=»»Excel 12.0 XML;HDR=YES»»;»;
Соединение.Open(); // Открытие соединения// Создание COM-объекта для команды
Команда = Новый COMОбъект(«ADODB.Command»);
Команда.ActiveConnection = Соединение;// Присвоение текста команды для создания таблицы
Команда.CommandText = «CREATE TABLE [Лист1] (Колонка1 char(255), Колонка2 date, Колонка3 int, Колонка4 float)»;
Команда.Execute(); // Выполнение команды// Присвоение текста команды для добавления строки таблицы
Команда.CommandText = «INSERT INTO [Лист1] (Колонка1, Колонка2, Колонка3, Колонка4) values (‘абвгдеё’, ‘8/11/2017’, ‘12345’, ‘12345,6789’)»;
Команда.Execute(); // Выполнение команды// Удаление команды и закрытие соединения
Команда = Неопределено;
Соединение.Close();
Соединение = Неопределено;
Для создания нового листа и формирования его структуры можно воспользоваться объектами ADOX.Catalog и ADOX.Table. В этом случае код примет вид:
// Создание COM-объекта для работы с книгой
Книга = Новый COMОбъект(«ADOX.Catalog»);
Книга.ActiveConnection = Соединение;// Создание COM-объекта для работы со структурой данных на листе
Таблица = Новый COMОбъект(«ADOX.Table»);
Таблица.Name = «Лист1»;
Таблица.Columns.Append(«Колонка1», 202);
Таблица.Columns.Append(«Колонка2», 7);
Таблица.Columns.Append(«Колонка3», 5);
Таблица.Columns.Append(«Колонка4», 5);// Создание в книге листа с описанной структурой
Книга.Tables.Append(Таблица);
Таблица = Неопределено;
Книга = Неопределено;
В приведенном примере в методе
Таблица.Columns.Append(«Колонка1», 202);
во втором параметре указывается тип колонки. Параметр необязательный, вот некоторые значения типа колонки:
- 5 — adDouble;
- 6 — adCurrency;
- 7 — adDate;
- 11 — adBoolean;
- 202 — adVarWChar;
- 203 — adLongVarWChar.
Пример чтения:
// Создание COM-объекта для соединения
Соединение = Новый COMОбъект(«ADODB.Connection»);// Установка строки соединения
Соединение.ConnectionString = «
|Provider=Microsoft.ACE.OLEDB.12.0;
|Data Source=»+ИмяФайла+«;
|Extended Properties=»»Excel 12.0 XML;HDR=YES»»;»;
Соединение.Open(); // Открытие соединения// Создание COM-объекта для получения выборки
Выборка = Новый COMОбъект(«ADODB.Recordset»);
ТекстЗапроса = «SELECT * FROM [Лист1$]»;// Выполнение запроса
Выборка.Open(ТекстЗапроса, Соединение);// Обход результата выборки
Пока НЕ Выборка.EOF() Цикл
ЗначениеКолонки1 = Выборка.Fields.Item(«Колонка1»).Value; // Обращение по имени колонки
ЗначениеКолонки2 = Выборка.Fields.Item(0).Value; // Обращение по индексу колонки
Выборка.MoveNext();
КонецЦикла;Выборка.Close();
Выборка = Неопределено;
Соединение.Close();
Соединение = Неопределено;
В строке соединения параметр HDR определяет как будет восприниматься первая строка на листе. Возможны варианты:
- YES — первая строка воспринимается как названия колонок. К значениям можно обращаться по имени и по индексу колонки.
- NO — первая строка воспринимается как данные. К значениям можно обращаться только по индексу колонки.
В приведенных примерах рассмотрено лишь несколько объектов ADO. Объектная модель ADO состоит из следующих объектов:
- Connection;
- Command;
- Recordset;
- Record;
- Fields;
- Stream;
- Errors;
- Parameters;
- Properties.
Выгрузка без программирования
Для сохранения данных из 1С в Excel не всегда целесообразно прибегать к программированию. Если в режиме Предприятия пользователь может отобразить требуемые для выгрузки данные, то, их возможно сохранить в Excel без программирования.
Для сохранения табличного документа (например, результата отчета) можно вызвать команду Сохранить или Сохранить как… главного меню.
В открывшемся окне требуется выбрать каталог, имя и формат сохраняемого файла.
Для сохранения данных динамических списков (например, списка номенклатуры) необходимо:
- Вывести данные в табличный документ при помощи команды Еще ⇒ Вывести список…;
- Сохранить табличный документ в требуемый формат.
Проблема не решилась
Изначально база лежит на сервере — Режим: Серверный (сжатие усиленное)
Выгрузил ее (для экспериментов) — Режим: Файловый (без сжатия)
Сделал ВнешнююОбработку
Все работает, открывается Excel, создается лист, выгружаются данные (да, действительно тот еще геморрой). Был безумно счастлив, но не долго…
Подключаю обработку к рабочей базе (на сервере) и…
На строке:
1C | ||
|
Получаю:
Ошибка при запуске Microsoft Excel.
{ВнешняяОбработка.ОтчетПоБанку.МодульОбъекта(70)}: Ошибка при вызове конструктора (COMОбъект): -2147221005(0x800401F3): Недопустимая строка с указанием класса : -2147221005(0x800401F3): Недопустимая строка с указанием класса
Попробовал так:
1C | ||
|
Получил:
Ошибка при запуске Microsoft Excel.
{ВнешняяОбработка.ОтчетПоБанку.МодульОбъекта(72)}: Ошибка при вызове метода контекста (ПолучитьCOMОбъект): Ошибка получения объекта COM: -2147221014(0x800401EA): Не удается открыть файл при помощи специального имени
Помогите, че за ерунда?