1с метод объекта не обнаружен saveas
Репутация: 14
Всего: 62
Написал я программу для внутренних нужд одной конторы, которая преобразует определенным образом Excel-файлы. Так вот у меня на компе программа работает, а у клиента на ноуте в конце работы программы (на методе SaveAs) вылетает исключение. С правами на запись все в порядке. Погуглил. подобная проблема встречалась не раз. и вроде бы ее причиной является использование разных библиотек Excel. Так я поставил один и тот же Office и себе, и клиенту - не помогает.
Подскажите, пожалуйста, в чем может быть проблема?
Репутация: нет
Всего: 1
У меня была таже проблема - глючила именно этот метод, пришлось поменять версию офиса. Проблемы возникают при Офисе 2000 (если я не ошибаюсь) - карочи поменял на 2003.
Репутация: 14
Всего: 62
Репутация: нет
Всего: 1
Код |
book.SaveAs(@saveAs,Excel.XlFileFormat.xlExcel9795, System.Reflection.Missing.Value, System.Reflection.Missing.Value , false, false, Excel.XlSaveAsAccessMode.xlShared , Excel.XlSaveConflictResolution.xlLocalSessionChanges, false, System.Reflection.Missing.Value, System.Reflection.Missing.Value, false); |
Может парамеры в функций попробовать поменять?
А что за исключение вылетает ?
Репутация: 14
Всего: 62
Оказывается, у меня на компе код работал только с библиотекой от 2007-го офиса. Как только я его снес и поставил 2003, и у меня метод SaveAs стал выбрасывать исключение. У меня в принципе не получается сохранить ни одну книгу.
Цитата(moric83 @ 10.8.2007, 11:46 ) |
А что за исключение вылетает ? |
Репутация: 14
Всего: 62
Код |
priceWorkbook.SaveAs(this.priceFileName, XlFileFormat.xlHtml, Type.Missing, Type.Missing, Type.Missing, Type.Missing, XlSaveAsAccessMode.xlShared, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); |
Работает. Однако меня не совсем устраивает функциональность метода Save. Все-таки хотелось бы использовать метод SaveAs.
Гугль не выдает каких-нибудь серьезных багов в функции SaveAs в 11-м офисе. значит я что-то делаю не так. Хотелось бы узнать, что именно. Надеюсь на вашу помощь.
Репутация: нет
Всего: 1
Я думаю что проблема в параметрах функций SaveAs, ты что-то не то ставиш. посмотри на MSDN некоторые параметры by default имеют значение false а ты ставиш Type.Missing.
Проблема в COM обьекте - что-то ему не нравится
Кстати может тебе поменять Type.Missing на System.Reflection.Missing.Value .
А и ешё может и за настроик системы типа - Regional Options - COM обьект глючит.
Репутация: 9
Всего: 117
Репутация: 14
Всего: 62
Цитата(moric83 @ 10.8.2007, 18:00 ) |
А и ешё может и за настроик системы типа - Regional Options - COM обьект глючит. smile smile |
Этот дефект уже устранен
Цитата(moric83 @ 10.8.2007, 18:00 ) |
Кстати может тебе поменять Type.Missing на System.Reflection.Missing.Value . |
Судя по рефлектору, и Type.Missing, и System.Reflection.Missing.Value должны быть равны null (следовательно, никакой разницы, что именно использовать, нет):
Код |
public static readonly object Missing; |
Код |
if (System.Type.Missing == null) |
Интересно, в чем дело?
Изменил вызов метода до вот такого состояния:
Код |
priceWorkbook.SaveAs(this.priceFileName, XlFileFormat.xlExcel7, System.Reflection.Missing.Value, System.Reflection.Missing.Value, false, false, XlSaveAsAccessMode.xlShared, XlSaveConflictResolution.xlLocalSessionChanges, false, System.Reflection.Missing.Value, System.Reflection.Missing.Value, false); |
Репутация: нет
Всего: 1
Репутация: 14
Всего: 62
Проблема решилась весьма неожиданно. Я попробовал скормить методу SaveAs формат XLWorkbookNormal - и все заработало.
Проблема в общем-то решена. однако причина недолюбливания моим офисом других форматов мне до сих пор не ясна.
Репутация: нет
Всего: 1
Цитата(Idsa @ 11.8.2007, 07:48 ) |
Я попробовал скормить методу SaveAs формат XLWorkbookNormal |
Я уже понял что работать с COM объектами офиса это головная боль - лучше обходится без них.
Репутация: 14
Всего: 62
Цитата(moric83 @ 11.8.2007, 10:56 ) |
Я уже понял что работать с COM объектами офиса это головная боль - лучше обходится без них. smile |
Да уж. А отладка COM-приложений, когда на сотню ошибок одно исключение, - просто жесть.
P. S. Вопрос насчет отличия null, Type.Missing и System.Reflection.Missing.Value остается в силе.
Репутация: 29
Всего: 186
Поле Missing у Type установлено равным полю Value класса Missing, которое указывает на единственный существующий экземпляр этого класса.
Репутация: 14
Всего: 62
Цитата(Exception @ 11.8.2007, 17:50 ) |
которое указывает на единственный существующий экземпляр этого класса |
Код |
public static readonly object Missing; public static readonly Missing Value; |
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.
[ Время генерации скрипта: 0.1872 ] [ Использовано запросов: 21 ] [ GZIP включён ]
Наверняка, многие, хотя бы раз в своей практике сталкивались (или еще столкнуться) с этим удивительным типом объекта метаданных Макет.
В данной статье, я постараюсь дать основные тезисы и методы работы с ActiveDocument, дабы Вы не наступали на эти банальные грабли и не колупали себе мозг, почему оно не работает :)
Спасибо за статью, но ничего нового тут нет. Если Вы испытываете трудности с получением макета - храните вордовский шаблон файлом на диске (в общей шаре конечно) и все сведется к получению кома файла НаКлиенте. Возможно есть случаи, когда необходимо хранить шаблон вордовского файла в конфигурации, но на мой взгляд оперативно изменять текстовку шаблона (особенно если это договор и юристы никак не могут договориться о содержании шаблона :)) без влезания в конфигуратор проще и быстрее.
P.S. кстати, обратите, какая изящная задача получилась для тестирования опытного кандидата на работу.
На собеседовании спрашивают то, что сами недано узнали (с)баш
А если по теме, с какой стати у клиента есть доступ к файловой системе сервера и наоборот (и расшаренные папки тоже неуниверсально)? Лучше через двоичные данные и ХранилищеЗначения передавать, см. работу с картинками, а на клиенте сохранять во временный файл.
А так полезная статья, узнал зачем нужен ActiveDocument :)
(1) andrei.k, согласен, пусть лучше юзеры свой шаблон правят, не программистское это дело.
Аналогичная ошибка, не может открыть документ сохраненный в темп
А почему нельзя использовать документ двоичные данные? Загрузил туда шаблон. Получили шаблон. Сохранили документ. Передали на клиент имя открыли через COM и заполняем.
У меня этот код на серверной базе работает
Здесь в тонком клиенте у Вас будет выскакивать ошибка. Такой способ только для толстого клиента подходит.
Глобальный контекст (Global context)
ПолучитьИзВременногоХранилища (GetFromTempStorage)
Синтаксис:
Тип: Строка.
Адрес, указывающий на значение во временном хранилище.
Возвращаемое значение:
Тип: Произвольный.
Значение, ранее помещенное с помощью метода ПоместитьВоВременноеХранилище.
Описание:
Получает значение из временного хранилища.
Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).
Вызов метода выполняет обращение к серверу.
Результат выполнения не кэшируется, вызов сервера осуществляется при каждом вызове метода.
В справке написано, что тонкий клиент можно использовать! Я в своей статье данный метод тоже привожу в тонком клиенте, причём этот код уже давно работает на рабочей базе (в толстом клиенте у нас никто не работает).
Друзья, я с Вами полностью согласен. Но файла в общей шаре может и не быть, а может у него имя изменили, а может шара недоступна, а может там что-то изменили без нашего ведома и заполнение параметров этого файла не получится сделать корректно.
Слишком уж тут много неявных причин.
По сути да - не очень понятно на кой черт такие танцы с бубном, ведь программная работа с ActiveDocument ничем не отличается от ДвоичныхДанных или ХранилищаЗначения. Принцип тот же.
Но все-таки, пусть будет - для галочки ;)
если серверная функция записывает макет в файл, то где этот файл будет лежать?
если на сервере, то как к нему получает доступ клиент в этом коде?
если на клиенте, то как серверная функция получит доступ к файловой системе клиента?
и как она передаст на клиента этот самый файл?
в общем, нужно привести листинг этой серверной функции, а также параметры модуля "ОбщийМодуль"
(4) YurySigolaev, у нас настроена общая шара, которая доступна для клиента и для сервера, по той простой причине, что все юзеры находятся в домене и не могут самостоятельно сохранять файл на локальную машину, с которой работают в данный момент (т.к. каждый раз они могут садиться за разные компьютеры)
В остальных случаях уже написали как это делать :)
Или помогите я разобраться не могу. Мне надо документ activedocument на тонкий клиент вывести, сижу 3 день мозг ломаю. Пожалуйста помогите.
Каким методом вы записывали файл Word на сервере? У меня на файловой метод SaveAs(ПУТЬ) работает, а на сервере нет. Путь доступен соответственно и там и тут, только на сервере почему то метод SaveAs не обнаружен. Метод Save работает только для ранее сохраненных, а у меня файл вновь созданный.
/////Уточнение от 17.09.15
Метод SaveAs он не пишет, что не обнаружен, а пишет "Произошла исключительная ситуация (Microsoft Word): Ошибка команды"
проходят успешно. Заполнение тоже проходит, а на Документ.SaveAs(ИмяВрем); спотыкается.
Ощущение, что что-то не так с word-ом именно под пользователем под которым работает служба 1С, хотя я под ним заходил и офис нормально запускается!
Чтобы не дебажить весь код, например можно попробовать написать (см. обработка во вложении):
На файловой базе работает, на SQL не работает (спотыкается на SaveAs). Можете попробовать у себя? Если эта простенькая обработка у вас заработает, значит у нас что-то не так с word-ом на сервере под этим Windows-пользователем.
Я кстати задачу решил через двоичные данные, но всё равно интересно почему не работает SaveAs на сервере!
(14) klinval, проверьте права доступа для пользователя, word и 1С на стороне сервера
Скорей всего проблема в этом. Можете попробовать залогиниться на сервак под юзером, под которым запускается 1С сервер и проверить, даёт ли там сохранить файл интерактивно
(16) klinval, конкретно в данный момент, нет возможности проверить вашу обработку
Добавьте 1С в исключения в свойствах обозревателя IE
(18) klinval, посмотрите на дату публикации. Доступа к той обработке у меня давно нет, а в памяти я такое держать не могу :)
Ошибка выпадает? Файл не сохраняет?
: Ошибка при вызове метода контекста (SaveAs)
Документ.SaveAs(ИмяВрем);
по причине:
Произошла исключительная ситуация (Microsoft Word): Ошибка командыФорма.Форма.Форма(13)>
Поэтому мне проще было не разбираться, а запихнуть шаблон не в ActiveDocument, а в двоичные данные, которые я могу спокойно передать на клиент. Что я и сделал. А ошибка с SaveAs, скорее всего так и останется неразгаданной.
(20) klinval, вам нужно запуститься непосредственно по тем пользователем, который указан для 1С на сервере и именно под ним попробовать сохранить MS Word интерактивно
(22) klinval, тогда нужно ловить ошибку, которую возвращает приложение
подключитесь к MS Word из 1С через COM на сервере и попытайтесь сохранить файл методом SaveAs
: Ошибка при вызове метода контекста (SaveAs)
Документ.SaveAs(ИмяВрем);
по причине:
Произошла исключительная ситуация (Microsoft Word): Ошибка командыФорма.Форма.Форма(13)>
Если дать заведомо рабочий путь вручную: та-же ошибка (не важно сетевой или на диск C:)
Если дать заведомо некорректный путь, то уже другая ошибки:
: Ошибка при вызове метода контекста (SaveAs)
Документ.SaveAs("Ы:\111.docx");
по причине:
Произошла исключительная ситуация (Microsoft Word): Неверно указано имя файла.
Попробуйте выполнить следующие действия:
* Убедитесь, что путь введен правильно.
* Выберите нужный файл из списка файлов и папок.Форма.Форма.Форма(16)>
файл так и не создался.
Сверил все настройки Word локальные и на сервере (запустившись от имени пользователя под которым работает служба 1С). Процесс ворда запускается точно под тем пользователем под которым запускается служба (проверил в диспетчере задач).
Microsoft.Interop.Word.Document.SaveAs. Неверное сохранение
Создаю новый документ .docх и пытаюсь сохранить в папке. Но файл сохраняется в папке на один.
Ошибка на saveas
procedure TForm1.MenuItem6Click(Sender: TObject); begin if filework='' then Saveas else .
Сохранение SaveAs
Подскажите, пожалуйста, как осуществить следующее: необходимо сохранить данные в новый файл excel.
Процедура клиент, сервер ?
Есть доступ до папки у пользователя ?
1С пробовал от админа запускать ?
И что за ошибка хоть ?
1. Процедура сервер
2. Есть доступ
3. Работаю по админом
4. Метод объекта не обнаружен (SaveAs)
Докум.SaveAs(ИмяФайла);
Ermak27, полностью процедуру всю переноси на клиент. А данные для заполнения вытаскивай через функции на сервере несли понадобится.
Перед процедурой у тебя написано &НаСервере, меняй это на &НаКлиенте. Повалятся ошибки, такие как обращение к константе например и начинай их исправлять потихоньку.
Я тебя не так понял на счёт сервера. У меня вообщем ничего не стоит перед процедурой. Нет &НаСервере и &НаКлиенте. У меня база крутиться на sql сервере
Модуле формы. Процедура срабатывает при нажатии кнопки
Попробуй так прописать
ну не стоит и не стоит. где процедура выполняется, когда не стоит? в воздухе? вряд ли.
посмотрите, есть ли у вас на сервере диск Е, куда вы пытаетесь записать, и есть ли права на запись на него
dggrom, выдаёт ошибку Поле объекта не обнаружено (Documents)
Докум.Documents.SaveAs(ИмяФайла);
Добавлено через 2 минуты
Yulunga, Я же писал что диск есть, права есть
Yulunga, у него метод записи самой не видет.
Ermak27, что за конфигурация, какие формы, управляемые или нет ?
по мне так проблема в этом:
Докум=Word.
Word=Докум;
Докум=Word.
запутал с какой-то целью. поэтому и нет там сейвас, что применяется не к тому к чему надо. чехарда. имена переменных закончились?
Yulunga, я закомментировал Word=Докум;, теперь выдаёт ошибку Метод объекта не обнаружен (Range)
Докум = Word.Range(0,0);
Код который в самом начале, он так и выводит как надо, но встала задача сохранить эти вордовские документы по индексу, вот тут проблема и появилась у меня. Вчера я переделал немного код
Создал форму с типом ActiveDocument. Написал код который сохраняет мне вордовские документы но значение заносит в каждый лист, а мне нужно два значения на лист.
Метод SaveAs в Excel
Всем доброго времени суток.Помогите разобраться с методом SaveAs Есть,ну назовем ее,небольшая.
SaveAS excel-файл на странице
привет всем на странице создаётся таблица с выбранными данными из базы данных, теперь требуется.
Lazarus MsWord SaveAs Error
Всем Доброго вечера. Уже 2 дня мучаюсь непонимаю что не так, не получается в lazarus-е сохранить.
Сохранение XL.ActiveWorkBook.SaveAs(buf);
Почему файл не сохраняется в папке в которой находится exe файл? В папке в которой хранится exe.
Не грузятся файлы! Call to a member function saveAs() on null
Я не пойму что он от меня хочет $form->file = UploadedFile::getInstance($form, 'file'); .
Я пытаюсь сохранить книгу excel (с поддержкой макросов) в виде csv-файла через этот макрос, перезаписывая старый (ниже у меня было изменение имени папки и листа, но это, похоже, не проблема!):
I погуглил его, и, по-видимому, это происходит много с людьми, и некоторые из решений, которые я пробовал, были:
- указание того, что каталог является строкой
- избегайте любого специального символа в имени файла или папки (см. здесь)
- копировать вставьте лист как значение перед сохранением его как .csv (см. здесь)
- указание FileFormat с помощью .номер кода csv (см. здесь)
- отключение/повторное включение некоторых предупреждений
- добавление других полей в ActiveWorkbook.Сохранить как строку, касающиеся паролей, создания резервных копий etcetc
тем не менее, он может работать правильно до 50-60 раз подряд, а затем в какой-то момент снова терпеть неудачу в строке.
любое предложение или вещи, которые я мог бы посмотреть, чтобы решить эту проблему (кроме остановки использования VBA / Excel для этой задачи, которая произойдет в ближайшее время, но я не могу для теперь.)
заранее спасибо за ваше время.
EDIT: решено благодаря предложению Degustaf. Я внес только два изменения в предложенный Degustaf код:
- ThisWorkbook.Листы вместо CurrentWorkbook.Листы
- FileFormat:=6 вместо FileFormat:=xlCSV (по-видимому, более надежный для разных версий excel)
Я вообще считаю что ActiveWorkbook проблема в этих случаях. Под этим я подразумеваю, что каким-то образом у вас нет этой книги (или любой другой), и Excel не знает, что делать. К сожалению, с copy ничего не возвращает (скопированный рабочий лист был бы хорошим), это стандартный способ подхода к этой проблеме.
Итак, мы можем подойти к этому, как мы можем скопировать этот лист в новую книгу, и получить ссылку на эту книгу. Что мы можем сделать, так это создать новая книга, а затем скопируйте лист:
или есть еще лучший подход в такой ситуации: WorkSheet поддерживает SaveAs метод. Нет необходимости копировать.
я предупрежу вас, чтобы сохранить книгу в исходное имя afterwarsd, если она остается открытой, но у вас уже есть это в вашем коде.
Это год назад, но я добавлю кое-что для будущих читателей
вы не найдете много документации в справке Excel для ошибки времени выполнения 1004, поскольку Microsoft не считает ее ошибкой Excel.
факт что это прерывистый недостаток, и он исправлен путем сохранять с полным путем и имя файла говорит мне, что ваш макрос может пытаться сохранить.xlsb-файл в каталог autorecover после автоматического восстановления файла.
кроме того, вы, возможно, отредактировали путь к файлу или имя файла самостоятельно.
вы можете проверить путь и имя файла с:- Функцию MsgBox Файл Thisworkbook.Полное имя
C:\Users\Mike\AppData\Roaming\Microsoft\Excel\DIARY (Версия 1).xlxb
Если таким образом, решение (как указано выше другими), чтобы сохранить ваш файл на правильный путь и имя файла. Это можно сделать с помощью VBA или вручную.
Теперь у меня есть привычка вручную сохранять файл с его правильным путем и именем файла как само собой разумеющееся после любого действия автосохранения, поскольку это занимает секунды, и я нахожу его быстрее (если это не ежедневное явление). Таким образом, макросы не столкнутся с этой ошибкой, которую вы запустите. Помните, что в то время как моя привычка вручную экономить.файлы xlxb для .файлы xlsm сразу после восстановления не помогут новичку, которому вы даете лист.
примечание по гиперссылкам
после этой ошибки: если у вас есть гиперссылки на листе, созданных с Ctrl + k по всей вероятности, у вас будет что-то вроде "AppData\Roaming\Microsoft\", "\AppData\Roaming\", "../../ AppData / роуминг/ "или". \Мои документы\Мои документы\ " в нескольких гиперссылках после восстановления файла. Вы можете избежать их путем прикрепление гиперссылок к текстовому полю или их генерация с помощью функции гиперссылки.
идентификация и ремонт их немного сложнее
сначала проверьте гиперссылки и определите ошибочные строки и правильную строку для каждой ошибки. Со временем я нашел несколько.
Excel не предоставляет средства в меню "перейти к специальному" для поиска гиперссылок, созданных с помощью Ctrl + k .
вы можете автоматизировать идентификацию ошибочных гиперссылок в вспомогательном столбце, скажем, столбец Z и используя формулу
где Link2Text является UDF
функция Link2Text (rng как диапазон) как строка - Не отключайтесь. "Находит гиперссылки, содержащие "роуминг" в столбце Z.
мой VBA для исправления ошибок выглядит следующим образом
' Выберите правильный лист Листы ("дневник").Выберите
Я также рекомендую вам привыкнуть делать регулярные резервные копии и не полагаться только на автосохранение. Если это не удастся, у вас ничего нет с момента последней полной резервной копии.
в то время как лист является хрупкой резервной копии часто, как каждый час или после любого значительного импорта новых данных.
следующие ярлыки будут резервное копирование рабочего листа в секундах: Ctrl + O , [выделите имя файла], Ctrl + C , Ctrl + V , [ X]. Регулярные резервные копии позволяют сразу перейти к последней резервной копии без необходимости восстановления из файла резервной копии прошлой ночи, особенно если вам нужно сделать запрос другого человека, чтобы сделать это.
попробуйте объединить путь и имя файла CSV в строковую переменную и отбросить.csv; который обрабатывается FileFormat. Путь должен быть абсолютным, начиная с буквы диска или имени сервера: Dim strFullFileName as String strFullFileName = "C:\My Folder\My_Sheet" Если на сервере, то это будет выглядеть примерно так: strFullFileName = "\ServerName\ShareName\My Folder\My_Sheet" Substiture ServerName с именем вашего сервера и замените ShareName именем вашего сетевого ресурса, например \data101\Accounting\My Folder\My_Sheet ActiveWorkbook.SaveAs Filename:=strFullFileName,FileFormat:=xlCSVMSDOS, CreateBackup:=False
Программно да
ExcelПриложение = Новый COMОбъект("Excel.Application");
Книга = ExcelПриложение.WorkBooks.Add();
Лист = Книга.WorkSheets(1); // 1 номер листа
Либо если лист не создан
Лист4 = Книга.WorkSheets.Add();
И дальше работаете уже с листами
Андрей Кондратьев ответил Тимуру
Тимур, вроде нашел на инфостарте функцию. Но выдает ошибку
'Ошибка получения объекта COM: -2147467262(0x80004002): Интерфейс не поддерживается'
В связи с чем?
Андрей Кондратьев ответил Тимуру
Андрей Кондратьев ответил Тимуру
Тимур, а если &НаКлиенте , то "Произошла исключительная ситуация (Microsoft Excel): Метод SaveAs из класса Workbook завершен неверно".
Excel = Новый COMОбъект("Excel.Application");
WB = Excel.Workbooks.Open(ИмяФайла);Выдает ошибку – Ошибка при вызове конструктора (COMОбъект): Интерфейс не поддерживается.
Или другой метод:
У службы «Запуск серверных процессов DCOM» тип запуска должен быть «Авто».
Кроме того, если служба «Агент сервера 1С:Предприятия 8.2″ запускается от имени специального пользователя, то у него должны быть права на запуск компоненты «Приложение Microsoft Excel»
Служба «Агент сервера 1С:Предприятия 8.2″ не должна запускаться от имени пользователя с ограниченными правами, у него должны быть права на запуск компоненты «Приложение Microsoft Excel».
Другая возможная причина: 1С предприятие установлено в 64-битном варианте, а Excel – в 32-битном. Может помочь установка 1С в 32-битном варианте (это может быть проще, чем найти 64-битный Excel)
У службы «Запуск серверных процессов DCOM» тип запуска необходимо установить в «Авто». После чего желательно перезагрузить компьютер.
Ну и как вариант, быть может поврежден установленный пакет MS Office. Необходимо попробовать переустановить его.
Читайте также: