Имя: Пароль:
1C
1С v8
Табличный документ из 1С на новый лист существующей книги Excel
,
0 AleksandrUs75
 
26.05.14
11:11
Есть внешняя обработка по созданию некой табличной части, в модуле формы которой имеется код:

ИмяФайла = Объект.Каталог + "\" + Объект.ИмяФайла + ".xlsx";
ТабДок.Записать(ИмяФайла,ТипФайлаТабличногоДокумента.XLSX);

В результате которого создается новая книга Excel.
Но, есть уже готовая книга с соответствующими листами.
Вопрос, как изменить код, чтобы открывалась именно эта книга, добавлялся лист (с определенным именем, если такого еще нет) и уже в него выгружался табличный документ?
1 kobzon
 
26.05.14
11:46
В результате этого ничего не создается!
2 Crush
 
26.05.14
11:53
(0) Создать файл через 1С, и дальше работать экселевскими шестеренками.

1. Открыть созданный файл;
2. Открыть имеющийся файл;
3. Выбрать всё. Скопировать.
4. Добавить лист. Вставить.:)

Сначала сделай вручную с записью макроса. Потом примени этот макрос в 1С.
3 Crush
 
26.05.14
11:59
+ (2) ну и погуглить немного
http://www.planetaexcel.ru/techniques/3/49/
4 Яйца 1С
 
26.05.14
12:01
+ права на папку
5 AleksandrUs75
 
26.05.14
13:01
(2) (3) Посредством Excel, это понятно, но заказчик не желает производить ни каких дополнительных манипуляций, хотят чтоб из 1С, сразу...
Поэтому и вопрос, может-ли 1С "сама" добавить лист в существующую книгу Excel?
6 Crush
 
26.05.14
13:20
1С умеет выполнять в экселе работу пользователя. Ищи 1С + Эксель
7 AleksandrUs75
 
26.05.14
13:30
(6) Значит все таки может! Спасибо, пошел искать :)
8 kobzon
 
26.05.14
13:31
(7) Тут глянь может поможет: http://exp-1c.narod.ru/articles/articl01.htm
9 AleksandrUs75
 
26.05.14
13:39
(8) Уже смотрю, спасибо.
10 AleksandrUs75
 
28.05.14
10:45
Проблема не решилась :(
Изначально база лежит на сервере - Режим: Серверный (сжатие усиленное)
Выгрузил ее (для экспериментов) - Режим: Файловый (без сжатия)

Сделал ВнешнююОбработку
Все работает, открывается Excel, создается лист, выгружаются данные (да, действительно тот еще геморрой). Был безумно счастлив, но не долго…
Подключаю обработку к рабочей базе (на сервере) и…

На строке:
<CODE>ExcelПриложение = Новый COMОбъект("Excel.Application");</CODE>
Получаю:

Ошибка при запуске Microsoft Excel.
{ВнешняяОбработка.ОтчетПоБанку.МодульОбъекта(70)}: Ошибка при вызове конструктора (COMОбъект): -2147221005(0x800401F3): Недопустимая строка с указанием класса : -2147221005(0x800401F3): Недопустимая строка с указанием класса

Попробовал так:
<CODE>ExcelПриложение = ПолучитьCOMОбъект("D:\1.xlsx");</CODE>
Получил:

Ошибка при запуске Microsoft Excel.
{ВнешняяОбработка.ОтчетПоБанку.МодульОбъекта(72)}: Ошибка при вызове метода контекста (ПолучитьCOMОбъект): Ошибка получения объекта COM: -2147221014(0x800401EA): Не удается открыть файл при помощи специального имени

Помогите, че за ерунда?
11 Irbis
 
28.05.14
10:47
КнигаТемп=Excel.WorkBooks.Open(КаталогВременныхФайлов()+"TempAPP.xls");
    ЛистТемп=КнигаТемп.WorkSheets(1);
    //Лист=Книга.WorkSheets.Add();
    ЛистТемп.Copy(Книга.WorkSheets(1));
    Книга.WorkSheets(1).Name="ОПТАН-Челябинск, Чел.-Южный";
    КнигаТемп.Close();
    УдалитьФайлы(КаталогВременныхФайлов()+"TempAPP.xls");
12 f_vadim
 
28.05.14
10:48
(10) а код где исполняется? а excel на сервере есть?
13 AleksandrUs75
 
28.05.14
10:51
(12) код в модуле объекта внешней обработки
Excel на сервере??? а кто его знает...
14 1cVandal
 
28.05.14
10:52
Excel = Новый COMОбъект("Excel.Application");
    Книга = Excel.Workbooks.Add();

        Excel.DisplayAlerts = False;
            Книга.SaveAs(ФайлДанных); // если удастся найти способ копировать лист из временного файла в текущую открытую книгу, то от этого нагроможденая записей и открытий файла можно будет избавиться
            Excel.Workbooks(тФайл.Имя).Close();
            Книга = Excel.Workbooks.Open(ФайлДанных);
            Excel.DisplayAlerts = True;
            
            ВремФайл = ПолучитьИмяВременногоФайла(РасширениеФайлаExcel); // для сброса в него mxl-ки с бухгалтерской отчетностью
            вФайл = Новый Файл(ВремФайл);
            ПечатнаяФорма.Записать(ВремФайл, ?(РасширениеФайлаExcel = "xlsx", ТипФайлаТабличногоДокумента.XLSX, ТипФайлаТабличногоДокумента.XLS));
            Excel.Workbooks.Open(ВремФайл);
            
            InBook    = Excel.Workbooks.Item(вФайл.Имя);
            OutBook    = Excel.Workbooks.Item(тФайл.Имя);
            InSheet = InBook.Sheets("TDSheet"); // потому что сформированный из mxl-ки лист Excel получает по умолчанию имя "TDSheet"
            InSheet.Copy(OutBook.Worksheets(1));
            
            Лист = OutBook.Worksheets("TDSheet");
            Лист.Name = НазваниеЛиста.Значение;
            
            Excel.Workbooks(вФайл.Имя).Close();
            СтеретьФайл(ВремФайл);
15 1cVandal
 
28.05.14
10:53
грубо говоря есть файл эксель А, ты сохранняешь свою инфу в файл Б, затем копируешь из Б в А в новый лист
16 f_vadim
 
28.05.14
10:53
(13) хммм... ок. толстый клиент?
&НаСервере &НаКлиенте - о чём нибудь говорит?
17 1cVandal
 
28.05.14
10:55
не зареган у тебя эксель на сервере
18 f_vadim
 
28.05.14
10:56

Новый COMОбъект("Excel.Application")

без установленного екселя не взлетит.
ваш КО
19 AleksandrUs75
 
28.05.14
10:57
т.е. на сервере, где лежит база, обязательно должен быть Excel, и по другому ни как?
20 f_vadim
 
28.05.14
10:59
(19) excel должен быть там, где исполняется код.
21 Irbis
 
28.05.14
10:59
(19) Эксель должен быть там где выполняется код по созданию объекта Эксель, а на сервере это или нет дело второстепенное
22 AleksandrUs75
 
28.05.14
11:02
попробую перенести код на клиента, посмотрим че выйдет...
23 AleksandrUs75
 
28.05.14
14:12
Перенес, все ОК!
Всем спасибо!