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

   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;

  

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 не будет опубликован. Обязательные поля помечены *

Я пытаюсь создать файл 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. Показов 8319. Ответов 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

Я пытаюсь сохранить книгу excel (с поддержкой макросов) в виде csv-файла через этот макрос, перезаписывая старый (ниже у меня было изменение имени папки и листа, но это, похоже, не проблема!):

 Sub SaveWorksheetsAsCsv() Dim SaveToDirectory As String Dim CurrentWorkbook As String Dim CurrentFormat As Long CurrentWorkbook = ThisWorkbook.FullName CurrentFormat = ThisWorkbook.FileFormat SaveToDirectory = "MyFolder" Application.DisplayAlerts = False Application.AlertBeforeOverwriting = False Sheets("My_Sheet").Copy ActiveWorkbook.SaveAs Filename:=SaveToDirectory & "My_Sheet" & ".csv", FileFormat:=xlCSV ActiveWorkbook.Close SaveChanges:=False ThisWorkbook.Activate ThisWorkbook.SaveAs Filename:=CurrentWorkbook, FileFormat:=CurrentFormat Application.DisplayAlerts = True Application.AlertBeforeOverwriting = True End Sub 

как ни странно, иногда, но не всегда, он терпит неудачу и сообщение об ошибке заголовка (ошибка выполнения 1004: метод saveas объекта _workbook не) выскакивает с отладчиком, указывающим мне на эту строку:

 ActiveWorkbook.SaveAs Filename:=SaveToDirectory & "My_Sheet" & ".csv", FileFormat:=xlCSV 

I погуглил его, и, по-видимому, это происходит много с людьми, и некоторые из решений, которые я пробовал, были:

  • указание того, что каталог является строкой
  • избегайте любого специального символа в имени файла или папки (см. здесь)
  • копировать вставьте лист как значение перед сохранением его как .csv (см. здесь)
  • указание FileFormat с помощью .номер кода csv (см. здесь)
  • отключение/повторное включение некоторых предупреждений
  • добавление других полей в ActiveWorkbook.Сохранить как строку, касающиеся паролей, создания резервных копий etcetc

тем не менее, он может работать правильно до 50-60 раз подряд, а затем в какой-то момент снова терпеть неудачу в строке.

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

заранее спасибо за ваше время.

EDIT: решено благодаря предложению Degustaf. Я внес только два изменения в предложенный Degustaf код:

  • ThisWorkbook.Листы вместо CurrentWorkbook.Листы
  • FileFormat:=6 вместо FileFormat:=xlCSV (по-видимому, более надежный
    для разных версий excel)
Sub SaveWorksheetsAsCsv() Dim SaveToDirectory As String Dim CurrentWorkbook As String Dim CurrentFormat As Long Dim TempWB As Workbook Set TempWB = Workbooks.Add CurrentWorkbook = ThisWorkbook.FullName CurrentFormat = ThisWorkbook.FileFormat SaveToDirectory = "MyFolder" Application.DisplayAlerts = False Application.AlertBeforeOverwriting = False ThisWorkbook.Sheets("My_Sheet").Copy Before:=TempWB.Sheets(1) ThisWorkbook.Sheets("My_Sheet").SaveAs Filename:=SaveToDirectory & "My_Sheet" & ".csv", FileFormat:=6 TempWB.Close SaveChanges:=False ThisWorkbook.SaveAs Filename:=CurrentWorkbook, FileFormat:=CurrentFormat ActiveWorkbook.Close SaveChanges:=False Application.DisplayAlerts = True Application.AlertBeforeOverwriting = True End Sub 

3 ответов


Я вообще считаю что ActiveWorkbook проблема в этих случаях. Под этим я подразумеваю, что каким-то образом у вас нет этой книги (или любой другой), и Excel не знает, что делать. К сожалению, с copy ничего не возвращает (скопированный рабочий лист был бы хорошим), это стандартный способ подхода к этой проблеме.

Итак, мы можем подойти к этому, как мы можем скопировать этот лист в новую книгу, и получить ссылку на эту книгу. Что мы можем сделать, так это создать новая книга, а затем скопируйте лист:

Dim wkbk as Workbook Set Wkbk = Workbooks.Add CurrentWorkbook.Sheets("My_Sheet").Copy Before:=Wkbk.Sheets(1) Wkbk.SaveAs Filename:=SaveToDirectory & "My_Sheet" & ".csv", FileFormat:=xlCSV Wkbk.Close SaveChanges:=False 

или есть еще лучший подход в такой ситуации: WorkSheet поддерживает SaveAs метод. Нет необходимости копировать.

CurrentWorkbook.Sheets("My_Sheet").SaveAs Filename:=SaveToDirectory & "My_Sheet" & ".csv", FileFormat:=xlCSV 

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


Это год назад, но я добавлю кое-что для будущих читателей

вы не найдете много документации в справке Excel для ошибки времени выполнения 1004, поскольку Microsoft не считает ее ошибкой Excel.

ответы выше 100% действительны, но иногда это помогает узнать, что вызывает проблему, так что вы можете избежать его, исправить его раньше или исправить его более легко.

факт что это прерывистый недостаток, и он исправлен путем сохранять с полным путем и имя файла говорит мне, что ваш макрос может пытаться сохранить.xlsb-файл в каталог autorecover после автоматического восстановления файла.

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

вы можете проверить путь и имя файла с:-
Функцию MsgBox Файл Thisworkbook.Полное имя

вы должны увидеть что-то подобное в окне сообщения.

C:UsersMikeAppDataRoamingMicrosoftExcelDIARY (Версия 1).xlxb

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

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

примечание по гиперссылкам

после этой ошибки: если у вас есть гиперссылки на листе, созданных с Ctrl+k по всей вероятности, у вас будет что-то вроде «AppDataRoamingMicrosoft», «AppDataRoaming», «../../ AppData / роуминг/ «или»….Мои документыМои документы » в нескольких гиперссылках после восстановления файла. Вы можете избежать их путем прикрепление гиперссылок к текстовому полю или их генерация с помощью функции гиперссылки.

идентификация и ремонт их немного сложнее

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

Excel не предоставляет средства в меню «перейти к специальному» для поиска гиперссылок, созданных с помощью Ctrl+k.

вы можете автоматизировать идентификацию ошибочных гиперссылок в вспомогательном столбце, скажем, столбец Z и используя формулу

=OR(ISNUMBER(SEARCH("Roaming", Link2Text($C2),1)),ISNUMBER(SEARCH("Roaming", Link2Text($D2),1))) 

где Link2Text является UDF

функция Link2Text (rng как диапазон) как строка
— Не отключайтесь.
«Находит гиперссылки, содержащие «роуминг» в столбце Z.

' Identify affected hyperlinks If rng(1).Hyperlinks.Count Then Link2Text = rng.Hyperlinks(1).Address End If End Function 

мой VBA для исправления ошибок выглядит следующим образом

Sub Replace_roaming ()

‘ Выберите правильный лист
Листы («дневник»).Выберите

Dim hl As Hyperlink For Each hl In ActiveSheet.Hyperlinks hl.Address = Replace(hl.Address, "AppDataRoamingMicrosoft", "") Next For Each hl In ActiveSheet.Hyperlinks hl.Address = Replace(hl.Address, "AppDataRoaming", "") Next For Each hl In ActiveSheet.Hyperlinks hl.Address = Replace(hl.Address, "../../AppData/Roaming/", "....My documents") Next For Each hl In ActiveSheet.Hyperlinks hl.Address = Replace(hl.Address, "....My documentsMy documents", "....My documents") Next Application.Run "Recalc_BT" ' Move down one active row to get off the heading ActiveCell.Offset(1, 0).Select ' Check active row location If ActiveCell.Row = 1 Then ActiveCell.Offset(1, 0).Select End If ' Recalc active row ActiveCell.EntireRow.Calculate ' Notify MsgBox "Replace roaming is now complete." End Sub 

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

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

следующие ярлыки будут резервное копирование рабочего листа в секундах:Ctrl+O, [выделите имя файла], Ctrl+C, Ctrl+V, [ X]. Регулярные резервные копии позволяют сразу перейти к последней резервной копии без необходимости восстановления из файла резервной копии прошлой ночи, особенно если вам нужно сделать запрос другого человека, чтобы сделать это.


попробуйте объединить путь и имя файла CSV в строковую переменную и отбросить.csv; который обрабатывается FileFormat. Путь должен быть абсолютным, начиная с буквы диска или имени сервера:
Dim strFullFileName as String
strFullFileName = "C:My FolderMy_Sheet"
Если на сервере, то это будет выглядеть примерно так:
strFullFileName = "ServerNameShareNameMy FolderMy_Sheet"
Substiture ServerName с именем вашего сервера и замените ShareName именем вашего сетевого ресурса, например data101AccountingMy FolderMy_Sheet
ActiveWorkbook.SaveAs Filename:=strFullFileName,FileFormat:=xlCSVMSDOS, CreateBackup:=False


Автор 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С — ПРЕДПРИЯТИЕ 8.0 8.1 8.2 8.3 8.4

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

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

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

Рейтинг@Mail.ru

Rambler's Top100

Поиск

<?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 не будет опубликован. Обязательные поля помечены *

This is a year old, but I’ll add something for future readers

You won’t find a lot of documentation in Excel help for Run-time error 1004 as Microsoft doesn’t consider it to be an Excel error.

The answers above are 100% valid but sometimes it helps to know what is causing the problem so you can avoid it, fix it earlier or fix it more easily.

The fact that this is an intermittent fault, and it is fixed by saving with the full path and file name tells me that either your macro may be trying to save an .xlsb file to the autorecover directory after an auto file recovery.

Alternatively, you may have edited the file’s path or filename yourself.

You can check the path and filename with:-
MsgBox ThisWorkbook.FullName

You should see something like this in the message box.

C:UsersMikeAppDataRoamingMicrosoftExcelDIARY(version 1).xlxb

If so the solution is (as stated above by others) to save your file to its correct path and file name. This can be done with VBA or manually.

I am now in the habit of manually saving the file with its correct path and filename as a matter of course after any autorecover action as it takes seconds and I find it quicker (if this is not a daily occurrence). Thus, the macros will not encounter this fault you run it. Remember that while my habit of manually saving .xlxb files to .xlsm files immediately after a recovery won’t help a novice that you give the worksheet to.

A note on Hyperlinks

After this error: If you have hyperlinks in your worksheet created with Ctrl+k in all likelihood, you will have something like «AppDataRoamingMicrosoft», «AppDataRoaming», «../../AppData/Roaming/»or «….My documentsMy documents» in multiple hyperlinks after file recovery. You can avoid these by attaching your hyperlinks to a text box or generating them with the HYPERLINK function.

Identifying and Repairing them is a little more complicated

First, examine the hyperlinks and determine the erroneous strings and the correct string for each error. Over time, I have found several.

Excel doesn’t provide a facility in the ‘Go To Special’ menu to search for hyperlinks created with Ctrl+k.

You can automate the identification of erroneous hyperlinks in a helper column, say column Z and using the formula

=OR(ISNUMBER(SEARCH("Roaming", Link2Text($C2),1)),ISNUMBER(SEARCH("Roaming", Link2Text($D2),1)))

where Link2Text is the UDF

Function Link2Text(rng As Range) As String
‘ DO NOT deactivate.
‘ Locates hyperlinks containing ‘roaming’ in column Z.

' Identify affected hyperlinks
    If rng(1).Hyperlinks.Count Then
    Link2Text = rng.Hyperlinks(1).Address
    End If

  End Function

My VBA to correct the errors is as follows

Sub Replace_roaming()

‘ Select the correct sheet
Sheets(«DIARY»).Select

Dim hl As Hyperlink
For Each hl In ActiveSheet.Hyperlinks
    hl.Address = Replace(hl.Address, "AppDataRoamingMicrosoft", "")
Next
    For Each hl In ActiveSheet.Hyperlinks
    hl.Address = Replace(hl.Address, "AppDataRoaming", "")
Next

    For Each hl In ActiveSheet.Hyperlinks
    hl.Address = Replace(hl.Address, "../../AppData/Roaming/", "....My documents")
Next
    For Each hl In ActiveSheet.Hyperlinks
    hl.Address = Replace(hl.Address, "....My documentsMy documents", "....My documents")
Next

Application.Run "Recalc_BT"

' Move down one active row to get off the heading
    ActiveCell.Offset(1, 0).Select

' Check active row location
    If ActiveCell.Row = 1 Then
    ActiveCell.Offset(1, 0).Select
    End If

' Recalc active row
   ActiveCell.EntireRow.Calculate

' Notify
    MsgBox "Replace roaming is now complete."

End Sub

I also recommend you get in the habit of doing regular backups and not relying on autorecover alone. If it fails, you have nothing since your last full backup.

While the worksheet is being fragile backup often, like every hour or after any significant import of new data.

The following shortcuts will backup your worksheet in seconds: Ctrl+O, [highlight the filename], Ctrl+C, Ctrl+V, [ X ]. Regular backups allow you to go immediately to your most recent backup without having to restore from last night’s backup file especially if you have to make a request of another person to do this.

  • Ошибка при вызове метода контекста выполнить выборка запрос выполнить выбрать
  • Ошибка при вызове метода контекста range произошла исключительная ситуация 0x800a03ec
  • Ошибка при вызове метода контекста вызватьhttpметод
  • Ошибка при вызове метода контекста quit
  • Ошибка при вызове метода контекста выгрузить метод недоступен на клиенте