Имя: Пароль:
1C
1С v8
1С и Ексель
,
0 bard666
 
15.05.15
10:30
Столкнулся со следущим: При сохранении файла ексель в 1С вылетает ошибка:
Ошибка при вызове метода контекста (Save)
                ТекущийДокЕксель.Save();
по причине:
Произошла исключительная ситуация (Microsoft Excel): Метод Save из класса Application завершен неверно

Порылся на форумах, внятного ответа как исправить не нашёл.

Делается следущее: есть файл екселя (.xls) с заданной структурой, в него вносятся данные, сохраняются, отсылаются на почты.

Может ли быть такая ошибка из-за того, что на сервере, где выполняется обработка стоит 2013 офис и файл открывается в режиме совместимости? Как это обходить?
1 bard666
 
15.05.15
10:59
Метод saveAs вообще не обнаружен.
2 Ненавижу 1С
 
гуру
15.05.15
11:01
может прав нет на место сохранения?
3 bard666
 
15.05.15
11:01
Никто не сталкивался?
4 bard666
 
15.05.15
11:02
Права есть. Если просто открыть екселем, изменить и сохранить как - все прокатывает, а через 1С сохранить не получается.
5 bard666
 
15.05.15
11:04
Создается файлик, но ячейки пустые. Формат вроде нужный - .xls
6 Ненавижу 1С
 
гуру
15.05.15
11:05
(4) если это делается на сервере, то права надо смотреть у пользователя под кем работает служба сервера приложений
7 фобка
 
15.05.15
11:13
Новая книга? Попобуй saveas()
8 bard666
 
15.05.15
11:13
(6) Попробую уточнить. По результатам отпишусь.
9 bard666
 
15.05.15
11:13
(7) При этом методе
Метод объекта не обнаружен (SaveAs) ТекущийДокЕксель.SaveAs(КаталогДанных + "\" + ТекИмя);
10 фобка
 
15.05.15
11:14
Текущийдокэксель это книга или аппликейшн?
11 фобка
 
15.05.15
11:17
Ну кароч ты книгу должен сохранять. Покажи что присваиваешь текущийдокэксель
12 bard666
 
15.05.15
11:32
До меня делалось:

Код функции, которая возвращает ТекущийДок



Excel    = 0;
    
    Попытка
        Excel = Новый COMОбъект("Excel.Application");
    Исключение
        Сообщить("Не удалось инициализировать Excel");
        Возврат Неопределено;
    КонецПопытки;
    
    Попытка
        тИмяСупера    = СокрЛП(Супервайзер.Наименование);
        тИмяСупера    = СтрЗаменить(тИмяСупера, "#", "");
        чПоз    = Найти(тИмяСупера, " ");
        Если чПоз > 0 Тогда
            тИмяСупера    = СокрЛП(Лев(тИмяСупера, чПоз));
        КонецЕсли;
        
        тТекстАшан    = "";
        чПозНайшлиАшан    = Найти(Должность.Наименование, "АШАН");
        Если чПозНайшлиАшан > 0 Тогда
            тТекстАшан    = "_ashan";
        КонецЕсли;
        
        ИмяФайлаКопия = тИмяСупера + "_" + СокрЛП(Должность.Должность) + тТекстАшан + "_" + СокрЛП(Должность.Код) + "_"+Месяц(ТекущаяДата());    
        ИмяФайлаКопия = СтрЗаменить(ИмяФайлаКопия,"00000","");
        ИмяТекужегоДокументаЕксель = СокрЛП(КаталогДанных) + "\" + ИмяФайлаКопия + ".xls";
        
        Попытка
            КопироватьФайл(ИмяФайла, ИмяТекужегоДокументаЕксель);         
            Excel.Workbooks.Open(ИмяТекужегоДокументаЕксель);
        Исключение
            Сообщить("Некорректное имя файла при копировании (" + ИмяФайла + ") в (" + ИмяТекужегоДокументаЕксель + ")");
            Excel    = 0;
        КонецПопытки;
        
    Исключение
        Сообщить(ОписаниеОшибки());
        Excel.Quit();
        Excel    = 0;
    КонецПопытки;

    Возврат Excel;
13 фобка
 
15.05.15
11:33
(12) в данном случае текущийдок это не книга
14 фобка
 
15.05.15
11:34
Текдок.activeworkbook
15 фобка
 
15.05.15
11:35
И да - в (12) копрокод
16 bard666
 
15.05.15
11:37
(15) Пробовал

ТекущийДокЕксель.Application.Workbooks.SaveAs(КаталогДанных + "\" + ТекИмя);

ТекущийДокЕксель.Workbooks.SaveAs(КаталогДанных + "\" + ТекИмя);

Также не видит функцию
17 bard666
 
15.05.15
11:43
(15)
{Форма.Форма.Форма(571)}: Ошибка при вызове метода контекста (SaveAs)
                ТекущийДокЕксель.ActiveWorkbook.SaveAs(КаталогДанных + "\" + ТекИмя);
по причине:
Произошла исключительная ситуация (Microsoft Excel): Метод SaveAs из класса Workbook завершен неверно
18 фобка
 
15.05.15
11:43
(16) workbooks это не workbook - другой объект
19 Wern
 
15.05.15
11:43
(16) смотри (12). то что у тебя все неправильное написание.
20 фобка
 
15.05.15
11:44
Ответ дан выше, перечитай (14)
21 bard666
 
15.05.15
11:46
(20) я в (17) показал какая ошибка выпадает при ТекущийДокЕксель.ActiveWorkbook
22 bard666
 
15.05.15
11:47
(19) где неправильно?
23 фобка
 
15.05.15
11:47
Сообщить(каталогданных+"\"+текимя);
24 bard666
 
15.05.15
11:58
(23) Здесь все четко.
"F:\Ведомости\имя.xls"
25 фобка
 
15.05.15
12:01
(24) Если файл существует попробуй опять save(). Для saveas можно вторым параметром задать формат файла еще
26 bard666
 
15.05.15
12:07
(25) Я ж говорю - ошибка есть, но файл пустой появляется..)
27 bard666
 
15.05.15
12:10
(25) Попробовал передать формат

{Форма.Форма.Форма(571)}: Ошибка при вызове метода контекста (SaveAs)
                ТекущийДокЕксель.ActiveWorkbook.SaveAs(КаталогДанных + "\" + ТекИмя, ".xls");
по причине:
Произошла исключительная ситуация (Microsoft Excel): Метод SaveAs из класса Workbook завершен неверно
28 фобка
 
15.05.15
12:13
(27) не, формат это число. Передай туда 50
29 фобка
 
15.05.15
12:16
Существует ли на сервере f:\ведомости?
30 bard666
 
15.05.15
12:17
(28) Создал. Ура! Осталось протестировать откроет ли 2003 офис
31 фобка
 
15.05.15
12:22
(30) Вбей в справке по vba xlFileFormat
32 bard666
 
15.05.15
12:56
(31) а в Save есть подобные параметры?
33 фобка
 
15.05.15
13:12
(32) нет, он вообще без параметров
34 bard666
 
15.05.15
13:20
(33) Тогда ладно. Файлики создаются.
Есть ещё вопрос.
Обработина, сделанная по образу и подобию

http://catalog.mista.ru/public/88055/

ругается на .Windows(1).Visible = 1;
35 фобка
 
15.05.15
13:28
(34) значит опять путанница с объектами
36 bard666
 
15.05.15
13:29
Код такой:

ТабДок = Новый табличныйДокумент;
    АктивныйДокумент = ПолучитьМакет("Макет");  //-- Макет Active Document лист Ексель.
    КомОбъект = АктивныйДокумент.Получить();    

    //--- далее пишем в Cells(НомерСтроки, НомерСтолбца). Value  все что нужно. см.пример ниже
    //шапка
    Лист=КомОбъект.Sheets(1);
    
        
    Лист.Cells(9,4).Value=Идент;
    Лист.Cells(10,4).Value=Док.Организация.ПолноеНаименование();
    Лист.Cells(11,4).Value=НомерКонтракта;
    Лист.Cells(12,4).Value= ?(ЗначениеЗаполнено(Дата), Формат(Дата, "ДФ=dd.MM.yyyy"), Формат(Док.Дата, "ДФ=dd.MM.yyyy"));
    Лист.Cells(13,4).Value=НомРеестра;
    СимволовДоНулей=Найти(ДокППИ.Номер,"0");
    НомППИ=Число(Прав(ДокППИ.Номер,СтрДлина(ДокППИ.Номер)-СимволовДоНулей-1));
    Лист.Cells(14,4).Value=СокрЛП(Формат(НомППИ, "ЧГ=0"));
    Лист.Cells(15,4).Value=Формат(ДокППИ.Дата, "ДФ=dd.MM.yyyy");
    
    //Зарплата к выплате организаций
    РезультатЗапроса = Запрос.Выполнить();
    
    Если НЕ(РезультатЗапроса.Пустой()) Тогда
        
        //СтрокаОтчета = Лист.Range("Строка");
        СтрокаОтчета = Лист.Range("A20");
        Счетчик=0;
        Итого=0;
        Выборка=РезультатЗапроса.Выбрать();
        Пока Выборка.Следующий() Цикл
            Счетчик=Счетчик+1;
            Если Счетчик>1 Тогда
                СтрокаОтчета.EntireRow.Copy();
                СтрокаОтчета.EntireRow.Insert();
            КонецЕсли;
            //ТекСтрока = СтрокаОтчета.Range("A"+(СтрокаОтчета.Row-1));
            //ТекСтрока.Cells(СтрокаОтчета.Row-1,1).Value="Вася";
            //ТекСтрока.Find("<ИмяСотрудника>").Value = СокрЛП(Выборка.ФизЛицоПолностью);
            Лист.Cells(19+Счетчик,1).Value=СокрЛП(Выборка.ФизЛицоПолностью);
            Лист.Cells(19+Счетчик,4).Value=СокрЛП(Выборка.ЛицевойСчет);
            Лист.Cells(19+Счетчик,6).Value=Число(СокрЛП(Выборка.Сумма));
            Итого=Итого+Выборка.Сумма;
        КонецЦикла;
    КонецЕсли;
    
    //итоговая строка
    Лист.Cells(19+Счетчик+1,4).Value=СчетКонтракта;
    Лист.Cells(19+Счетчик+1,6).Value=Итого;
    
    Лист.Cells(19+Счетчик+20,1).Value="";   //заплатка с целью увидеть макет целиком

    КомОбъект.Application.Visible = 1;
    КомОбъект.Windows(1).Visible = 1;
    
    КомОбъект.Activate();
37 bard666
 
15.05.15
13:30
(35) выложил код. Запросы всякие вырезал.
38 bard666
 
15.05.15
13:32
Вся эта ботва вылезла когда поставили 2013 офис)
39 DomovoiAtakue
 
15.05.15
13:43
Отдельный момент.
Я может ошибаюсь: по коду если все удачно сохранилось, то объект excel не удаляется.
40 bard666
 
15.05.15
13:45
(39) не совсем понимаю к чему это..
41 bard666
 
15.05.15
13:48
Ошибка такая: Ошибка при вызове метода контекста (Windows)
    КомОбъект.Windows(1).Visible = 1;
по причине:
Произошла исключительная ситуация (0x8002000b)
42 DomovoiAtakue
 
15.05.15
13:54
(40)Ну если я все правильно понимаю, то 10 раз запустите свой код, не выходя из 1с, и в процессах будет висеть 10 excel-ей.
43 bard666
 
15.05.15
14:01
(42) Это все проверяю
44 bard666
 
15.05.15
14:02
У меня просто открывается ексель как приложение, а окна документа не видно. Серый экран.
45 bard666
 
15.05.15
14:08
А со второго раза создает.
46 bard666
 
15.05.15
14:26
Придумал как поправить:

Вместо

КомОбъект.Application.Visible = 1;
    КомОбъект.Windows(1).Visible = 1;
    
    КомОбъект.Activate();

Делаю
    
    
    КомОбъект.Activate();
    КомОбъект.Windows(1).Visible = 1;