15.05.15 — 10:30
Столкнулся со следущим: При сохранении файла ексель в 1С вылетает ошибка:
Ошибка при вызове метода контекста (Save)
ТекущийДокЕксель.Save();
по причине:
Произошла исключительная ситуация (Microsoft Excel): Метод Save из класса Application завершен неверно
Порылся на форумах, внятного ответа как исправить не нашёл.
Делается следущее: есть файл екселя (.xls) с заданной структурой, в него вносятся данные, сохраняются, отсылаются на почты.
Может ли быть такая ошибка из-за того, что на сервере, где выполняется обработка стоит 2013 офис и файл открывается в режиме совместимости? Как это обходить?
1 — 15.05.15 — 10:59
Метод saveAs вообще не обнаружен.
2 — 15.05.15 — 11:01
может прав нет на место сохранения?
3 — 15.05.15 — 11:01
Никто не сталкивался?
4 — 15.05.15 — 11:02
Права есть. Если просто открыть екселем, изменить и сохранить как — все прокатывает, а через 1С сохранить не получается.
5 — 15.05.15 — 11:04
Создается файлик, но ячейки пустые. Формат вроде нужный — .xls
6 — 15.05.15 — 11:05
(4) если это делается на сервере, то права надо смотреть у пользователя под кем работает служба сервера приложений
7 — 15.05.15 — 11:13
Новая книга? Попобуй saveas()
8 — 15.05.15 — 11:13
(6) Попробую уточнить. По результатам отпишусь.
9 — 15.05.15 — 11:13
(7) При этом методе
Метод объекта не обнаружен (SaveAs) ТекущийДокЕксель.SaveAs(КаталогДанных + «» + ТекИмя);
10 — 15.05.15 — 11:14
Текущийдокэксель это книга или аппликейшн?
11 — 15.05.15 — 11:17
Ну кароч ты книгу должен сохранять. Покажи что присваиваешь текущийдокэксель
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) копрокод
16 — 15.05.15 — 11:37
(15) Пробовал
ТекущийДокЕксель.Application.Workbooks.SaveAs(КаталогДанных + «» + ТекИмя);
ТекущийДокЕксель.Workbooks.SaveAs(КаталогДанных + «» + ТекИмя);
Также не видит функцию
17 — 15.05.15 — 11:43
(15)
{Форма.Форма.Форма(571)}: Ошибка при вызове метода контекста (SaveAs)
ТекущийДокЕксель.ActiveWorkbook.SaveAs(КаталогДанных + «» + ТекИмя);
по причине:
Произошла исключительная ситуация (Microsoft Excel): Метод SaveAs из класса Workbook завершен неверно
18 — 15.05.15 — 11:43
(16) workbooks это не workbook — другой объект
19 — 15.05.15 — 11:43
(16) смотри (12). то что у тебя все неправильное написание.
20 — 15.05.15 — 11:44
Ответ дан выше, перечитай (14)
21 — 15.05.15 — 11:46
(20) я в (17) показал какая ошибка выпадает при ТекущийДокЕксель.ActiveWorkbook
22 — 15.05.15 — 11:47
(19) где неправильно?
23 — 15.05.15 — 11:47
Сообщить(каталогданных+»»+текимя);
24 — 15.05.15 — 11:58
(23) Здесь все четко.
«F:Ведомостиимя.xls»
25 — 15.05.15 — 12:01
(24) Если файл существует попробуй опять save(). Для saveas можно вторым параметром задать формат файла еще
26 — 15.05.15 — 12:07
(25) Я ж говорю — ошибка есть, но файл пустой появляется..)
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:ведомости?
30 — 15.05.15 — 12:17
(28) Создал. Ура! Осталось протестировать откроет ли 2003 офис
31 — 15.05.15 — 12:22
(30) Вбей в справке по vba xlFileFormat
32 — 15.05.15 — 12:56
(31) а в Save есть подобные параметры?
33 — 15.05.15 — 13:12
(32) нет, он вообще без параметров
34 — 15.05.15 — 13:20
(33) Тогда ладно. Файлики создаются.
Есть ещё вопрос.
Обработина, сделанная по образу и подобию
http://catalog.mista.ru/public/88055/
ругается на .Windows(1).Visible = 1;
35 — 15.05.15 — 13:28
(34) значит опять путанница с объектами
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();
37 — 15.05.15 — 13:30
(35) выложил код. Запросы всякие вырезал.
38 — 15.05.15 — 13:32
Вся эта ботва вылезла когда поставили 2013 офис)
39 — 15.05.15 — 13:43
Отдельный момент.
Я может ошибаюсь: по коду если все удачно сохранилось, то объект excel не удаляется.
40 — 15.05.15 — 13:45
(39) не совсем понимаю к чему это..
41 — 15.05.15 — 13:48
Ошибка такая: Ошибка при вызове метода контекста (Windows)
КомОбъект.Windows(1).Visible = 1;
по причине:
Произошла исключительная ситуация (0x8002000b)
42 — 15.05.15 — 13:54
(40)Ну если я все правильно понимаю, то 10 раз запустите свой код, не выходя из 1с, и в процессах будет висеть 10 excel-ей.
43 — 15.05.15 — 14:01
(42) Это все проверяю
44 — 15.05.15 — 14:02
У меня просто открывается ексель как приложение, а окна документа не видно. Серый экран.
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
- Счет-фактура для УПП
- Библиотека классов для создания внешней компоненты 1С на C#
- Акт об оказании услуг (со скидками) — внешняя печатная форма для Управление торговлей 11.1.10.86
- Прайс-лист с артикулом в отдельной колонке
47 Comments
-
Спасибо за статью, но ничего нового тут нет. Если Вы испытываете трудности с получением макета — храните вордовский шаблон файлом на диске (в общей шаре конечно) и все сведется к получению кома файла НаКлиенте. Возможно есть случаи, когда необходимо хранить шаблон вордовского файла в конфигурации, но на мой взгляд оперативно изменять текстовку шаблона (особенно если это договор и юристы никак не могут договориться о содержании шаблона :)) без влезания в конфигуратор проще и быстрее.
Reply ↓
-
P.S. кстати, обратите, какая изящная задача получилась для тестирования опытного кандидата на работу.
На собеседовании спрашивают то, что сами недано узнали (с)баш
А если по теме, с какой стати у клиента есть доступ к файловой системе сервера и наоборот (и расшаренные папки тоже неуниверсально)? Лучше через двоичные данные и ХранилищеЗначения передавать, см. работу с картинками, а на клиенте сохранять во временный файл.
А так полезная статья, узнал зачем нужен ActiveDocument 🙂
(1) andrei.k, согласен, пусть лучше юзеры свой шаблон правят, не программистское это дело.
Reply ↓
-
Друзья, я с Вами полностью согласен. Но файла в общей шаре может и не быть, а может у него имя изменили, а может шара недоступна, а может там что-то изменили без нашего ведома и заполнение параметров этого файла не получится сделать корректно.
Слишком уж тут много неявных причин.
По сути да — не очень понятно на кой черт такие танцы с бубном, ведь программная работа с ActiveDocument ничем не отличается от ДвоичныхДанных или ХранилищаЗначения. Принцип тот же.
Но все-таки, пусть будет — для галочки 😉
Reply ↓
-
Макет = ОбщийМодуль.ПолучитьМакет(Документ); //серверная функция, записывает макет в файл и возвращает полное имя файла
разъясните
если серверная функция записывает макет в файл, то где этот файл будет лежать?
если на сервере, то как к нему получает доступ клиент в этом коде?
Шаблон = ПолучитьCOMОбъект(Макет); //инициализируем COM-объект
если на клиенте, то как серверная функция получит доступ к файловой системе клиента?
и как она передаст на клиента этот самый файл?
в общем, нужно привести листинг этой серверной функции, а также параметры модуля «ОбщийМодуль»
Reply ↓
-
(4) YurySigolaev, у нас настроена общая шара, которая доступна для клиента и для сервера, по той простой причине, что все юзеры находятся в домене и не могут самостоятельно сохранять файл на локальную машину, с которой работают в данный момент (т.к. каждый раз они могут садиться за разные компьютеры)
В остальных случаях уже написали как это делать 🙂
Reply ↓
-
А можно для тупых полный листинг привести?))
Reply ↓
-
Повторюсь
А можно для тупых полный листинг привести?))
Reply ↓
-
(6) s_uu, (7) Dighty,
какой именно листинг нужно привести?
В статье ведь есть листинг
Reply ↓
-
Листинг &НаСервере если можно.
Reply ↓
-
Или помогите я разобраться не могу. Мне надо документ activedocument на тонкий клиент вывести, сижу 3 день мозг ломаю. Пожалуйста помогите.
Reply ↓
-
(10) Dighty, через двоичные данные. Читайте 2-й пост
Reply ↓
-
Каким методом вы записывали файл Word на сервере? У меня на файловой метод SaveAs(ПУТЬ) работает, а на сервере нет. Путь доступен соответственно и там и тут, только на сервере почему то метод SaveAs не обнаружен… Метод Save работает только для ранее сохраненных, а у меня файл вновь созданный.
/////Уточнение от 17.09.15
Метод SaveAs он не пишет, что не обнаружен, а пишет «Произошла исключительная ситуация (Microsoft Word): Ошибка команды»
Reply ↓
-
(12) klinval, a word на сервере установлен?
Reply ↓
-
(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 ↓
-
(14) klinval, проверьте права доступа для пользователя, word и 1С на стороне сервера
Скорей всего проблема в этом. Можете попробовать залогиниться на сервак под юзером, под которым запускается 1С сервер и проверить, даёт ли там сохранить файл интерактивно
Reply ↓
-
(15) я уже ранее проводил такую проверку: залогинился под пользователем и сохранил word интерактивно. Клиентской 1С на сервере до этого вообще не стояло, я поставил. Запустился, а там ошибка(см. приложение). Возможно в этом и косяк.
У вас то обработка (во вложении к 14 сообщению) работает на SQL базе?
Reply ↓
-
(16) klinval, конкретно в данный момент, нет возможности проверить вашу обработку
Добавьте 1С в исключения в свойствах обозревателя IE
Reply ↓
-
(17) отключил усиленную безопасность IE, поставил на самый «небезопасный» уровень, ошибка, указанная в 16 сообщении ушла, но метод SaveAS всё равно не работает.
Так всё таки под кодом:
Макет = ОбщийМодуль.ПолучитьМакет(Документ); //серверная функция, записывает макет в файл и возвращает полное имя файла
Каким методом ты записываешь? Save, SaveAS?
Reply ↓
-
(18) klinval, посмотрите на дату публикации. Доступа к той обработке у меня давно нет, а в памяти я такое держать не могу 🙂
Что значит
метод SaveAS всё равно не работает.
?
Ошибка выпадает? Файл не сохраняет?
Reply ↓
-
(19)
Ошибка выпадает? Файл не сохраняет?
Да. Да:)
По-любому косяк где-то на уровне прав Windows-пользователя (т.е. связано с администрированием серверов, а не с 1С). Даже обработка с сообщения 14 не работает (хотя где там можно ошибиться?).
{Форма.Форма.Форма(13)}: Ошибка при вызове метода контекста (SaveAs)
Документ.SaveAs(ИмяВрем);
по причине:
Произошла исключительная ситуация (Microsoft Word): Ошибка команды
Поэтому мне проще было не разбираться, а запихнуть шаблон не в ActiveDocument, а в двоичные данные, которые я могу спокойно передать на клиент. Что я и сделал… А ошибка с SaveAs, скорее всего так и останется неразгаданной.
Reply ↓
-
(20) klinval, вам нужно запуститься непосредственно по тем пользователем, который указан для 1С на сервере и именно под ним попробовать сохранить MS Word интерактивно
Reply ↓
-
(21) уже пробовал. Сохраняет… как ни странно.
Reply ↓
-
(22) klinval, тогда нужно ловить ошибку, которую возвращает приложение
подключитесь к MS Word из 1С через COM на сервере и попытайтесь сохранить файл методом SaveAs
Reply ↓
-
(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 ↓
-
(24) klinval, вам нужна ошибка именно MS Word
{Форма.Форма.Форма(13)}: Ошибка при вызове метода контекста (SaveAs)
Документ.SaveAs(ИмяВрем);
по причине:
Произошла исключительная ситуация (Microsoft Word): Ошибка команды
Это листинг ошибки 1С. Обработайте через 1С, сообщение об ошибке MS Word и выведите её содержимое
Reply ↓
-
(25)
Обработайте через 1С, сообщение об ошибке MS Word и выведите её содержимое
Не понял, как это сделать?
Reply ↓
-
(26) klinval, в смысле? руками)))
Reply ↓
-
(27) правильно я понял: ты хочешь увидеть ошибку как её видит Word, а не как её нам даёт 1С?
Если да, то опять вопрос: как из 1С это можно вывести?
Reply ↓
-
(28) klinval, читай про COM-объекты и инструментарий по MS Word
Reply ↓
-
(29) что искать/читать и где? Вы ответьте хотя бы на:
правильно я понял: ты хочешь увидеть ошибку как её видит Word, а не как её нам даёт 1С?
Reply ↓
-
(30) klinval, искатьчитать:
— работа с COM объектами в 1С
— интеграция MS Word и 1С
Вы ответьте хотя бы на:
1С вообще никакой ошибки не видит, она тупо посредник между пользователем и приложением (MS Word)
Reply ↓
-
(31) это реально можно вывести ошибку в 1С как её видит Word или ты чисто теоретически предполагаешь, что такой метод есть?
Может я тебя не правильно понял: по тексту мне показалось, что ты уверен, что такая возможность (такой метод) есть, а может ты имел ввиду, что чисто теоретически такая возможность должна быть.
Reply ↓
-
(32) Столкнулся с аналогичной проблемой — хотел узнать, удалось ли ее в итоге победить или забили?
Ошибка таже:
Ошибка при вызове метода контекста (SaveAs)
Reply ↓
-
(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 ↓
-
(32) klinval, (33) ivant, (34) klinval,
вы получаете COM-объект MS Word
соответственно работаете с API данного com-объекта (т.е. Word)
функция SaveAS является функцией API Word
значит, чтобы получить ошибку Word нужно воспользоваться API этого самого Word
Reply ↓
-
-
Аналогичная ошибка, не может открыть документ сохраненный в темп
ДвоичныеДанные = ПолучитьДвоичныеДанныеМакета(); COMОбъект = Новый COMОбъект(«Word.Application»); ИмяВременногоФайла = ПолучитьИмяВременногоФайла(«DOC»); ДвоичныеДанные.Записать(ИмяВременногоФайла); COMОбъект.Documents.Open(ИмяВременногоФайла); // здесь вываливается ошибка, никаких документов он не открыл, в темпе лежит созданный документ ворда , COMОбъект.Documents.Count = 0, через ЖР проверял Док = COMОбъект.Application.Documents(1); Док.Activate();
Показать
Reply ↓
-
-
Почему при сохранении макета типа active document в файл word кодом:
Код:
ОбработкаОбъект = РеквизитФормыВЗначение(«Объект»); Макет = ОбработкаОбъект.ПолучитьМакет(«ШаблонПисьмаПросрочка»); ИмяФайла = КаталогВременныхФайлов() + «файл.doc»; Макет.Записать(ИмяФайла);
Я получаю вместо нормального документа вот такой
Reply ↓
-
А почему нельзя использовать документ двоичные данные? Загрузил туда шаблон. Получили шаблон. Сохранили документ. Передали на клиент имя открыли через 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 ↓
-
(42)
МакетПисьма = ПолучитьИзВременногоХранилища(Индификатор);
Здесь в тонком клиенте у Вас будет выскакивать ошибка. Такой способ только для толстого клиента подходит.
Reply ↓
-
(43) Выскажусь в защиту:
Глобальный контекст (Global context)
ПолучитьИзВременногоХранилища (GetFromTempStorage)
Синтаксис:
ПолучитьИзВременногоХранилища(<Адрес>)
Параметры:
<Адрес> (обязательный)
Тип: Строка.
Адрес, указывающий на значение во временном хранилище.
Возвращаемое значение:
Тип: Произвольный.
Значение, ранее помещенное с помощью метода ПоместитьВоВременноеХранилище.
Описание:
Получает значение из временного хранилища.
Доступность:
Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).
Вызов метода выполняет обращение к серверу.
Примечание:
Результат выполнения не кэшируется, вызов сервера осуществляется при каждом вызове метода.
Показать
В справке написано, что тонкий клиент можно использовать! Я в своей статье данный метод тоже привожу в тонком клиенте, причём этот код уже давно работает на рабочей базе (в толстом клиенте у нас никто не работает).
Reply ↓
-
-
Решение проблемы «Ошибка при вызове метода контекста (SaveAs) «
Reply ↓
-
-
(17) Надо не 1с в исключения добавить, а всю строку about:…. только при добавлении снять галку с https…,а указанное в (18) делать нежелательно…тем более на сервере…
Reply ↓
-
(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 Код процедуры:
__________________ 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 |
СохранитьНажатие(Элемент) это событие формы В МодулеОбъекта создал функцию «Процедура СохранитьВЭксель(ТПП) Экспорт» 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 минуты Так работает, но если я поставлю Дело в том что «стр.НоменклатураБазы» — это справочник ссылка, если у нее текстовый тип то программа глотает и записывает. 0 |
19 / 18 / 1 Регистрация: 15.11.2011 Сообщений: 54 |
|
02.12.2011, 12:22 |
6 |
чет вы мудрено делаете. 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 |
|||
Рабочий код:
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)
Поиск
<?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
- Счет-фактура для УПП
- Библиотека классов для создания внешней компоненты 1С на C#
- Акт об оказании услуг (со скидками) — внешняя печатная форма для Управление торговлей 11.1.10.86
- Прайс-лист с артикулом в отдельной колонке
47 Comments
-
Спасибо за статью, но ничего нового тут нет. Если Вы испытываете трудности с получением макета — храните вордовский шаблон файлом на диске (в общей шаре конечно) и все сведется к получению кома файла НаКлиенте. Возможно есть случаи, когда необходимо хранить шаблон вордовского файла в конфигурации, но на мой взгляд оперативно изменять текстовку шаблона (особенно если это договор и юристы никак не могут договориться о содержании шаблона :)) без влезания в конфигуратор проще и быстрее.
Reply ↓
-
P.S. кстати, обратите, какая изящная задача получилась для тестирования опытного кандидата на работу.
На собеседовании спрашивают то, что сами недано узнали (с)баш
А если по теме, с какой стати у клиента есть доступ к файловой системе сервера и наоборот (и расшаренные папки тоже неуниверсально)? Лучше через двоичные данные и ХранилищеЗначения передавать, см. работу с картинками, а на клиенте сохранять во временный файл.
А так полезная статья, узнал зачем нужен ActiveDocument 🙂
(1) andrei.k, согласен, пусть лучше юзеры свой шаблон правят, не программистское это дело.
Reply ↓
-
Друзья, я с Вами полностью согласен. Но файла в общей шаре может и не быть, а может у него имя изменили, а может шара недоступна, а может там что-то изменили без нашего ведома и заполнение параметров этого файла не получится сделать корректно.
Слишком уж тут много неявных причин.
По сути да — не очень понятно на кой черт такие танцы с бубном, ведь программная работа с ActiveDocument ничем не отличается от ДвоичныхДанных или ХранилищаЗначения. Принцип тот же.
Но все-таки, пусть будет — для галочки 😉
Reply ↓
-
Макет = ОбщийМодуль.ПолучитьМакет(Документ); //серверная функция, записывает макет в файл и возвращает полное имя файла
разъясните
если серверная функция записывает макет в файл, то где этот файл будет лежать?
если на сервере, то как к нему получает доступ клиент в этом коде?
Шаблон = ПолучитьCOMОбъект(Макет); //инициализируем COM-объект
если на клиенте, то как серверная функция получит доступ к файловой системе клиента?
и как она передаст на клиента этот самый файл?
в общем, нужно привести листинг этой серверной функции, а также параметры модуля «ОбщийМодуль»
Reply ↓
-
(4) YurySigolaev, у нас настроена общая шара, которая доступна для клиента и для сервера, по той простой причине, что все юзеры находятся в домене и не могут самостоятельно сохранять файл на локальную машину, с которой работают в данный момент (т.к. каждый раз они могут садиться за разные компьютеры)
В остальных случаях уже написали как это делать 🙂
Reply ↓
-
А можно для тупых полный листинг привести?))
Reply ↓
-
Повторюсь
А можно для тупых полный листинг привести?))
Reply ↓
-
(6) s_uu, (7) Dighty,
какой именно листинг нужно привести?
В статье ведь есть листинг
Reply ↓
-
Листинг &НаСервере если можно.
Reply ↓
-
Или помогите я разобраться не могу. Мне надо документ activedocument на тонкий клиент вывести, сижу 3 день мозг ломаю. Пожалуйста помогите.
Reply ↓
-
(10) Dighty, через двоичные данные. Читайте 2-й пост
Reply ↓
-
Каким методом вы записывали файл Word на сервере? У меня на файловой метод SaveAs(ПУТЬ) работает, а на сервере нет. Путь доступен соответственно и там и тут, только на сервере почему то метод SaveAs не обнаружен… Метод Save работает только для ранее сохраненных, а у меня файл вновь созданный.
/////Уточнение от 17.09.15
Метод SaveAs он не пишет, что не обнаружен, а пишет «Произошла исключительная ситуация (Microsoft Word): Ошибка команды»
Reply ↓
-
(12) klinval, a word на сервере установлен?
Reply ↓
-
(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 ↓
-
(14) klinval, проверьте права доступа для пользователя, word и 1С на стороне сервера
Скорей всего проблема в этом. Можете попробовать залогиниться на сервак под юзером, под которым запускается 1С сервер и проверить, даёт ли там сохранить файл интерактивно
Reply ↓
-
(15) я уже ранее проводил такую проверку: залогинился под пользователем и сохранил word интерактивно. Клиентской 1С на сервере до этого вообще не стояло, я поставил. Запустился, а там ошибка(см. приложение). Возможно в этом и косяк.
У вас то обработка (во вложении к 14 сообщению) работает на SQL базе?
Reply ↓
-
(16) klinval, конкретно в данный момент, нет возможности проверить вашу обработку
Добавьте 1С в исключения в свойствах обозревателя IE
Reply ↓
-
(17) отключил усиленную безопасность IE, поставил на самый «небезопасный» уровень, ошибка, указанная в 16 сообщении ушла, но метод SaveAS всё равно не работает.
Так всё таки под кодом:
Макет = ОбщийМодуль.ПолучитьМакет(Документ); //серверная функция, записывает макет в файл и возвращает полное имя файла
Каким методом ты записываешь? Save, SaveAS?
Reply ↓
-
(18) klinval, посмотрите на дату публикации. Доступа к той обработке у меня давно нет, а в памяти я такое держать не могу 🙂
Что значит
метод SaveAS всё равно не работает.
?
Ошибка выпадает? Файл не сохраняет?
Reply ↓
-
(19)
Ошибка выпадает? Файл не сохраняет?
Да. Да:)
По-любому косяк где-то на уровне прав Windows-пользователя (т.е. связано с администрированием серверов, а не с 1С). Даже обработка с сообщения 14 не работает (хотя где там можно ошибиться?).
{Форма.Форма.Форма(13)}: Ошибка при вызове метода контекста (SaveAs)
Документ.SaveAs(ИмяВрем);
по причине:
Произошла исключительная ситуация (Microsoft Word): Ошибка команды
Поэтому мне проще было не разбираться, а запихнуть шаблон не в ActiveDocument, а в двоичные данные, которые я могу спокойно передать на клиент. Что я и сделал… А ошибка с SaveAs, скорее всего так и останется неразгаданной.
Reply ↓
-
(20) klinval, вам нужно запуститься непосредственно по тем пользователем, который указан для 1С на сервере и именно под ним попробовать сохранить MS Word интерактивно
Reply ↓
-
(21) уже пробовал. Сохраняет… как ни странно.
Reply ↓
-
(22) klinval, тогда нужно ловить ошибку, которую возвращает приложение
подключитесь к MS Word из 1С через COM на сервере и попытайтесь сохранить файл методом SaveAs
Reply ↓
-
(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 ↓
-
(24) klinval, вам нужна ошибка именно MS Word
{Форма.Форма.Форма(13)}: Ошибка при вызове метода контекста (SaveAs)
Документ.SaveAs(ИмяВрем);
по причине:
Произошла исключительная ситуация (Microsoft Word): Ошибка команды
Это листинг ошибки 1С. Обработайте через 1С, сообщение об ошибке MS Word и выведите её содержимое
Reply ↓
-
(25)
Обработайте через 1С, сообщение об ошибке MS Word и выведите её содержимое
Не понял, как это сделать?
Reply ↓
-
(26) klinval, в смысле? руками)))
Reply ↓
-
(27) правильно я понял: ты хочешь увидеть ошибку как её видит Word, а не как её нам даёт 1С?
Если да, то опять вопрос: как из 1С это можно вывести?
Reply ↓
-
(28) klinval, читай про COM-объекты и инструментарий по MS Word
Reply ↓
-
(29) что искать/читать и где? Вы ответьте хотя бы на:
правильно я понял: ты хочешь увидеть ошибку как её видит Word, а не как её нам даёт 1С?
Reply ↓
-
(30) klinval, искатьчитать:
— работа с COM объектами в 1С
— интеграция MS Word и 1С
Вы ответьте хотя бы на:
1С вообще никакой ошибки не видит, она тупо посредник между пользователем и приложением (MS Word)
Reply ↓
-
(31) это реально можно вывести ошибку в 1С как её видит Word или ты чисто теоретически предполагаешь, что такой метод есть?
Может я тебя не правильно понял: по тексту мне показалось, что ты уверен, что такая возможность (такой метод) есть, а может ты имел ввиду, что чисто теоретически такая возможность должна быть.
Reply ↓
-
(32) Столкнулся с аналогичной проблемой — хотел узнать, удалось ли ее в итоге победить или забили?
Ошибка таже:
Ошибка при вызове метода контекста (SaveAs)
Reply ↓
-
(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 ↓
-
(32) klinval, (33) ivant, (34) klinval,
вы получаете COM-объект MS Word
соответственно работаете с API данного com-объекта (т.е. Word)
функция SaveAS является функцией API Word
значит, чтобы получить ошибку Word нужно воспользоваться API этого самого Word
Reply ↓
-
-
Аналогичная ошибка, не может открыть документ сохраненный в темп
ДвоичныеДанные = ПолучитьДвоичныеДанныеМакета();
COMОбъект = Новый COMОбъект(«Word.Application»);
ИмяВременногоФайла = ПолучитьИмяВременногоФайла(«DOC»);
ДвоичныеДанные.Записать(ИмяВременногоФайла);
COMОбъект.Documents.Open(ИмяВременногоФайла);
// здесь вываливается ошибка, никаких документов он не открыл, в темпе лежит созданный документ ворда , COMОбъект.Documents.Count = 0, через ЖР проверял
Док = COMОбъект.Application.Documents(1);
Док.Activate();
Показать
Reply ↓
-
-
Почему при сохранении макета типа active document в файл word кодом:
Код:
ОбработкаОбъект = РеквизитФормыВЗначение(«Объект»);
Макет = ОбработкаОбъект.ПолучитьМакет(«ШаблонПисьмаПросрочка»);
ИмяФайла = КаталогВременныхФайлов() + «файл.doc»;
Макет.Записать(ИмяФайла);
Я получаю вместо нормального документа вот такой
Reply ↓
-
А почему нельзя использовать документ двоичные данные? Загрузил туда шаблон. Получили шаблон. Сохранили документ. Передали на клиент имя открыли через 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 ↓
-
(42)
МакетПисьма = ПолучитьИзВременногоХранилища(Индификатор);
Здесь в тонком клиенте у Вас будет выскакивать ошибка. Такой способ только для толстого клиента подходит.
Reply ↓
-
(43) Выскажусь в защиту:
Глобальный контекст (Global context)
ПолучитьИзВременногоХранилища (GetFromTempStorage)
Синтаксис:
ПолучитьИзВременногоХранилища(<Адрес>)
Параметры:
<Адрес> (обязательный)
Тип: Строка.
Адрес, указывающий на значение во временном хранилище.
Возвращаемое значение:
Тип: Произвольный.
Значение, ранее помещенное с помощью метода ПоместитьВоВременноеХранилище.
Описание:
Получает значение из временного хранилища.
Доступность:
Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).
Вызов метода выполняет обращение к серверу.
Примечание:
Результат выполнения не кэшируется, вызов сервера осуществляется при каждом вызове метода.
Показать
В справке написано, что тонкий клиент можно использовать! Я в своей статье данный метод тоже привожу в тонком клиенте, причём этот код уже давно работает на рабочей базе (в толстом клиенте у нас никто не работает).
Reply ↓
-
-
Решение проблемы «Ошибка при вызове метода контекста (SaveAs) «
Reply ↓
-
-
(17) Надо не 1с в исключения добавить, а всю строку about:…. только при добавлении снять галку с https…,а указанное в (18) делать нежелательно…тем более на сервере…
Reply ↓
-
(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.