Ошибка при вызове метода контекста save excel

   bard666

15.05.15 — 10:30

Столкнулся со следущим: При сохранении файла ексель в 1С вылетает ошибка:

Ошибка при вызове метода контекста (Save)

                ТекущийДокЕксель.Save();

по причине:

Произошла исключительная ситуация (Microsoft Excel): Метод Save из класса Application завершен неверно

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

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

Может ли быть такая ошибка из-за того, что на сервере, где выполняется обработка стоит 2013 офис и файл открывается в режиме совместимости? Как это обходить?

   bard666

1 — 15.05.15 — 10:59

Метод saveAs вообще не обнаружен.

   Ненавижу 1С

2 — 15.05.15 — 11:01

может прав нет на место сохранения?

   bard666

3 — 15.05.15 — 11:01

Никто не сталкивался?

   bard666

4 — 15.05.15 — 11:02

Права есть. Если просто открыть екселем, изменить и сохранить как — все прокатывает, а через 1С сохранить не получается.

   bard666

5 — 15.05.15 — 11:04

Создается файлик, но ячейки пустые. Формат вроде нужный — .xls

   Ненавижу 1С

6 — 15.05.15 — 11:05

(4) если это делается на сервере, то права надо смотреть у пользователя под кем работает служба сервера приложений

   фобка

7 — 15.05.15 — 11:13

Новая книга? Попобуй saveas()

   bard666

8 — 15.05.15 — 11:13

(6) Попробую уточнить. По результатам отпишусь.

   bard666

9 — 15.05.15 — 11:13

(7) При этом методе

Метод объекта не обнаружен (SaveAs) ТекущийДокЕксель.SaveAs(КаталогДанных + «» + ТекИмя);

   фобка

10 — 15.05.15 — 11:14

Текущийдокэксель это книга или аппликейшн?

   фобка

11 — 15.05.15 — 11:17

Ну кароч ты книгу должен сохранять. Покажи что присваиваешь текущийдокэксель

   bard666

12 — 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) копрокод

   bard666

16 — 15.05.15 — 11:37

(15) Пробовал

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

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

Также не видит функцию

   bard666

17 — 15.05.15 — 11:43

(15)

{Форма.Форма.Форма(571)}: Ошибка при вызове метода контекста (SaveAs)

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

по причине:

Произошла исключительная ситуация (Microsoft Excel): Метод SaveAs из класса Workbook завершен неверно

   фобка

18 — 15.05.15 — 11:43

(16) workbooks это не workbook — другой объект

   Wern

19 — 15.05.15 — 11:43

(16) смотри (12). то что у тебя все неправильное написание.

   фобка

20 — 15.05.15 — 11:44

Ответ дан выше, перечитай (14)

   bard666

21 — 15.05.15 — 11:46

(20) я в (17) показал какая ошибка выпадает при ТекущийДокЕксель.ActiveWorkbook

   bard666

22 — 15.05.15 — 11:47

(19) где неправильно?

   фобка

23 — 15.05.15 — 11:47

Сообщить(каталогданных+»»+текимя);

   bard666

24 — 15.05.15 — 11:58

(23) Здесь все четко.

«F:Ведомостиимя.xls»

   фобка

25 — 15.05.15 — 12:01

(24) Если файл существует попробуй опять save(). Для saveas можно вторым параметром задать формат файла еще

   bard666

26 — 15.05.15 — 12:07

(25) Я ж говорю — ошибка есть, но файл пустой появляется..)

   bard666

27 — 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:ведомости?

   bard666

30 — 15.05.15 — 12:17

(28) Создал. Ура! Осталось протестировать откроет ли 2003 офис

   фобка

31 — 15.05.15 — 12:22

(30) Вбей в справке по vba xlFileFormat

   bard666

32 — 15.05.15 — 12:56

(31) а в Save есть подобные параметры?

   фобка

33 — 15.05.15 — 13:12

(32) нет, он вообще без параметров

   bard666

34 — 15.05.15 — 13:20

(33) Тогда ладно. Файлики создаются.

Есть ещё вопрос.

Обработина, сделанная по образу и подобию

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

ругается на .Windows(1).Visible = 1;

   фобка

35 — 15.05.15 — 13:28

(34) значит опять путанница с объектами

   bard666

36 — 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();

   bard666

37 — 15.05.15 — 13:30

(35) выложил код. Запросы всякие вырезал.

   bard666

38 — 15.05.15 — 13:32

Вся эта ботва вылезла когда поставили 2013 офис)

   DomovoiAtakue

39 — 15.05.15 — 13:43

Отдельный момент.

Я может ошибаюсь: по коду если все удачно сохранилось, то объект excel не удаляется.

   bard666

40 — 15.05.15 — 13:45

(39) не совсем понимаю к чему это..

   bard666

41 — 15.05.15 — 13:48

Ошибка такая: Ошибка при вызове метода контекста (Windows)

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

по причине:

Произошла исключительная ситуация (0x8002000b)

   DomovoiAtakue

42 — 15.05.15 — 13:54

(40)Ну если я все правильно понимаю, то 10 раз запустите свой код, не выходя из 1с, и в процессах будет висеть 10 excel-ей.

   bard666

43 — 15.05.15 — 14:01

(42) Это все проверяю

   bard666

44 — 15.05.15 — 14:02

У меня просто открывается ексель как приложение, а окна документа не видно. Серый экран.

   bard666

45 — 15.05.15 — 14:08

А со второго раза создает.

  

bard666

46 — 15.05.15 — 14:26

Придумал как поправить:

Вместо

КомОбъект.Application.Visible = 1;

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

    
    КомОбъект.Activate();

Делаю

    
    
    КомОбъект.Activate();

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

Автор leklerk85, 14 июн 2021, 20:01

0 Пользователей и 1 гость просматривают эту тему.

Добрый день! Подскажите пожалуйста, как можно решить проблему. В регл. задании формируется файл Excel и записывается, но при записи ошибка «Ошибка при вызове метода контекста (SaveAs): Произошла исключительная ситуация (Microsoft Excel): Метод SaveAs из класса Workbook завершен неверно». В файле Excel 2 листа, в каждом из которых в среднем около 50-60 тысяч строк.


Решить проблему можно отказом от OLE и формированием и сохранением файла средствами 1С.


Вы имеете в виду сформировать через табличный документ и записать через ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX)? Сегодня попробовал, всё равно ошибка «Ошибка при вызове метода контекста (Записать): Ошибка доступа к файлу ‘\мой_путьмой_ файл.xlsx'». Папка «мой_путь» на момент записи файла была создана.


Цитата: leklerk85 от 16 июн 2021, 08:08
Вы имеете в виду сформировать через табличный документ и записать через ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX)? Сегодня попробовал, всё равно ошибка «Ошибка при вызове метода контекста (Записать): Ошибка доступа к файлу ‘\мой_путьмой_ файл.xlsx'». Папка «мой_путь» на момент записи файла была создана.

а на сервере доступна эта созданная папка?


На другом форуме подсказали — на папку, куда сохраняется Эксель, надо дать права пользователю, под которым выполняется регл. задание (USR1CV8). Скорее всего, из-за этого ошибка.


Цитата: leklerk85 от 16 июн 2021, 12:56
На другом форуме подсказали — на папку, куда сохраняется Эксель, надо дать права пользователю, под которым выполняется регл. задание (USR1CV8). Скорее всего, из-за этого ошибка.

Да, причина была именно в этом — всё заработало сегодня, когда дали права на папку!


  • Форум 1С

  • Форум 1С — ПРЕДПРИЯТИЕ 8.0 8.1 8.2 8.3 8.4

  • Конфигурирование, программирование в 1С Предприятие 8

  • Ошибка при сохранении файла Excel из регламентного задания

Похожие темы (5)

Рейтинг@Mail.ru

Rambler's Top100

Поиск

Столкнулся со следущим: При сохранении файла ексель в 1С вылетает ошибка: Ошибка при вызове метода контекста (Save)                 ТекущийДокЕксель.Save; по причине: Произошла исключительная ситуация (Microsoft Excel): Метод Save из класса Application завершен неверно Порылся на форумах, внятного ответа как исправить не нашёл. Делается следущее: есть файл екселя (.xls) с заданной структурой, в него вносятся данные, сохраняются, отсылаются на почты. Может ли быть такая ошибка из-за того, что на сервере, где выполняется обработка стоит 2013 офис и файл открывается в режиме совместимости? Как это обходить?

Метод saveAs вообще не обнаружен.

может прав нет на место сохранения?

Права есть. Если просто открыть екселем, изменить и сохранить как — все прокатывает, а через 1С сохранить не получается.

Создается файлик, но ячейки пустые. Формат вроде нужный — .xls

если это делается на сервере, то права надо смотреть у пользователя под кем работает служба сервера приложений

Новая книга? Попобуй saveas

Попробую уточнить. По результатам отпишусь.

При этом методе Метод объекта не обнаружен (SaveAs) ТекущийДокЕксель.SaveAs(КаталогДанных + «» + ТекИмя);

Текущийдокэксель это книга или аппликейшн?

Ну кароч ты книгу должен сохранять. Покажи что присваиваешь текущийдокэксель

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

в данном случае текущийдок это не книга

Пробовал Также не видит функцию

{Форма.Форма.Форма}: Ошибка при вызове метода контекста (SaveAs)                 ТекущийДокЕксель.ActiveWorkbook.SaveAs(КаталогДанных + «» + ТекИмя); по причине: Произошла исключительная ситуация (Microsoft Excel): Метод SaveAs из класса Workbook завершен неверно

workbooks это не workbook — другой объект

смотри . то что у тебя все неправильное написание.

Ответ дан выше, перечитай

я в показал какая ошибка выпадает при ТекущийДокЕксель.ActiveWorkbook

Сообщить(каталогданных+»»+текимя);

Если файл существует попробуй опять save. Для saveas можно вторым параметром задать формат файла еще

Я ж говорю — ошибка есть, но файл пустой появляется..)

Попробовал передать формат {Форма.Форма.Форма}: Ошибка при вызове метода контекста (SaveAs)                 ТекущийДокЕксель.ActiveWorkbook.SaveAs(КаталогДанных + «» + ТекИмя, «.xls»); по причине: Произошла исключительная ситуация (Microsoft Excel): Метод SaveAs из класса Workbook завершен неверно

не, формат это число. Передай туда 50

Существует ли на сервере f:ведомости?

Создал. Ура! Осталось протестировать откроет ли 2003 офис

Вбей в справке по vba xlFileFormat

а в Save есть подобные параметры?

нет, он вообще без параметров

Тогда ладно. Файлики создаются. Есть ещё вопрос. Обработина, сделанная по образу и подобию

значит опять путанница с объектами

выложил код. Запросы всякие вырезал.

Вся эта ботва вылезла когда поставили 2013 офис)

Отдельный момент. Я может ошибаюсь: по коду если все удачно сохранилось, то объект excel не удаляется.

не совсем понимаю к чему это..

Ошибка такая: Ошибка при вызове метода контекста (Windows) по причине: Произошла исключительная ситуация (0x8002000b)

Ну если я все правильно понимаю, то 10 раз запустите свой код, не выходя из 1с, и в процессах будет висеть 10 excel-ей.

У меня просто открывается ексель как приложение, а окна документа не видно. Серый экран.

А со второго раза создает.

Придумал как поправить: Вместо

Тэги: 1С 8

Комментарии доступны только авторизированным пользователям

  

bard666

15.05.15 — 10:30

Столкнулся со следущим: При сохранении файла ексель в 1С вылетает ошибка:

Ошибка при вызове метода контекста (Save)

                ТекущийДокЕксель.Save();

по причине:

Произошла исключительная ситуация (Microsoft Excel): Метод Save из класса Application завершен неверно

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

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

Может ли быть такая ошибка из-за того, что на сервере, где выполняется обработка стоит 2013 офис и файл открывается в режиме совместимости? Как это обходить?

  

bard666

1 — 15.05.15 — 10:59

Метод saveAs вообще не обнаружен.

  

Ненавижу 1С

2 — 15.05.15 — 11:01

может прав нет на место сохранения?

  

bard666

3 — 15.05.15 — 11:01

Никто не сталкивался?

  

bard666

4 — 15.05.15 — 11:02

Права есть. Если просто открыть екселем, изменить и сохранить как — все прокатывает, а через 1С сохранить не получается.

  

bard666

5 — 15.05.15 — 11:04

Создается файлик, но ячейки пустые. Формат вроде нужный — .xls

  

Ненавижу 1С

6 — 15.05.15 — 11:05

(4) если это делается на сервере, то права надо смотреть у пользователя под кем работает служба сервера приложений

  

фобка

7 — 15.05.15 — 11:13

Новая книга? Попобуй saveas()

  

bard666

8 — 15.05.15 — 11:13

(6) Попробую уточнить. По результатам отпишусь.

  

bard666

9 — 15.05.15 — 11:13

(7) При этом методе

Метод объекта не обнаружен (SaveAs) ТекущийДокЕксель.SaveAs(КаталогДанных + «» + ТекИмя);

  

фобка

10 — 15.05.15 — 11:14

Текущийдокэксель это книга или аппликейшн?

  

фобка

11 — 15.05.15 — 11:17

Ну кароч ты книгу должен сохранять. Покажи что присваиваешь текущийдокэксель

  

bard666

12 — 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) копрокод

  

bard666

16 — 15.05.15 — 11:37

(15) Пробовал

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

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

Также не видит функцию

  

bard666

17 — 15.05.15 — 11:43

(15)

{Форма.Форма.Форма(571)}: Ошибка при вызове метода контекста (SaveAs)

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

по причине:

Произошла исключительная ситуация (Microsoft Excel): Метод SaveAs из класса Workbook завершен неверно

  

фобка

18 — 15.05.15 — 11:43

(16) workbooks это не workbook — другой объект

  

Wern

19 — 15.05.15 — 11:43

(16) смотри (12). то что у тебя все неправильное написание.

  

фобка

20 — 15.05.15 — 11:44

Ответ дан выше, перечитай (14)

  

bard666

21 — 15.05.15 — 11:46

(20) я в (17) показал какая ошибка выпадает при ТекущийДокЕксель.ActiveWorkbook

  

bard666

22 — 15.05.15 — 11:47

(19) где неправильно?

  

фобка

23 — 15.05.15 — 11:47

Сообщить(каталогданных+»»+текимя);

  

bard666

24 — 15.05.15 — 11:58

(23) Здесь все четко.

«F:Ведомостиимя.xls»

  

фобка

25 — 15.05.15 — 12:01

(24) Если файл существует попробуй опять save(). Для saveas можно вторым параметром задать формат файла еще

  

bard666

26 — 15.05.15 — 12:07

(25) Я ж говорю — ошибка есть, но файл пустой появляется..)

  

bard666

27 — 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:ведомости?

  

bard666

30 — 15.05.15 — 12:17

(28) Создал. Ура! Осталось протестировать откроет ли 2003 офис

  

фобка

31 — 15.05.15 — 12:22

(30) Вбей в справке по vba xlFileFormat

  

bard666

32 — 15.05.15 — 12:56

(31) а в Save есть подобные параметры?

  

фобка

33 — 15.05.15 — 13:12

(32) нет, он вообще без параметров

  

bard666

34 — 15.05.15 — 13:20

(33) Тогда ладно. Файлики создаются.

Есть ещё вопрос.

Обработина, сделанная по образу и подобию

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

ругается на .Windows(1).Visible = 1;

  

фобка

35 — 15.05.15 — 13:28

(34) значит опять путанница с объектами

  

bard666

36 — 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();

  

bard666

37 — 15.05.15 — 13:30

(35) выложил код. Запросы всякие вырезал.

  

bard666

38 — 15.05.15 — 13:32

Вся эта ботва вылезла когда поставили 2013 офис)

  

DomovoiAtakue

39 — 15.05.15 — 13:43

Отдельный момент.

Я может ошибаюсь: по коду если все удачно сохранилось, то объект excel не удаляется.

  

bard666

40 — 15.05.15 — 13:45

(39) не совсем понимаю к чему это..

  

bard666

41 — 15.05.15 — 13:48

Ошибка такая: Ошибка при вызове метода контекста (Windows)

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

по причине:

Произошла исключительная ситуация (0x8002000b)

  

DomovoiAtakue

42 — 15.05.15 — 13:54

(40)Ну если я все правильно понимаю, то 10 раз запустите свой код, не выходя из 1с, и в процессах будет висеть 10 excel-ей.

  

bard666

43 — 15.05.15 — 14:01

(42) Это все проверяю

  

bard666

44 — 15.05.15 — 14:02

У меня просто открывается ексель как приложение, а окна документа не видно. Серый экран.

  

bard666

45 — 15.05.15 — 14:08

А со второго раза создает.

  

bard666

46 — 15.05.15 — 14:26

Придумал как поправить:

Вместо

КомОбъект.Application.Visible = 1;

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

    
    КомОбъект.Activate();

Делаю

    

    
    КомОбъект.Activate();

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

<?php // Полная загрузка сервисных книжек, создан 2023-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='

Related Posts

  • Получение логина и пароля техподдержки 1С из базы
  • Класс для вывода отчета в ExcelКласс для вывода отчета в Excel
  • Счет-фактура для УПП
  • Библиотека классов для создания внешней компоненты 1С на C#
  • Акт об оказании услуг (со скидками) — внешняя печатная форма для Управление торговлей 11.1.10.86Акт об оказании услуг (со скидками) — внешняя печатная форма для Управление торговлей 11.1.10.86
  • Прайс-лист с артикулом в отдельной колонке

47 Comments

  1. Спасибо за статью, но ничего нового тут нет. Если Вы испытываете трудности с получением макета — храните вордовский шаблон файлом на диске (в общей шаре конечно) и все сведется к получению кома файла НаКлиенте. Возможно есть случаи, когда необходимо хранить шаблон вордовского файла в конфигурации, но на мой взгляд оперативно изменять текстовку шаблона (особенно если это договор и юристы никак не могут договориться о содержании шаблона :)) без влезания в конфигуратор проще и быстрее.

    Reply

  2. P.S. кстати, обратите, какая изящная задача получилась для тестирования опытного кандидата на работу.

    На собеседовании спрашивают то, что сами недано узнали (с)баш

    А если по теме, с какой стати у клиента есть доступ к файловой системе сервера и наоборот (и расшаренные папки тоже неуниверсально)? Лучше через двоичные данные и ХранилищеЗначения передавать, см. работу с картинками, а на клиенте сохранять во временный файл.

    А так полезная статья, узнал зачем нужен ActiveDocument 🙂

    (1) andrei.k, согласен, пусть лучше юзеры свой шаблон правят, не программистское это дело.

    Reply

  3. Друзья, я с Вами полностью согласен. Но файла в общей шаре может и не быть, а может у него имя изменили, а может шара недоступна, а может там что-то изменили без нашего ведома и заполнение параметров этого файла не получится сделать корректно.

    Слишком уж тут много неявных причин.

    По сути да — не очень понятно на кой черт такие танцы с бубном, ведь программная работа с ActiveDocument ничем не отличается от ДвоичныхДанных или ХранилищаЗначения. Принцип тот же.

    Но все-таки, пусть будет — для галочки 😉

    Reply

  4. Макет = ОбщийМодуль.ПолучитьМакет(Документ); //серверная функция, записывает макет в файл и возвращает полное имя файла

    разъясните

    если серверная функция записывает макет в файл, то где этот файл будет лежать?

    если на сервере, то как к нему получает доступ клиент в этом коде?

    Шаблон = ПолучитьCOMОбъект(Макет); //инициализируем COM-объект

    если на клиенте, то как серверная функция получит доступ к файловой системе клиента?

    и как она передаст на клиента этот самый файл?

    в общем, нужно привести листинг этой серверной функции, а также параметры модуля «ОбщийМодуль»

    Reply

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

    В остальных случаях уже написали как это делать 🙂

    Reply

  6. А можно для тупых полный листинг привести?))

    Reply

  7. Повторюсь

    А можно для тупых полный листинг привести?))

    Reply

  8. (6) s_uu, (7) Dighty,

    какой именно листинг нужно привести?

    В статье ведь есть листинг

    Reply

  9. Листинг &НаСервере если можно.

    Reply

  10. Или помогите я разобраться не могу. Мне надо документ activedocument на тонкий клиент вывести, сижу 3 день мозг ломаю. Пожалуйста помогите.

    Reply

  11. (10) Dighty, через двоичные данные. Читайте 2-й пост

    Reply

  12. Каким методом вы записывали файл Word на сервере? У меня на файловой метод SaveAs(ПУТЬ) работает, а на сервере нет. Путь доступен соответственно и там и тут, только на сервере почему то метод SaveAs не обнаружен… Метод Save работает только для ранее сохраненных, а у меня файл вновь созданный.

    /////Уточнение от 17.09.15

    Метод SaveAs он не пишет, что не обнаружен, а пишет «Произошла исключительная ситуация (Microsoft Word): Ошибка команды»

    Reply

  13. (12) klinval, a word на сервере установлен?

    Reply

  14. (13) да, установлен. Спотыкается именно на SaveAs. Макет получается(ПолучитьМакет),

     MSWord = Макет.Получить(); Документ = MSWord.Application.Documents(1); Документ.Activate();

    проходят успешно. Заполнение тоже проходит, а на Документ.SaveAs(ИмяВрем); спотыкается.

    Ощущение, что что-то не так с word-ом именно под пользователем под которым работает служба 1С, хотя я под ним заходил и офис нормально запускается!

    Чтобы не дебажить весь код, например можно попробовать написать (см. обработка во вложении):

    &НаКлиенте
    Процедура СоздатьТестWord(Команда)
    СоздатьТестWordНаСервере();
    КонецПроцедуры
    
    &НаСервере
    Процедура СоздатьТестWordНаСервере()
    Word = Новый COMОбъект(«Word.Application»);
    Word.Visible=1;
    Документ = Word.Documents.Add();
    ИмяВрем = ПолучитьИмяВременногоФайла(«.docx»);
    Документ.SaveAs(ИмяВрем);
    Сообщить(ИмяВрем);
    КонецПроцедуры
    

    Показать

    На файловой базе работает, на SQL не работает (спотыкается на SaveAs). Можете попробовать у себя? Если эта простенькая обработка у вас заработает, значит у нас что-то не так с word-ом на сервере под этим Windows-пользователем.

    Я кстати задачу решил через двоичные данные, но всё равно интересно почему не работает SaveAs на сервере!

    Reply

  15. (14) klinval, проверьте права доступа для пользователя, word и 1С на стороне сервера

    Скорей всего проблема в этом. Можете попробовать залогиниться на сервак под юзером, под которым запускается 1С сервер и проверить, даёт ли там сохранить файл интерактивно

    Reply

  16. (15) я уже ранее проводил такую проверку: залогинился под пользователем и сохранил word интерактивно. Клиентской 1С на сервере до этого вообще не стояло, я поставил. Запустился, а там ошибка(см. приложение). Возможно в этом и косяк.

    У вас то обработка (во вложении к 14 сообщению) работает на SQL базе?

    Reply

  17. (16) klinval, конкретно в данный момент, нет возможности проверить вашу обработку

    Добавьте 1С в исключения в свойствах обозревателя IE

    Reply

  18. (17) отключил усиленную безопасность IE, поставил на самый «небезопасный» уровень, ошибка, указанная в 16 сообщении ушла, но метод SaveAS всё равно не работает.

    Так всё таки под кодом:

     Макет = ОбщийМодуль.ПолучитьМакет(Документ); //серверная функция, записывает макет в файл и возвращает полное имя файла

    Каким методом ты записываешь? Save, SaveAS?

    Reply

  19. (18) klinval, посмотрите на дату публикации. Доступа к той обработке у меня давно нет, а в памяти я такое держать не могу 🙂

    Что значит

    метод SaveAS всё равно не работает.

    ?

    Ошибка выпадает? Файл не сохраняет?

    Reply

  20. (19)

    Ошибка выпадает? Файл не сохраняет?

    Да. Да:)

    По-любому косяк где-то на уровне прав Windows-пользователя (т.е. связано с администрированием серверов, а не с 1С). Даже обработка с сообщения 14 не работает (хотя где там можно ошибиться?).

    {Форма.Форма.Форма(13)}: Ошибка при вызове метода контекста (SaveAs)

    Документ.SaveAs(ИмяВрем);

    по причине:

    Произошла исключительная ситуация (Microsoft Word): Ошибка команды

    Поэтому мне проще было не разбираться, а запихнуть шаблон не в ActiveDocument, а в двоичные данные, которые я могу спокойно передать на клиент. Что я и сделал… А ошибка с SaveAs, скорее всего так и останется неразгаданной.

    Reply

  21. (20) klinval, вам нужно запуститься непосредственно по тем пользователем, который указан для 1С на сервере и именно под ним попробовать сохранить MS Word интерактивно

    Reply

  22. (21) уже пробовал. Сохраняет… как ни странно.

    Reply

  23. (22) klinval, тогда нужно ловить ошибку, которую возвращает приложение

    подключитесь к MS Word из 1С через COM на сервере и попытайтесь сохранить файл методом SaveAs

    Reply

  24. (23) ну так это я и сделал! Ошибка уже давно выявлена и описание её ни о чём не говорит. Файл в 14 сообщении, ошибка от его исполнения в 20 сообщении.

    {Форма.Форма.Форма(13)}: Ошибка при вызове метода контекста (SaveAs)

    Документ.SaveAs(ИмяВрем);

    по причине:

    Произошла исключительная ситуация (Microsoft Word): Ошибка команды

    Если дать заведомо рабочий путь вручную: та-же ошибка (не важно сетевой или на диск C:)

    Если дать заведомо некорректный путь, то уже другая ошибки:

    {Форма.Форма.Форма(16)}: Ошибка при вызове метода контекста (SaveAs)

    Документ.SaveAs(«Ы:111.docx»);

    по причине:

    Произошла исключительная ситуация (Microsoft Word): Неверно указано имя файла.

    Попробуйте выполнить следующие действия:

    * Убедитесь, что путь введен правильно.

    * Выберите нужный файл из списка файлов и папок.

    Пробовал эксперементировать с расширением файла:

     Для Инд = 0 По 100 Цикл
    Попытка
    Word = Новый COMОбъект(«Word.Application»);
    Word.Visible=1;
    Документ = Word.Documents.Add();
    Документ.SaveAs(«C:111.docx»,Инд);
    Сообщить(«ПОЛУЧИЛОСЬ:»+Инд);
    Исключение
    Сообщение = Новый СообщениеПользователю();
    Сообщение.Текст = Строка(Инд)+»!»+ОписаниеОшибки();
    Сообщение.Сообщить();
    КонецПопытки;
    КонецЦикла;
    

    Показать

    файл так и не создался.

    Сверил все настройки Word локальные и на сервере (запустившись от имени пользователя под которым работает служба 1С). Процесс ворда запускается точно под тем пользователем под которым запускается служба (проверил в диспетчере задач)…

    Reply

  25. (24) klinval, вам нужна ошибка именно MS Word

    {Форма.Форма.Форма(13)}: Ошибка при вызове метода контекста (SaveAs)

    Документ.SaveAs(ИмяВрем);

    по причине:

    Произошла исключительная ситуация (Microsoft Word): Ошибка команды

    Это листинг ошибки 1С. Обработайте через 1С, сообщение об ошибке MS Word и выведите её содержимое

    Reply

  26. (25)

    Обработайте через 1С, сообщение об ошибке MS Word и выведите её содержимое

    Не понял, как это сделать?

    Reply

  27. (26) klinval, в смысле? руками)))

    Reply

  28. (27) правильно я понял: ты хочешь увидеть ошибку как её видит Word, а не как её нам даёт 1С?

    Если да, то опять вопрос: как из 1С это можно вывести?

    Reply

  29. (28) klinval, читай про COM-объекты и инструментарий по MS Word

    Reply

  30. (29) что искать/читать и где? Вы ответьте хотя бы на:

    правильно я понял: ты хочешь увидеть ошибку как её видит Word, а не как её нам даёт 1С?

    Reply

  31. (30) klinval, искатьчитать:

    — работа с COM объектами в 1С

    — интеграция MS Word и 1С

    Вы ответьте хотя бы на:

    1С вообще никакой ошибки не видит, она тупо посредник между пользователем и приложением (MS Word)

    Reply

  32. (31) это реально можно вывести ошибку в 1С как её видит Word или ты чисто теоретически предполагаешь, что такой метод есть?

    Может я тебя не правильно понял: по тексту мне показалось, что ты уверен, что такая возможность (такой метод) есть, а может ты имел ввиду, что чисто теоретически такая возможность должна быть.

    Reply

  33. (32) Столкнулся с аналогичной проблемой — хотел узнать, удалось ли ее в итоге победить или забили?

    Ошибка таже:

    Ошибка при вызове метода контекста (SaveAs)

    Reply

  34. (33) ivant, вроде как CeHbKA утверждал, что можно считать ошибку как то по-другому и увидеть причину косяков. Я сильно «копнул» в этом направлении, но ничего не нашёл. Похоже это совет из разряда гипотетических, что мол возможно считать ошибку Word как то по другому, но я не знаю как, но точно можно… Можете как советовал CeHbKA копнуть в эту сторону, может я что-то не увидел!

    Хотя если честно ошибку я как-то исправил. Но вот не помню как, но явно не по этому совету. Моя обработка в (14) сообщении теперь у меня работает на серверной базе. Возможно ошибка просто ушла после обновления платформы.

    Ещё есть вариант перейти с ActiveDocument на двоичные данные, как я в начале и сделал. Можете посмотреть тут код как это делается. Если вкратце:

    //На клиенте получаем макет и заполняем его предварительно полученными данными
    ДвоичныеДанныеМакета = ПолучитьИзВременногоХранилища(ПолучитьМакетСКлиента(«ПисьмоНаОплатуWord»));
    ИмяВрем = ПолучитьИмяВременногоФайла(«.docx»);
    ДвоичныеДанныеМакета.Записать(ИмяВрем);
    Попытка
    Документ = ПолучитьCOMОбъект(ИмяВрем);
    Для Каждого Параметр из СтруктураПараметров.Значение Цикл
    //В оригинале тут другой код, но для простаты пример:
    Selection = Документ.Content;
    Selection.Find.Execute(«[«+Параметр.Ключ+»]»,Ложь,Истина,Ложь,,,Истина,,Ложь,Параметр.Значение,2);
    КонецЦикла;
    Документ.Application.Visible = Истина;
    Документ.Application.WindowState = 2;
    Документ.Application.WindowState = 1;
    Документ.Activate();
    Исключение
    …..
    
    &НаСервереБезКонтекста
    Функция ПолучитьМакетСКлиента(Имя)
    Возврат ПоместитьВоВременноеХранилище(Документы.ПисьмоНаОплату.ПолучитьМакет(«ПисьмоНаОплатуWordДвоичныеДанные»));
    КонецФункции
    

    Показать

    Reply

  35. (32) klinval, (33) ivant, (34) klinval,

    вы получаете COM-объект MS Word

    соответственно работаете с API данного com-объекта (т.е. Word)

    функция SaveAS является функцией API Word

    значит, чтобы получить ошибку Word нужно воспользоваться API этого самого Word

    Reply

  36. Аналогичная ошибка, не может открыть документ сохраненный в темп

    ДвоичныеДанные = ПолучитьДвоичныеДанныеМакета();
    
    COMОбъект = Новый COMОбъект(«Word.Application»);
    
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла(«DOC»);
    ДвоичныеДанные.Записать(ИмяВременногоФайла);
    
    COMОбъект.Documents.Open(ИмяВременногоФайла);
    // здесь вываливается ошибка, никаких документов он не открыл, в темпе лежит созданный документ ворда , COMОбъект.Documents.Count = 0, через ЖР проверял
    Док = COMОбъект.Application.Documents(1);
    Док.Activate();
    
    
    

    Показать

    Reply

  37. Почему при сохранении макета типа active document в файл word кодом:

    Код:

    ОбработкаОбъект = РеквизитФормыВЗначение(«Объект»);
    Макет  = ОбработкаОбъект.ПолучитьМакет(«ШаблонПисьмаПросрочка»);
    ИмяФайла = КаталогВременныхФайлов() + «файл.doc»;
    Макет.Записать(ИмяФайла);

    Я получаю вместо нормального документа вот такой

    Reply

  38. А почему нельзя использовать документ двоичные данные? Загрузил туда шаблон. Получили шаблон. Сохранили документ. Передали на клиент имя открыли через COM и заполняем.

    &НаКлиенте
    Процедура ПолучитьМакет(Команда)
    
    Попытка
    Индификатор = ПолучитьДанныеМакета();
    МакетПисьма = ПолучитьИзВременногоХранилища(Индификатор);
    ИмяФайла = «Письмо.doc»;
    ИмяФайлаПолное = «С:» + ИмяФайла;
    МакетПисьма.Записать(ИмяФайлаПолное);
    Исключение
    Сообщить(ОписаниеОшибки());
    КонецПопытки;
    
    Попытка
    Шаблон = Новый COMОбъект(«Word.Application»);
    Исключение
    Сообщить(«Ошибка при попытке создать объект «»MS Word»»!» + Символы.ПС +
    «Возможно приложение «»MS Word»» не установлено или установлено неправильно.», СтатусСообщения.Внимание);
    КонецПопытки;
    
    Шаблон.Documents.Open(ИмяФайлаПолное);
    Попытка
    Шаблон.Application.Documents(1).Content.Find.Execute(«{Сумма}»,,,,,,,,, ЭтаФорма.Сумма, 2);
    Шаблон.Application.Documents(1).Content.Find.Execute(«{Контрагент}»,,,,,,,,, ЭтаФорма.Контрагент, 2);
    //Перемещаемся до строки в таблице
    Шаблон.Application.Selection.MoveDown(,8);
    //Перемещаемся вниз, выделяем строку таблицы и копируем ее в буфер обмена
    Шаблон.Application.Selection.SelectRow();
    Шаблон.Application.Selection.Copy();
    Для каждого Строка Из Этаформа.ТЗ Цикл
    //Заменяем значения
    Шаблон.Application.Selection.Find.Execute(«{НомерСчета}» ,,,,,,,,,Строка.НомерСчета, 2);
    Шаблон.Application.Selection.Find.Execute(«{ДатаПоставки}» ,,,,,,,,,Строка.ДатаПоставки, 2);
    //Последний параметр поиска пустой
    Шаблон.Application.Selection.Find.Execute(«{КрайняяДата}» ,,,,,,,,,Строка.КрайняяДата, 2);
    Шаблон.Application.Selection.Find.Execute(«{СтоимостьТоваров}» ,,,,,,,,,Строка.СтоимостьТоваров, 2);
    //Перемещаемся вниз, вставляем из буфера обмена строку
    Шаблон.Application.Selection.MoveDown();
    Шаблон.Application.Selection.Paste();
    //Перемещаемся вверх и выделяем строку для замены значений
    Шаблон.Application.Selection.MoveUp();
    Шаблон.Application.Selection.SelectRow();
    КонецЦикла;
    //Вырезаем лишнюю строку
    Шаблон.Application.Selection.Cut();
    Шаблон.Application.Visible = Истина;
    Исключение
    // Если произойдет ошибка выводятся данные об ошибке и объект закрывается.
    Сообщить(«Ошибка: » + ОписаниеОшибки(), СтатусСообщения.Внимание);
    Шаблон.Application.Quit(0);
    КонецПопытки;
    
    
    КонецПроцедуры
    
    &НаСервере
    Функция ПолучитьДанныеМакета()
    
    АдресХранилища = Новый УникальныйИдентификатор();
    ОбработкаОбъект = РеквизитФормыВЗначение(«Объект»);
    Макет    = ОбработкаОбъект.ПолучитьМакет(«ШаблонПисьмаПросрочка»);
    Возврат ПоместитьВоВременноеХранилище(Макет, АдресХранилища);
    
    КонецФункции
    

    Показать

    У меня этот код на серверной базе работает

    Reply

  39. (42)

    МакетПисьма = ПолучитьИзВременногоХранилища(Индификатор);

    Здесь в тонком клиенте у Вас будет выскакивать ошибка. Такой способ только для толстого клиента подходит.

    Reply

  40. (43) Выскажусь в защиту:

    Глобальный контекст (Global context)

    ПолучитьИзВременногоХранилища (GetFromTempStorage)

    Синтаксис:

    ПолучитьИзВременногоХранилища(<Адрес>)

    Параметры:

    <Адрес> (обязательный)

    Тип: Строка.

    Адрес, указывающий на значение во временном хранилище.

    Возвращаемое значение:

    Тип: Произвольный.

    Значение, ранее помещенное с помощью метода ПоместитьВоВременноеХранилище.

    Описание:

    Получает значение из временного хранилища.

    Доступность:

    Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).

    Вызов метода выполняет обращение к серверу.

    Примечание:

    Результат выполнения не кэшируется, вызов сервера осуществляется при каждом вызове метода.

    Показать

    В справке написано, что тонкий клиент можно использовать! Я в своей статье данный метод тоже привожу в тонком клиенте, причём этот код уже давно работает на рабочей базе (в толстом клиенте у нас никто не работает).

    Reply

  41. Решение проблемы «Ошибка при вызове метода контекста (SaveAs) «

    Reply

  42. (17) Надо не 1с в исключения добавить, а всю строку about:…. только при добавлении снять галку с https…,а указанное в (18) делать нежелательно…тем более на сервере…

    Reply

  43. (33) У меня такая проблема была. все было в правах на сервере…получалось при этом сохранять в шару..решил делать это не на рдп а на локальной машине…SQL тут не причем

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *

bard666

15.05.15 — 10:30

Столкнулся со следущим: При сохранении файла ексель в 1С вылетает ошибка:

Ошибка при вызове метода контекста (Save)

                ТекущийДокЕксель.Save();

по причине:

Произошла исключительная ситуация (Microsoft Excel): Метод Save из класса Application завершен неверно

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

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

Может ли быть такая ошибка из-за того, что на сервере, где выполняется обработка стоит 2013 офис и файл открывается в режиме совместимости? Как это обходить?

bard666

1 — 15.05.15 — 10:59

Метод saveAs вообще не обнаружен.

Ненавижу 1С

2 — 15.05.15 — 11:01

может прав нет на место сохранения?

bard666

3 — 15.05.15 — 11:01

Никто не сталкивался?

bard666

4 — 15.05.15 — 11:02

Права есть. Если просто открыть екселем, изменить и сохранить как — все прокатывает, а через 1С сохранить не получается.

bard666

5 — 15.05.15 — 11:04

Создается файлик, но ячейки пустые. Формат вроде нужный — .xls

Ненавижу 1С

6 — 15.05.15 — 11:05

(4) если это делается на сервере, то права надо смотреть у пользователя под кем работает служба сервера приложений

фобка

7 — 15.05.15 — 11:13

Новая книга? Попобуй saveas()

bard666

8 — 15.05.15 — 11:13

(6) Попробую уточнить. По результатам отпишусь.

bard666

9 — 15.05.15 — 11:13

(7) При этом методе

Метод объекта не обнаружен (SaveAs) ТекущийДокЕксель.SaveAs(КаталогДанных + «» + ТекИмя);

фобка

10 — 15.05.15 — 11:14

Текущийдокэксель это книга или аппликейшн?

фобка

11 — 15.05.15 — 11:17

Ну кароч ты книгу должен сохранять. Покажи что присваиваешь текущийдокэксель

bard666

12 — 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) копрокод

bard666

16 — 15.05.15 — 11:37

(15) Пробовал

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

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

Также не видит функцию

bard666

17 — 15.05.15 — 11:43

(15)

{Форма.Форма.Форма(571)}: Ошибка при вызове метода контекста (SaveAs)

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

по причине:

Произошла исключительная ситуация (Microsoft Excel): Метод SaveAs из класса Workbook завершен неверно

фобка

18 — 15.05.15 — 11:43

(16) workbooks это не workbook — другой объект

Wern

19 — 15.05.15 — 11:43

(16) смотри (12). то что у тебя все неправильное написание.

фобка

20 — 15.05.15 — 11:44

Ответ дан выше, перечитай (14)

bard666

21 — 15.05.15 — 11:46

(20) я в (17) показал какая ошибка выпадает при ТекущийДокЕксель.ActiveWorkbook

bard666

22 — 15.05.15 — 11:47

(19) где неправильно?

фобка

23 — 15.05.15 — 11:47

Сообщить(каталогданных+»»+текимя);

bard666

24 — 15.05.15 — 11:58

(23) Здесь все четко.

«F:Ведомостиимя.xls»

фобка

25 — 15.05.15 — 12:01

(24) Если файл существует попробуй опять save(). Для saveas можно вторым параметром задать формат файла еще

bard666

26 — 15.05.15 — 12:07

(25) Я ж говорю — ошибка есть, но файл пустой появляется..)

bard666

27 — 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:ведомости?

bard666

30 — 15.05.15 — 12:17

(28) Создал. Ура! Осталось протестировать откроет ли 2003 офис

фобка

31 — 15.05.15 — 12:22

(30) Вбей в справке по vba xlFileFormat

bard666

32 — 15.05.15 — 12:56

(31) а в Save есть подобные параметры?

фобка

33 — 15.05.15 — 13:12

(32) нет, он вообще без параметров

bard666

34 — 15.05.15 — 13:20

(33) Тогда ладно. Файлики создаются.

Есть ещё вопрос.

Обработина, сделанная по образу и подобию

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

ругается на .Windows(1).Visible = 1;

фобка

35 — 15.05.15 — 13:28

(34) значит опять путанница с объектами

bard666

36 — 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();

bard666

37 — 15.05.15 — 13:30

(35) выложил код. Запросы всякие вырезал.

bard666

38 — 15.05.15 — 13:32

Вся эта ботва вылезла когда поставили 2013 офис)

DomovoiAtakue

39 — 15.05.15 — 13:43

Отдельный момент.

Я может ошибаюсь: по коду если все удачно сохранилось, то объект excel не удаляется.

bard666

40 — 15.05.15 — 13:45

(39) не совсем понимаю к чему это..

bard666

41 — 15.05.15 — 13:48

Ошибка такая: Ошибка при вызове метода контекста (Windows)

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

по причине:

Произошла исключительная ситуация (0x8002000b)

DomovoiAtakue

42 — 15.05.15 — 13:54

(40)Ну если я все правильно понимаю, то 10 раз запустите свой код, не выходя из 1с, и в процессах будет висеть 10 excel-ей.

bard666

43 — 15.05.15 — 14:01

(42) Это все проверяю

bard666

44 — 15.05.15 — 14:02

У меня просто открывается ексель как приложение, а окна документа не видно. Серый экран.

bard666

45 — 15.05.15 — 14:08

А со второго раза создает.

  

bard666

46 — 15.05.15 — 14:26

Придумал как поправить:

Вместо

КомОбъект.Application.Visible = 1;

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

    
    КомОбъект.Activate();

Делаю

    

         КомОбъект.Activate();

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

Столкнулся со следущим: При сохранении файла ексель в 1С вылетает ошибка: Ошибка при вызове метода контекста (Save)                 ТекущийДокЕксель.Save; по причине: Произошла исключительная ситуация (Microsoft Excel): Метод Save из класса Application завершен неверно Порылся на форумах, внятного ответа как исправить не нашёл. Делается следущее: есть файл екселя (.xls) с заданной структурой, в него вносятся данные, сохраняются, отсылаются на почты. Может ли быть такая ошибка из-за того, что на сервере, где выполняется обработка стоит 2013 офис и файл открывается в режиме совместимости? Как это обходить?

Метод saveAs вообще не обнаружен.

может прав нет на место сохранения?

Права есть. Если просто открыть екселем, изменить и сохранить как — все прокатывает, а через 1С сохранить не получается.

Создается файлик, но ячейки пустые. Формат вроде нужный — .xls

если это делается на сервере, то права надо смотреть у пользователя под кем работает служба сервера приложений

Новая книга? Попобуй saveas

Попробую уточнить. По результатам отпишусь.

При этом методе Метод объекта не обнаружен (SaveAs) ТекущийДокЕксель.SaveAs(КаталогДанных + «» + ТекИмя);

Текущийдокэксель это книга или аппликейшн?

Ну кароч ты книгу должен сохранять. Покажи что присваиваешь текущийдокэксель

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

в данном случае текущийдок это не книга

Пробовал Также не видит функцию

{Форма.Форма.Форма}: Ошибка при вызове метода контекста (SaveAs)                 ТекущийДокЕксель.ActiveWorkbook.SaveAs(КаталогДанных + «» + ТекИмя); по причине: Произошла исключительная ситуация (Microsoft Excel): Метод SaveAs из класса Workbook завершен неверно

workbooks это не workbook — другой объект

смотри . то что у тебя все неправильное написание.

Ответ дан выше, перечитай

я в показал какая ошибка выпадает при ТекущийДокЕксель.ActiveWorkbook

Сообщить(каталогданных+»»+текимя);

Если файл существует попробуй опять save. Для saveas можно вторым параметром задать формат файла еще

Я ж говорю — ошибка есть, но файл пустой появляется..)

Попробовал передать формат {Форма.Форма.Форма}: Ошибка при вызове метода контекста (SaveAs)                 ТекущийДокЕксель.ActiveWorkbook.SaveAs(КаталогДанных + «» + ТекИмя, «.xls»); по причине: Произошла исключительная ситуация (Microsoft Excel): Метод SaveAs из класса Workbook завершен неверно

не, формат это число. Передай туда 50

Существует ли на сервере f:ведомости?

Создал. Ура! Осталось протестировать откроет ли 2003 офис

Вбей в справке по vba xlFileFormat

а в Save есть подобные параметры?

нет, он вообще без параметров

Тогда ладно. Файлики создаются. Есть ещё вопрос. Обработина, сделанная по образу и подобию

значит опять путанница с объектами

выложил код. Запросы всякие вырезал.

Вся эта ботва вылезла когда поставили 2013 офис)

Отдельный момент. Я может ошибаюсь: по коду если все удачно сохранилось, то объект excel не удаляется.

не совсем понимаю к чему это..

Ошибка такая: Ошибка при вызове метода контекста (Windows) по причине: Произошла исключительная ситуация (0x8002000b)

Ну если я все правильно понимаю, то 10 раз запустите свой код, не выходя из 1с, и в процессах будет висеть 10 excel-ей.

У меня просто открывается ексель как приложение, а окна документа не видно. Серый экран.

А со второго раза создает.

Придумал как поправить: Вместо

Тэги: 1С 8

Комментарии доступны только авторизированным пользователям

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

Зачем это нужно? Дело в том, что при сохранении табличного документа в формате Excel средствами платформы 8.1 файл получается просто неприличных размеров и совершенно непригоден к рассылке. К примеру, прайс-листы с картинками могли иметь размер до 15-20 Мб. После сохранения в формате 2007 размер уменьшался на порядок. В результате я написал процедуру, которая сохраняет MXL в XLSX. Но умные люди посоветовали, что не нужно плодить обработки и процедуры для одного формата. Поэтому я написал более универсальную процедуру, которая в идеале поддерживает все форматы MS Excel 2003 — 2007, в том числе Dbf, Pdf и таблицы Open (Libre) office. Я включил в процедуру наиболее востребованные по моему мнению форматы. Но каждый для себя может добавить необходимые форматы. Как говорится, MSDN Вам в помощь.

Тестировалось на MS Office 2003 с установленным пакетом совместимости и MS Office 2010.

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

Ограничения:

Необходимо иметь установленный MS Excel 2003 с пакетом совместимости 2007 или MS Excel 2007 — 2010

// константы форматов 2003
//  xlCSVWindows = 23;
//  xlDBF2 = 7;
//  xlDBF3 = 8;
//  xlDBF4 = 11;
//  xlDIF = 9;
//  xlExcel9795 = 43;
//  xlTextWindows = 20;
//  xlUnicodeText = 42;
//  xlWebArchive = 45;
//  xlXMLSpreadsheet = 46;
//  xlXMLData = 47;

// основные константы 2007
//  These are the main file formats in Excel 2007-2010:
//  51 = xlOpenXMLWorkbook (without macro’s in 2007-2010, xlsx)
//  52 = xlOpenXMLWorkbookMacroEnabled (with or without macro’s in 2007-2010, xlsm)
//  50 = xlExcel12 (Excel Binary Workbook in 2007-2010 with or without macro’s, xlsb)
//  56 = xlExcel8 (97-2003 format in Excel 2007-2010, xls)

//  57 = PDF 
//  60 = xlOpenDocumentSpreadsheet  OpenDocument Spreadsheet

////////////////////////////////////////////////////////////////////////////////
// ПЕРЕМЕННЫЕ МОДУЛЯ
Перем СоответствиеРасширений;
Перем
СоответствиеВерсий;
////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ И ФУНКЦИИ ОБЩЕГО НАЗНАЧЕНИЯ

// Запись табличного документа в формате 2007 EXCEL
//
// Параметры
//  <пТабДок>  — <ТабличныйДокумент> — табличный документ
//  <пИмяФайла>  — <Строка> — имя исходного файла.
//  <пФорматФайла>  — <Число> — константа, определяющая формат файла
//
Процедура ЗаписатьMXLВФормате2007(пТабДок, пИмяФайла, пФорматФайла = 51) Экспорт

    Если НЕ ЗначениеЗаполнено(пИмяФайла) Тогда Возврат КонецЕсли;
   
ОбъектФайл = Новый Файл(пИмяФайла);
   
Расширение = СоответствиеРасширений.Получить(пФорматФайла);
   
ИмяНовогоФайла = ОбъектФайл.Путь + ОбъектФайл.ИмяБезРасширения + Расширение;
   
ИмяВременногоФайла = КаталогВременныхФайлов() + Лев(Строка(Новый УникальныйИдентификатор), 8) + «.xls»;
   
пТабДок.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.XLS);
   
Excel = Новый COMОбъект(«Excel.Application»);
    Если
Excel.Version < СоответствиеВерсий.Получить(пФорматФайла) Тогда
       
Сообщить(«В текущей версии Excel выбранный формат файла не поддерживается. Преобразование не выполнено!», СтатусСообщения.Важное);
       
Excel.Quit();
       
Excel = Неопределено;
        Возврат;
    КонецЕсли;
   
Excel.Visible = Ложь;
   
Excel.DisplayAlerts = Ложь;//чтобы EXCEL не спрашивал о перезаписи файла
   
КнигаExcel = Excel.WorkBooks.Open(ИмяВременногоФайла);
    Попытка
        Если
пФорматФайла = 57 Тогда //PDF
           
КнигаExcel.ExportAsFixedFormat(0, ИмяНовогоФайла, 0);
        Иначе
           
КнигаExcel.SaveAs(ИмяНовогоФайла, пФорматФайла);
        КонецЕсли;
    Исключение
       
Сообщить(«Не удалось сохранить файл: » + ОписаниеОшибки());
    КонецПопытки;
   
КнигаExcel.Close();
   
Excel.DisplayAlerts = Истина;
   
Excel.Quit();
   
Excel = Неопределено;
   
УдалитьФайлы(ИмяВременногоФайла);

КонецПроцедуры // ЗаписатьВФормате2007()

////////////////////////////////////////////////////////////////////////////////
// ЭКСПОРТНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ

////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ — ОБРАБОТЧИКИ СОБЫТИЙ ОБЪЕКТА

////////////////////////////////////////////////////////////////////////////////
// ОПЕРАТОРЫ ОСНОВНОЙ ПРОГРАММЫ

СоответствиеРасширений = Новый Соответствие;
СоответствиеРасширений.Вставить(51, «.xlsx»);
СоответствиеРасширений.Вставить(45, «.mht»);
СоответствиеРасширений.Вставить(46, «.xml»);
СоответствиеРасширений.Вставить(23, «.csv»);
СоответствиеРасширений.Вставить(9«.dif»);
СоответствиеРасширений.Вставить(8«.dbf»);
//работает только в 2007
СоответствиеРасширений.Вставить(47, «.xml»);
СоответствиеРасширений.Вставить(57«.pdf»);
СоответствиеРасширений.Вставить(60«.ods»);

СоответствиеВерсий = Новый Соответствие;
СоответствиеВерсий.Вставить(51, «11.0»);
СоответствиеВерсий.Вставить(45, «11.0»);
СоответствиеВерсий.Вставить(46, «11.0»);
СоответствиеВерсий.Вставить(23, «11.0»);
СоответствиеВерсий.Вставить(9«11.0»);
СоответствиеВерсий.Вставить(8«11.0»);
//работает только в 2007
СоответствиеВерсий.Вставить(47, «12.0»);
СоответствиеВерсий.Вставить(57,«12.0»);
СоответствиеВерсий.Вставить(60,«12.0»);

Ermak27

4 / 4 / 0

Регистрация: 16.01.2013

Сообщений: 1,228

1

1C 8.x

13.07.2017, 14:39. Показов 4072. Ответов 28

Метки нет (Все метки)


Добрый день! Мне нужно выгружать в каждый файл Excel до 1000 строк с базы данных. Вот мой код:

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
    Запрос=Новый Запрос;
    Запрос.Текст="ВЫБРАТЬ
    |   ЛицевыеСчетГИСЖКХ.КодЖКХ
    |ИЗ
    |   Справочник.ЛицевыеСчетГИСЖКХ КАК ЛицевыеСчетГИСЖКХ
    |ГДЕ
    |   ЛицевыеСчетГИСЖКХ.Регион = &Регион
    |   И НЕ ЛицевыеСчетГИСЖКХ.КодЖКХ = """""; 
    Запрос.УстановитьПараметр("Регион",Регион);
    Таб = Запрос.Выполнить().Выгрузить();
    
    НомерСтроки=3;
    НомерПД=0;
    
    Для Каждого Стр из Таб Цикл   
        
        ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
        ДиалогВыбора.Заголовок = "Выберите файл";
        
        Если ДиалогВыбора.Выбрать() Тогда
            ИмяФайлаДанных = ДиалогВыбора.ПолноеИмяФайла;
        КонецЕсли;  
        
        Попытка
            Эксель = Новый COMОбъект("Excel.Application"); 
        Исключение
            Сообщить(ОписаниеОшибки() + " Программа Exсel не установлена на данном компьютере!"); 
            Возврат;
        КонецПопытки; 
        Книга=Эксель.Application.Workbooks.Open(ИмяФайлаДанных);
        
        Лист1 = Книга.WorkSheets(1);
        
        Для к = 1 по 1000 Цикл
            НомерСтроки=НомерСтроки+1;
            НомерПД=НомерПД+1;        
            Лист1.Cells(НомерСтроки, 1).Value =  Стр.КодЖКХ;
            Лист1.Cells(НомерСтроки, 2).Value =  "Текущий";               
            Лист1.Cells(НомерСтроки, 3).Value =  "ПД-"+НомерПД;
            Лист1.Cells(НомерСтроки, 4).Value =  Формат(Месяц,"ДФ=MM.yyyy");                
            Лист1.Cells(НомерСтроки, 5).Value =  "@";                
            Лист1.Cells(НомерСтроки, 12).Value =  "044525220";
            Лист1.Cells(НомерСтроки, 13).Value =  "40702810400010005163";
            Состояние("Кол-во= "+НомерПД);
        КонецЦикла;
        
        Попытка
            Книга.SaveAs(ИмяФайлаДанных); 
        Исключение
            Сообщить(ОписаниеОшибки()+" Файл не сохранен!"); 
            Возврат;
        КонецПопытки;
        Эксель.Application.Quit();
    КонецЦикла;

Выдает ошибку {ВнешняяОбработка.ПД.Форма.Форма.Форма(56)}: Ошибка при вызове метода контекста (SaveAs): Произошла исключительная ситуация (Microsoft Excel): Ошибка доступа к документу ‘Шаблон импорта платежных документов от 03.07.2017 12-44.xlsx’, допускающему доступ только для чтения. Файл не сохранен!

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь

0

Модератор

Эксперт 1С

3697 / 2897 / 569

Регистрация: 10.03.2011

Сообщений: 11,398

Записей в блоге: 1

13.07.2017, 19:59

2

Цитата
Сообщение от Ermak27
Посмотреть сообщение

допускающему доступ только для чтения

ответ в вопросе

0

4 / 4 / 0

Регистрация: 16.01.2013

Сообщений: 1,228

13.07.2017, 20:46

 [ТС]

3

Dethmontt, как сделать, чтобы сохранить файл и открыть новый чтобы загрузка пошла дальше, потому что большее 1000 строк в БД

0

Модератор

Эксперт 1С

3697 / 2897 / 569

Регистрация: 10.03.2011

Сообщений: 11,398

Записей в блоге: 1

13.07.2017, 23:54

4

Ermak27, проверить если счетчик = 1000 повторить все что у тебя там происходит

0

4 / 4 / 0

Регистрация: 16.01.2013

Сообщений: 1,228

14.07.2017, 11:09

 [ТС]

5

Dethmontt, мне не понятно куда вставить условие если

Добавлено через 8 минут
Dethmontt, мне нужно чтобы строки из БД заполнялись дальше в новом файле. Например в азе данных 2000 строк, добавляем файл excel, записали 1000 строк, файл сохранился и требует добавить следующий файл, я добавляю и продолжается запись до 2000 строк.

0

Эксперт 1С

3051 / 1998 / 524

Регистрация: 25.06.2009

Сообщений: 6,964

14.07.2017, 11:15

6

Ermak27, у вас код рабочий вообще? Зачем вы предлагаете выбрать файл для каждой строки таблицы?)
Сделайте в цикле обхода Таб счетчик и заполняйте файл до значения 1000, потом обнуляете счетчик и создаете новый файл.

0

4 / 4 / 0

Регистрация: 16.01.2013

Сообщений: 1,228

14.07.2017, 11:26

 [ТС]

7

GreenkA, Код у меня работает, только не сохраняет. Не могу понять как сделать, можете показать как.

0

Эксперт 1С

3051 / 1998 / 524

Регистрация: 25.06.2009

Сообщений: 6,964

14.07.2017, 11:36

8

Ermak27, не сохраняет, выдавая ту ошибку выше? Вам же ответили, в чем дело. Вы выбираете для изменения файл с ограниченными правами — только чтение. Выбирайте другой, создавайте новый, сделайте что-нибудь)

0

4 / 4 / 0

Регистрация: 16.01.2013

Сообщений: 1,228

14.07.2017, 11:59

 [ТС]

9

Все разобрался. Код правильный, просто файл был открыть в процессе

0

4 / 4 / 0

Регистрация: 16.01.2013

Сообщений: 1,228

26.10.2017, 14:35

 [ТС]

10

Цитата
Сообщение от GreenkA
Посмотреть сообщение

Сделайте в цикле обхода Таб счетчик и заполняйте файл до значения 1000, потом обнуляете счетчик и создаете новый файл.

Добрый день! Можете подсказать как это сделать?

0

Эксперт 1С

3051 / 1998 / 524

Регистрация: 25.06.2009

Сообщений: 6,964

26.10.2017, 14:40

11

Ermak27, вы же написали, что решили задачу)3 месяца прошло…

0

4 / 4 / 0

Регистрация: 16.01.2013

Сообщений: 1,228

26.10.2017, 14:44

 [ТС]

12

GreenkA, я проверил на файл где было 50000 строк, но до конца файл не до делал. Сейчас стал обрабатывать файл и смотрю что обработка не рабочая. Не могу понять почему все 3000 строк одно значение записывает и постоянно требует файл.

Добавлено через 2 минуты
Идея была такая, выгрузил справочник, получилось в таблице 2900 строк, мне нужно выгрузить в шаблон формата xls максимум 1000 строк. Я создаю 3 одинаковых шаблона и начинаю выгружать в них по 1000 строк, получается что два шаблона будет по 1000 строк а третий шаблон 900 строк.

0

Joker_vad

Эксперт 1С

476 / 413 / 93

Регистрация: 26.09.2012

Сообщений: 1,903

26.10.2017, 15:35

13

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
Запрос=Новый Запрос;
    Запрос.Текст="ВЫБРАТЬ
    |   ЛицевыеСчетГИСЖКХ.КодЖКХ
    |ИЗ
    |   Справочник.ЛицевыеСчетГИСЖКХ КАК ЛицевыеСчетГИСЖКХ
    |ГДЕ
    |   ЛицевыеСчетГИСЖКХ.Регион = &Регион
    |   И НЕ ЛицевыеСчетГИСЖКХ.КодЖКХ = """""; 
    Запрос.УстановитьПараметр("Регион",Регион);
    Таб = Запрос.Выполнить().Выгрузить();
    
    НомерСтроки=3;
    НомерПД=0;
    ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    ДиалогВыбора.Заголовок = "Выберите файл";
    
    Если ДиалогВыбора.Выбрать() Тогда
        ИмяФайлаДанных = ДиалогВыбора.ПолноеИмяФайла;
    КонецЕсли;  
    
    Для Каждого Стр из Таб Цикл 
        Если НомерСтроки = 1000 Тогда
            НомерСтроки = 0;
            Попытка
                Книга.SaveAs(ИмяФайлаДанных); 
            Исключение
                Сообщить(ОписаниеОшибки()+" Файл не сохранен!"); 
                Возврат;
            КонецПопытки;
            Эксель.Application.Quit();
            Попытка
                Эксель = Новый COMОбъект("Excel.Application"); 
            Исключение
                Сообщить(ОписаниеОшибки() + " Программа Exсel не установлена на данном компьютере!"); 
                Возврат;
            КонецПопытки; 
            Книга=Эксель.Application.Workbooks.Open(ИмяФайлаДанных);
            
            Лист1 = Книга.WorkSheets(1);
            
        КонецЕсли;
        
        НомерСтроки=НомерСтроки+1;
        НомерПД=НомерПД+1;      
        Лист1.Cells(НомерСтроки, 1).Value =  Стр.КодЖКХ;
        Лист1.Cells(НомерСтроки, 2).Value =  "Текущий";             
        Лист1.Cells(НомерСтроки, 3).Value =  "ПД-"+НомерПД;
        Лист1.Cells(НомерСтроки, 4).Value =  Формат(Месяц,"ДФ=MM.yyyy");                
        Лист1.Cells(НомерСтроки, 5).Value =  "@";               
        Лист1.Cells(НомерСтроки, 12).Value =  "044525220";
        Лист1.Cells(НомерСтроки, 13).Value =  "40702810400010005163";
        Состояние("Кол-во= "+НомерПД);        
    КонецЦикла;
    Если не НомерСтроки = 0 Тогда
        Попытка
            Книга.SaveAs(ИмяФайлаДанных); 
        Исключение
            Сообщить(ОписаниеОшибки()+" Файл не сохранен!"); 
            Возврат;
        КонецПопытки;
        Эксель.Application.Quit();
    КонецЕсли;

Правда не тестил

1

Ermak27

4 / 4 / 0

Регистрация: 16.01.2013

Сообщений: 1,228

27.10.2017, 09:32

 [ТС]

14

Joker_vad, выдает ошибки
{ВнешняяОбработка.ВнешняяОбработка2.Форма.Форма.Фо рма(693,17)}: Переменная не определена (Книга)
<<?>>Книга.SaveAs(ИмяФайлаДанных); (Проверка: Толстый клиент (обычное приложение))
{ВнешняяОбработка.ВнешняяОбработка2.Форма.Форма.Фо рма(698,13)}: Переменная не определена (Эксель)
<<?>>Эксель.Application.Quit(); (Проверка: Толстый клиент (обычное приложение))

Добавлено через 17 часов 7 минут
Добавил в начала кода

1C
1
2
    Перем Книга;
    Перем Эксель;

выдает ошибку {ВнешняяОбработка.ВнешняяОбработка2.Форма.Форма.Фо рма(1827)}: Значение не является значением объектного типа (SaveAs) Файл не сохранен!

0

Joker_vad

Эксперт 1С

476 / 413 / 93

Регистрация: 26.09.2012

Сообщений: 1,903

27.10.2017, 09:55

15

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
Запрос=Новый Запрос;
    Запрос.Текст="ВЫБРАТЬ
    |   ЛицевыеСчетГИСЖКХ.КодЖКХ
    |ИЗ
    |   Справочник.ЛицевыеСчетГИСЖКХ КАК ЛицевыеСчетГИСЖКХ
    |ГДЕ
    |   ЛицевыеСчетГИСЖКХ.Регион = &Регион
    |   И НЕ ЛицевыеСчетГИСЖКХ.КодЖКХ = """""; 
    Запрос.УстановитьПараметр("Регион",Регион);
    Таб = Запрос.Выполнить().Выгрузить();
    
    НомерСтроки=3;
    НомерПД=0;
    ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    ДиалогВыбора.Заголовок = "Выберите файл";
    
    Если ДиалогВыбора.Выбрать() Тогда
        ИмяФайлаДанных = ДиалогВыбора.ПолноеИмяФайла;
 Попытка
            Эксель = Новый COMОбъект("Excel.Application"); 
        Исключение
            Сообщить(ОписаниеОшибки() + " Программа Exсel не установлена на данном компьютере!"); 
            Возврат;
        КонецПопытки; 
        Книга=Эксель.Application.Workbooks.Open(ИмяФайлаДанных);
        
        Лист1 = Книга.WorkSheets(1);
    КонецЕсли;  
    
    Для Каждого Стр из Таб Цикл 
        Если НомерСтроки = 1000 Тогда
            НомерСтроки = 0;
            Попытка
                Книга.SaveAs(ИмяФайлаДанных); 
            Исключение
                Сообщить(ОписаниеОшибки()+" Файл не сохранен!"); 
                Возврат;
            КонецПопытки;
            Эксель.Application.Quit();
            Попытка
                Эксель = Новый COMОбъект("Excel.Application"); 
            Исключение
                Сообщить(ОписаниеОшибки() + " Программа Exсel не установлена на данном компьютере!"); 
                Возврат;
            КонецПопытки; 
            Книга=Эксель.Application.Workbooks.Open(ИмяФайлаДанных);
            
            Лист1 = Книга.WorkSheets(1);
            
        КонецЕсли;
        
        НомерСтроки=НомерСтроки+1;
        НомерПД=НомерПД+1;      
        Лист1.Cells(НомерСтроки, 1).Value =  Стр.КодЖКХ;
        Лист1.Cells(НомерСтроки, 2).Value =  "Текущий";             
        Лист1.Cells(НомерСтроки, 3).Value =  "ПД-"+НомерПД;
        Лист1.Cells(НомерСтроки, 4).Value =  Формат(Месяц,"ДФ=MM.yyyy");                
        Лист1.Cells(НомерСтроки, 5).Value =  "@";               
        Лист1.Cells(НомерСтроки, 12).Value =  "044525220";
        Лист1.Cells(НомерСтроки, 13).Value =  "40702810400010005163";
        Состояние("Кол-во= "+НомерПД);        
    КонецЦикла;
    Если не НомерСтроки = 0 Тогда
        Попытка
            Книга.SaveAs(ИмяФайлаДанных); 
        Исключение
            Сообщить(ОписаниеОшибки()+" Файл не сохранен!"); 
            Возврат;
        КонецПопытки;
        Эксель.Application.Quit();
    КонецЕсли;

1

4 / 4 / 0

Регистрация: 16.01.2013

Сообщений: 1,228

27.10.2017, 10:53

 [ТС]

16

Joker_vad, по просил выбрать файл, я выбрал, сразу же по просил пере сохранить его, я пере сохранил, и все. Открываю файл а они пустой, а где там 1000 строк?

0

Joker_vad

Эксперт 1С

476 / 413 / 93

Регистрация: 26.09.2012

Сообщений: 1,903

27.10.2017, 10:56

17

1C
1
Таб = Запрос.Выполнить().Выгрузить();

Сколько записей вернула?

0

4 / 4 / 0

Регистрация: 16.01.2013

Сообщений: 1,228

27.10.2017, 10:57

 [ТС]

18

Joker_vad, в отладчике показало что в таб = 0

0

Эксперт 1С

476 / 413 / 93

Регистрация: 26.09.2012

Сообщений: 1,903

27.10.2017, 10:58

19

Ну тогда все адекватно отработало, у вас 0 строк к записи в эксель

0

4 / 4 / 0

Регистрация: 16.01.2013

Сообщений: 1,228

27.10.2017, 11:03

 [ТС]

20

Joker_vad, спасибо большое, буду разбираться.

Добавлено через 4 минуты
Joker_vad, я разобрался с пустой таблицей, но что то не так работает. В каждый раз идет пере записывания файла, а должен просить новый файл куда записывать следующую информацию или создавать копию файла

0

Я пытаюсь создать файл csv из файла Excel с помощью MS Excel Interop в моем приложении C # / Winforms.

Я получаю эту ошибку в методе SaveAs в приведенном ниже коде.

‘Невозможно получить доступ к файлу. Попробуйте одно из следующего:

• Убедитесь, что указанная папка существует. • Убедитесь, что папка, содержащая файл, не предназначена только для чтения. • Убедитесь, что имя файла не содержит следующих символов: <>? []: | или * • Убедитесь, что имя файла / пути не содержит более 218 символов. ‘z

Я попытался установить только для чтения значение false в методе Workbook Open (…) в соответствии с:
Проблема с сохранением файла Excel после вставки данных , но по-прежнему возникает та же ошибка.

В моем коде путь к файлу csv был: C: Если я изменю путь к файлу csv на C: SomeFolder или какой-либо общий путь UNC, я не получу эту ошибку.

Пожалуйста, посоветуйте. Может быть, есть проблемы с разрешениями на диске C?

Вот код:

xlApp = new Microsoft.Office.Interop.Excel.Application(); 
xlApp.DisplayAlerts = false;
xlApp.Visible = false; 
wbkSrc = xlApp.Workbooks.Open(m_sSrcFil, 
                        Type.Missing, false, Type.Missing, Type.Missing, 
                        Type.Missing, Type.Missing, Type.Missing, Type.Missing, 
                        Type.Missing, Type.Missing, Type.Missing, Type.Missing, 
                        Type.Missing, Type.Missing);


                wstSrc = (Worksheet)wbkSrc.Worksheets[sSrcSht]; 
                //wstSrc.Activate();

                rngWork = wstSrc.Cells.get_Range("H:H", System.Reflection.Missing.Value); 
                rngWork.NumberFormat = "General";

                dteTmpDate = Convert.ToDateTime(m_sBusDate); 
                sTmpFileName = m_sSrcFil.Substring(0, m_sSrcFil.IndexOf(".")) + "_" + 
                    m_sUserName + "_" + dteTmpDate.ToString("yyyy_MM_dd") + ".Csv";

                wstSrc.SaveAs(sTmpFileName, XlFileFormat.xlCSV, Type.Missing, 
                    Type.Missing, true, Type.Missing, Type.Missing, Type.Missing, 
                    Type.Missing, Type.Missing);

Heltarion

2 / 2 / 0

Регистрация: 21.11.2011

Сообщений: 57

1

02.12.2011, 11:18. Показов 9022. Ответов 11

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Добрый день!
Посмотрите пожалуйста. Есть в обработке таблица значений, в которую я выгружаю данные их XML, после этого я корректирую таблицу и хочу чтобы программа сохранила ее в новый документ эксель. Для этого я создал процедуру «Процедура СохранитьНажатие(Элемент) Экспорт». При сохранении выскакивает: «Ошибка при установке значения атрибута контекста (Value)». Насколько я понимаю, программе не нравится тип значения, который я передаю.
Переменные:

ТПП — «табличное поле правил», в ней уже занесены некотрые значения из XML
НоменклатураЗагрузки, НоменклатураБазы — имена столбцов ТПП
СтолбЗагр, СтолбБаз — столбцы в экселе

Код процедуры:

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
СтолбЗагр = 1;
СтолбБаз = 2;
 
Если ИнициализацияЭкселя() Тогда
      Книга = Excel.WorkBooks.Add();
      Sheet = Книга.Sheets(1);
    
      Для каждого стр из ТПП Цикл
              Sheet.Cells(стр,СтолбЗагр).Value=стр.НоменклатураЗагрузки;
              Sheet.Cells(стр,СтолбБаз).Value=стр.НоменклатураБазы;
      КонецЦикла;
 
      Попытка
              Книга.SaveAs("F:1CBaseВнешнии обработкиправила.xls");
      Исключение
              Сообщить(ОписаниеОшибки()+" Файл не сохранен!");
              Возврат;
      КонецПопытки;
КонецЕсли;
Сообщить("Готово");



0



308 / 308 / 1

Регистрация: 16.01.2011

Сообщений: 1,073

02.12.2011, 11:32

2

СохранитьНажатие(Элемент) это событие формы
в этой процедуре пропиши вызов другой процедуры, например СохранитьВЭксель();
саму же процедуру СохранитьВЭксель() добавь в модуль объекта и сделай её экспортной. Вставь свой код представленный выше.
обращение из формы будет ЭтотОбъект.СохранитьВЭксель();



1



2 / 2 / 0

Регистрация: 21.11.2011

Сообщений: 57

02.12.2011, 11:56

 [ТС]

3

СохранитьНажатие(Элемент) это событие формы
в этой процедуре пропиши вызов другой процедуры, например СохранитьВЭксель();
саму же процедуру СохранитьВЭксель() добавь в модуль объекта и сделай её экспортной. Вставь свой код представленный выше.
обращение из формы будет ЭтотОбъект.СохранитьВЭксель();

В МодулеОбъекта создал функцию «Процедура СохранитьВЭксель(ТПП) Экспорт»
Прописал в ней тотже код, что выше. В событии формы написал: ЭтотОбъект.СохранитьВЭксель(ТПП);
Выскочила ошибка: Ошибка при вызове метода контекста (Cells)
Что я нетак сделал?



0



308 / 308 / 1

Регистрация: 16.01.2011

Сообщений: 1,073

02.12.2011, 12:10

4

процедуру ИнициализацияЭкселя() тоже закинь в модуль объекта
СохранитьВЭксель(ТПП), параметр ТПП скорее всего не нужен



1



2 / 2 / 0

Регистрация: 21.11.2011

Сообщений: 57

02.12.2011, 12:19

 [ТС]

5

Да я именно так и сделал, просто забыл упомянуть, ТПП нужна в противном случае он не понимает что это за переменная

Добавлено через 4 минуты
Проблема вот в чем:
Sheet.Cells(стр,СтолбЗагр).Value=1;
Sheet.Cells(стр,СтолбБаз).Value=2;

Так работает, но если я поставлю
Sheet.Cells(стр,СтолбБаз).Value=стр.НоменклатураБа зы;
Выдает ошибку «Ошибка при установке значения атрибута контекста (Value)».

Дело в том что «стр.НоменклатураБазы» — это справочник ссылка, если у нее текстовый тип то программа глотает и записывает.



0



19 / 18 / 1

Регистрация: 15.11.2011

Сообщений: 54

02.12.2011, 12:22

6

чет вы мудрено делаете.
У вас не правильно указывается адресс ячейки в cell. Если стр — это коллекция или массив записей, то он не может нести в себе номер ячейки.
Не знаком с 1C, но програмлю в Excel и делаю выгрузки из других систем.



1



2 / 2 / 0

Регистрация: 21.11.2011

Сообщений: 57

02.12.2011, 12:28

 [ТС]

7

В данный момент ему не нравится присваемое значение к ячейке экселя (если я правильно понимаю сообщение «Ошибка при установке значения атрибута контекста (Value)» )

Причем если тип значения строка, то он его получает без вопросо, если тип значения СправочникССсылка, то он руегается на «Ошибка при установке значения атрибута контекста (Value)».

Я просто не понимаю как обратиться к такому типу переменных чтобы получить значение типа строка.



0



19 / 18 / 1

Регистрация: 15.11.2011

Сообщений: 54

02.12.2011, 12:30

8

а принудительно все значения в текст перевести нельзя?



1



308 / 308 / 1

Регистрация: 16.01.2011

Сообщений: 1,073

02.12.2011, 12:30

9

стр.НоменклатураБазы.Наименование например



1



2 / 2 / 0

Регистрация: 21.11.2011

Сообщений: 57

02.12.2011, 12:32

 [ТС]

10

стр.НоменклатураБазы — это уже есть наименование интересующего меня поля (имя столбца), в некотрых случаях можно писать: стр.НоменклатураБазы.Значение, но это нетот случай

Добавлено через 56 секунд
Спасибо вам большое, вы меня на правильный путь направили, мне сейчас только понять как получить значение из данного элемента



0



308 / 308 / 1

Регистрация: 16.01.2011

Сообщений: 1,073

02.12.2011, 12:34

11

значение из Excel?



1



Heltarion

2 / 2 / 0

Регистрация: 21.11.2011

Сообщений: 57

02.12.2011, 12:43

 [ТС]

12

Рабочий код:

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Функция ИнициализацияЭкселя()
 
    //Пытаемся подключиться к Excel
    Попытка
        Excel = новый COMОбъект("Excel.Application");
        Сообщить("=====> Загрузка производится через MS Excel...");
        Возврат Истина;
    Исключение
        Возврат Ложь                
    КонецПопытки;     
    
КонецФункции
 
 
Процедура СохранитьНажатие(Элемент) Экспорт
    СтолбЗагр = 1; // задаю номер столбца№1 в эксель
    СтолбБаз = 2;  // задаю номер столбца№2 в эксель
    
    Если ИнициализацияЭкселя() Тогда
        Книга = Excel.WorkBooks.Add(); // создал новый документ
        Sheet = Книга.Sheets(1);          // открыл страницу 1
   
// цикл для заполнения таблицы эксель данными из табличного поля (по двум полям)     
        Для каждого стр из ТПП Цикл
            Sheet.Cells(стр,СтолбЗагр).Value=стр.НоменклатураЗагрузки;
            Sheet.Cells(стр,СтолбБаз).Value=стр.НоменклатураБазы.Наименование;
        КонецЦикла;
 
//выполняю сохранение документа       
        Попытка
            Книга.SaveAs("F:1CBaseВнешнии обработкиправила12.xlsx");
        Исключение
            Сообщить(ОписаниеОшибки()+" Файл не сохранен!");
            Возврат;
        КонецПопытки;
    КонецЕсли;
    Книга.Application.Quit();
    Сообщить("Готово");
КонецПроцедуры



0



Понравилась статья? Поделить с друзьями:
  • Ошибка при вызове метода контекста open произошла исключительная ситуация microsoft excel
  • Ошибка при вызове метода контекста open excel workbooks open
  • Ошибка при вызове метода контекста add произошла исключительная ситуация microsoft word
  • Ошибка при вызове метода контекста add excel
  • Ошибка при выделении памяти excel