Ошибка при выполнении приложения сервера progid excel application
Описание настройки на 64-битном сервере приложений 1С, позволяющие создавать и использовать COMОбъект "Excel.Application" на сервере 1С.
Это поможет обработать большие файлы excel на сервере, в том числе через фоновые задания.
Все описанные действия родились по мотивам прочтения тысячи форумов и было опробовано сначала на разработческом сервере, затем на боевом.
Поэтому решил выложить это сюда, наверняка спасет вам хотя бы 1 день жизни.
Обстоятельно разобрано. Но к такому тексту обязательно нужен дисклаймер:
Корпорация Microsoft на сегодняшний день не рекомендует производить и не поддерживает автоматизацию программ из пакета Microsoft Office с помощью автоматических, неинтерактивных клиентских приложений или компонентов (включая ASP, DCOM и службы NT), поскольку при запуске в этом окружении программы пакета Office могут работать нестабильно или зависать.
Вот на что натолкнулась
Если закоментировать строчку
// ЛистГлавный.Shapes.AddPicture(лФайл.ПолноеИмя, Ложь, Истина, Лево+1, Верх+1, 100, 100);
то все прекрасно работает, если снять комментарий , то зависает на этой строке.
Все что в статье описано - на сервере давно реализовано, просто ранее не требовалось помещать фото в EXCEL
как быть , что можно сделать?
(2) theshadowco, а не все такое знают. Проще, вишь, через com таскать, чем накатать нормальный запрос ADO, на большие-то объёмы.
(2) theshadowco, (4) Yashazz,
может вы тогда сделаете статейку, как сформировать через ADO красиво оформленный Excel файл?
(2) Что через ADO таскать? А если требуется например регламентное задание по формированию и рассылке отчетов в формате Excel ?
(6) Sirruf, а что тут такого? создайте отчет и в коде его вызовите на заполнение! результат сохраните в ДвоичныеДанные. ВСЕ! И никакого COM'a не нужно, СКД отрабатывает!
Глупости! Рассылку отправлять в Ехеле, Ворде и других офисных форматах. Всегда найдется кто то, кто скажет что у него не открылось, или приложения нет.
Я все авто рассылки из 1С делаю в HTML (начиная с 7.7, с 2000 года).
И не дай бог! Какая нить зараза напишет что полученную рассылку открыть не смогли!
:)
(9) bzmax, требования диктует заказчик, а ему нужно именно в формате xlsx и чтобы открывалось на всех мобильных устройствах.
(13) Вижу явное противоречие в паре "именно в формате xlsx" и "чтобы открывалось на всех мобильных устройствах". У меня на двух из трёх мобильных устройств никакой xls/xlsx не откроется. На "третьем" устройстве откроется любой xls[x] с вероятностью близкой к 100% исключительно благодаря вручную установленному пакету, отсутствующему в штатной конфигурации. Да и на некоторых стационарных компах до сих пор можно встретить офис 2003, и да - без конвертера (из личного опыта - крупные производственные предприятия, работающие не первый десяток лет, часто таким парком "грешат").
Что-то заказчик, НЯМС, хочет как минимум странного, если не невозможного. Реально, html, с точки зрения совместимости - куда логичнее.
(15) bubnov-pi, просто клиенты финансовой компании, которым рассылается отчетность, имеют установленный офис на своих девайсах. думаю теперь тперь понятно зачем такой формат нужен.
(13)
И что. В вашу задачу входит еще и на всех мобильных устройствах ставить читалку Екселя?
Я бы убедил заказчика в универсальном формате.
(2) theshadowco, потому что в моей задаче нужно было перезаписывать файлы для того, чтобы они потом открывались на мобильных устройствах, если стояла задача только читать, то не спорю - ADO было бы правильнее использовать.
Автору за то что поделились админскими "премудростями" большой плюс.
Теперь сразу вопрос нарисовался. Как раз была настройка сервера 1С. Решили все-таки поставить офис. Началось все с ответа фирмы майкрософт по поводу "Excel.Application":
Корпорация Microsoft на сегодняшний день не рекомендует производить и не поддерживает автоматизацию программ из пакета Microsoft Office с помощью автоматических, неинтерактивных клиентских приложений или компонентов (включая ASP, DCOM и службы NT), поскольку при запуске в этом окружении программы пакета Office могут работать нестабильно или зависать.
В чем преимущество в данном случае у технологии ADO кроме как не надо ставить офисный пакет на сервер?
Чтоб не повторяться более подробно изложение начал здесь в комментариях статьи про SBS: Загрузка из EXCEL в 1С. Чтение файла XLSX средствами 1С. ЧтениеXML
Прикрепляю саму обработку с методикой чтения ADO из БП 3.0. В принципе из любой конфы должна в ексель начинать читать. В целом про методику и чтоб понять ошибки при разных настройках серверов и локальных ПК. Хотелось поначалу сделать универсальной.
Папка "C:\Windows\SysWOW64\config\systemprofile\Desktop\"
1. Проверяем наличие папки , если нет -то создаем.
2. Заходим в свойства этой папки.
3. Закладка Security
4. Добавляем, если нет, пользователя, под которым запускается агент сервера 1С
Вот тут мне напомнили, что пользователя USR1CV8 (при установке сервера, установщик 1С предлагает его создать) вы не сможете добавить в Security. Под этим пользователем невозможно зайти в систему, и, соответственно, нельзя назначить права доступа к папке.
Выход - либо использовать настройку доступа "Все пользователи" (что не очень правильно), либо запускать Агента сервера под другим пользователем, отличным от USR1CV8.
Никто все-таки не сравнит функциональность ADO и Excel.Application по производительности и надежности чтения?
(20) kostyaomsk, без тестов по опыту могу сказать, что по скорости чтения победит ADO,
по функциональности - excel.application.
а что такое "надежность чтения"?
Кстати, если отчетность в виде не одной плоской таблицы, а нескольких - то через ADO начинаются заморочки, потому что он видит один лист как единую таблицу. В моем случае, как раз такие отчеты.
PS: Я вообще не очень понимаю зачем мы обсуждаем другие решения, я не спорю, что они есть
(21) вот-вот. Про функциональность "Excel.Application" в чем она больше чем ADO? Только встроенными методами? При ADO можно же запрос делать и сразу отобрать из каких колонок что?
(23) kostyaomsk, Ок, есть такой код:
Как его реализовать через ADO?
В данном случае вопрос все-таки такой - что надежнее для постоянной работы на сервере и как это дело использовать.
Возникла проблема при работе с excel.application на сервере. После сохранения файла слетают картинки (если изначально они там были). Может кто сталкивался с такой проблемой?
Excel 2010
Здравствуйте. Такая проблема Система 64 битная сервер 1С 64 битный M.Excel 64 а вот сама 1С 32 битная пытался сделать внешнюю обработку для работы с Excel файлом выдавало ошибку. Пришел к тому что 1С 32 битный а Excel 64 битный. Нашел вашу тему. Проделал процедуру описаную выше. фаил начал открывать но повисает и висит часов 10 больше терпения у меня не хватало. подскажите что можно сделать.
Все в одном флаконе. 3 дня мучил админов этой проблемой, а потом плюнул, нашел данную статью и все сам за час настроил. Спасибо автору!
просьба добавить еще одну ссылочку в дисклаймер
(по теме "переустановка офиса 2003-2010)
Сервер 1 запущен от имени доменного пользователя,
Ему даны права локального админа, в dcom права ему прописаны, папки рабочих столов созданы, excel 64 битный поставлен и т.д. и т.п.
в браузере формируется печатная форма excel (заполняется на стороне сервера)
Все работает если открыта терминальная сессия на сервере 1с от пользователя сервера 1с (простите за тафтологию)
Даже если ее залочить, но оставить открытым терминальное окно, продалжает все работать.
Но достаточно закрыть окно терминальной сессии, не разлогиневаясь, т.е. сессия сохраняется ВСЕ, ексель работать перестает
Код зависает на 2 строчке:
а в процессах одиноко висит excel.exe
Сейчас, что бы формировать печатные формы - временное решение - висит на одной из виртуальных машин окно терминальной сессии сервера 1с запущенное от имени пользователя сервера 1с
← →sapsi ( 2004-07-15 08:46 ) [0]
Добрый день.
Делаю следующий отчет:
xlApp:=CreateOleObject("Excel.Application");
xlbook:=XLApp.Workbooks.Add(xlWbatWorkSheet);
xlsheet:=xlbook.sheets[1];
xlsheet.name:="Статистика";
xlsheet.pagesetup.Orientation:=xlLandscape;
Дальше идет заполнение ячеек таблицы, форматирование их и т.п.
Затем
XLApp.Visible:=true;
XLApp:=null;
Здесь все нормально, но после закрытия (вручную) Excel или
отчета возникает следующая ошибка:
"EXCEL.EXE - Ошибка приложения".
Инструкция по адресу "0x650161fe" обратилась к памяти по адресу "0x650161fe". Память не может быть "read".
Раньше таких проблем не было.
Что может быть не так?
Спасибо.
YurikGL © ( 2004-07-15 08:52 ) [1]
Пользовал
XLApp:=Unassigned;
Проблем не было.
sapsi ( 2004-07-15 09:20 ) [2]
Спасибо. К сожалению, не помогло.
← →Edward ( 2004-07-15 09:42 ) [3]
//Проверка инсталляции СОМ объекта на машине
function IsOLEObjectInstalled(ProgID: String): Boolean;
var ClassID: TCLSID;
begin
Result := Succeeded( CLSIDFromProgID( PWideChar( WideString( ProgID)), ClassID));
end;
//Вызов Excel
procedure RunExcel(ReportNumber: Integer; Action: Integer = xlShowFile);
var ExcelApp, WorkBook, Sheet: OleVariant;
OldCursor: TCursor;
FileXLS: string;
begin
OldCursor := Screen.Cursor;
Screen.Cursor := crHourGlass;
try
//Установлен ли Excel?
if not IsOLEObjectInstalled( ProgID) then
begin
Application.MessageBox(PChar("MS Excel не установлен!"),
PChar(Application.Title),
MB_OK + MB_ICONSTOP);
Exit;
end;
try
//Создание нового экземпляра Excel
ExcelApp := CreateOleObject( ProgID);
//Отключаем реакцию Excel на события, чтобы ускорить вывод информации
ExcelApp.Application.EnableEvents := False;
//Создать книгу по шаблону
FileXLS := _IniParams.REPORTS_FOLDER + "\" + ИмяФайлаШаблона;
//Если файл шаблона существует
if FileExists( FileXLS) then
WorkBook := ExcelApp.Workbooks.Add( FileXLS)
else
begin
Application.MessageBox(PChar("Файл шаблона [" + FileXLS + "] не найден!"),
PChar(Application.Title),
MB_OK + MB_ICONSTOP);
//Просто добавляем книгу из шаблона по умолчанию
WorkBook := ExcelApp.Workbooks.Add;
end;
//Вывод отчета
//Здесь делаем заполнение отчета
//Включаем реакцию Excel на события
ExcelApp.Application.EnableEvents := True;
//Делаем его видимым
if not VarIsEmpty(ExcelApp) then
begin
ExcelApp.Visible := True;
if ExcelApp.WindowState = TOLEEnum(xlMinimized) then
ExcelApp.WindowState := TOLEEnum(xlNormal);
ExcelApp.ScreenUpdating := True;
end;
except
//Ошибка.
On E: Exception do begin
Application.MessageBox(PChar(E.Message),
PChar(Application.Title),
MB_OK + MB_ICONERROR);
if not VarIsNull(ExcelApp) then begin
//Не сохраняем книгу без выдачи запроса подтверждения сохранения
WorkBook.Close(False);
//Завершаем работу Excel
ExcelApp.Application.Quit;
end;
end;
end;
finally
Screen.Cursor := OldCursor;
end;
end;
Думкин © ( 2004-07-15 09:43 ) [4]
Перед
XLApp:=Unassigned;
поставь
XLApp.Quit
Затем неплохо бы проверять не запущено ли еще экземпляров и т.п.
← →sapsi ( 2004-07-15 09:49 ) [5]
XLApp.Quit, как понимаю, закроет Excel. Не дав просмотреть отчета
← →Prohodil Mimo © ( 2004-07-15 09:51 ) [6]
Zamechal podobnoje na Win2000, izredka na WinXP, no ne kazhdij raz i ne na kazhdoj mashine. Reshil, chto vozmozhno ne vsjo ili ne tak ustanovil/nastroil sistemu.
← →sapsi ( 2004-07-15 09:58 ) [7]
Раньше в данном юните у меня уже было формирование отчета в Excel - все работало. Когда добавил по аналогии формирование отчета несколько другого типа и на другое событие, появилась вышеописанная проблема. Причем как после закрытия отчета первого типа так и второго. Все переменные xlapp,xlsheet1,xlsheet,xlbook и т.п. - глобальные.
Работа с Excel в другом юните другой формы осталось нормальным.
Edward ( 2004-07-15 10:16 ) [8]
Лучше всего переменные сделать локальными, тогда не надо заботиться об их чистке вида XLApp:=Unassigned;
А поскольку они у тебя глобальные, нужно быть точно уверенным в каждый момент времени а правильно ли они указываю на объекты, и вообще того они вида.
Itsme ( 2004-07-15 10:30 ) [9]
А так?
procedure TFAnM.ReleaseExcel;
begin
if Assigned(IXLSApp) then begin
if (IXLSApp.Workbooks.Count>0) and (not IXLSApp.Visible[0]) then begin
IXLSApp.WindowState[0]:=TOLEEnum(xlMinimized);
IXLSApp.Visible[0]:=true;
if not (csDestroying in ComponentState) then Self.SetFocus;
Application.BringToFront;
end;
end;
FreeAndNil(FIXLSApp);
end;
У меня работает без проблем. Это и еще много интересного взято из статьи Евгения Старостина "По волнам интерграции" (найдено в DelphiKingdom).
← →YurikGL © ( 2004-07-15 11:43 ) [10]
> Раньше в данном юните у меня уже было формирование отчета
> в Excel - все работало. Когда добавил по аналогии формирование
> отчета несколько другого типа и на другое событие, появилась
> вышеописанная проблема. Причем как после закрытия отчета
> первого типа так и второго. Все переменные xlapp,xlsheet1,xlsheet,xlbook
> и т.п. - глобальные.
Может дело в том, что xlapp ты обнуляешь, с xlsheet нет? Поставь на событие onQuit (если не ошибаюсь) обnullение всех xlsheet-в и xlbook-в.
2 Reply by mikhail_a 2019-07-23 08:31:02
Ну да, может неверно названо.
У меня проблема в том, что независимо от того, установлен Excel на ПК или нет, детектирование наличия Excel средствами MVD или Delphi всегда дает положительный результат.
Т.е. Result := (CLSIDFromProgID('Excel.Application', CLSID) = S_OK); всегда возвращает ОК.
А вот дальше механизм OLE не срабатывает.
Спотыкается на CreateOleObject('Excel.Application');
Причем, это самое OLE не работает и для Ворда.
.
Но, проблема оказалась еще шире.
У меня есть кнопка, которая открывает файл, указанный в соотв. поле файла.
Т.е. есть такая команда: OpenFile(Form1.DBFile_1.Text);
Эта команда открывает файл документа программой, который ассоциирован с данным расширением файла.
Так вот оказывается, если у меня установлена ассоциация расширения .doc с, например, LibreOffice, то файл открывается нормально.
Но, если .doc ассоциирован с Вордом, то открытия файла не происходит.
Но и никакой ошибки не появляется.
При этом, сам Ворд и Excel работают нормально и как положено открывают файлы из проводника.
Вообще ничего не понимаю.
Может у кого есть идеи?
3 Reply by mikhail_a 2019-07-23 09:24:45
Да, наверно, проблему можно решить чисткой реестра от офиса.
Но, я о другом - существующие в MVD (Delphi) средства работы с офисом через OLE не рекомендуются самим Microsoft.
И как доказательство обоснованности их опасений - проблемы на моем ПК.
Я сам разрабатываю программу для работы нескольких пользователей и имею возможность попытаться пофиксить на своем ПК проблемы реестра windows.
Но, если такие же проблемы будут у тех, кто будет пользоваться моей программой, то это станет неразрешимой проблемой.
Хотелось бы иметь в MVD такое решение экспорта-импорта в Excel, которое было бы независимо от OLE, если его Microsoft не рекомендует.
Сейчас же я не могу добиться того, чтобы MVD(Delphi) проверяло бы реальную работоспособность OLE механизма на конкретном ПК и если есть какие-то проблемы с этим, то хотя бы сообщало об этом, а не зависала бы на длительный срок с последующим выпаданием в исключение.
4 Reply by mikhail_a 2019-07-23 11:47:27
Try не спасает.
На коде CreateOleObject Delphi зависает на две минуты (засекал), а потом выдает свое исключение.
Поймать его своей обработкой ошибки заключив этот код в Try не получается.
Да и ждать появления обработки в течение двух минут не лучший вариант.
5 Reply by DriveSoft 2019-07-24 10:04:07
Почему просто не использовать отчеты для експорта данных в Excel или OpenOffice?
6 Reply by mikhail_a 2019-07-24 11:09:10
Отчеты не получается использовать для экспорта напрямую в Excel по той же причине - они общаются с Excel через OLE.
Попытка экспорта из отчета в Excel дает ту же ошибку.
.
Однако, если делать экспорт отчета в Open Document Spreadsheet (т.е. в файл .ods) и, при этом, ассоциировать расширение ods с Excel, то после диалога сохранения файла успешно открывается Excel и в нем корректно отражены все данные.
Т.е. проблема экспорта в Excel действительно может быть решена с помощью отчетов.
.
Подскажите, пожалуйста, как передать данные с формы из таблицы в отчет без его отображения (чтобы был выбран экспорт в Open Document Spreadsheet) и сразу открылся диалог сохранения ods файла, а потом открылся Excel?
.
И есть ли еще какой-то альтернативный способ импорта данных из xls и xlsx файлов, который бы не использовал Excel?
7 Reply by DriveSoft 2019-07-25 10:44:46
Подскажите, пожалуйста, как передать данные с формы из таблицы в отчет без его отображения (чтобы был выбран экспорт в Open Document Spreadsheet) и сразу открылся диалог сохранения ods файла, а потом открылся Excel?
В настройках кнопки выберитк OpenOffice (ods)
8 Reply by mikhail_a 2019-07-26 15:31:29 (edited by mikhail_a 2019-07-26 15:33:51)
Удалось решить проблему с экспортом в Excel.
Оказывается причиной проблем был китайский WPS Office.
Это самый сильный конкурент Microsoft Office.
Видимо при инсталляции он себя где-то прописывает и в результате подменяет собой Excel.
На втором ПК у нас стоит WPS2019 и при экспорте в Excel открывается именно WPS2019.
Т.е. у WPS2019 полностью совпадает с Excel способ общения по OLE.
А у меня стоял WPS2016, который я установил после деинсталляции WPS2019 (он мне не очень понравился и я откатился на версию 2016).
Стоило мне деинсталлировать WPS2016, как сразу стал нормально работать экспорт в Excel.
Безобразие китайское.
Но, осталось наследие в отношении Ворда - не открываются файлы doc командой OpenFile, если ассоциация таких файлов связана с Word.
Никаких ошибок не выпадает. Просто ничего не происходит когда кликаешь по кнопке, которая должна открыть файл doc.
Если же ассоциировать файлы doc с LibreOffice - то они нормально открываются Либроофисом.
Есть ли у кого-нибудь идеи как заставить OpenFile открывать файлы именно Вордом?
9 Reply by mikhail_a 2019-07-29 17:16:02
Оба предложенных варианта открытия файлов с помощью ворда работают.
Однако, файл договора может быть не только в ворде, но и в pdf или, вообще, в картинке.
Т.е. надо определять расширение файла перед открытием и либо открывать файл универсальной командой OpenFile (Filename) либо (если doc или docx) открывать командой OpenFile(Filename, 'winword').
Существует ли функция для определения расширения файла?
Или надо разбирать текстовое название файла, чтобы понять его расширение?
Здравствуйте. Подскажите, никто не сталкивался с такой проблемой?
Если запускать этот код из внешней обработки , то всё нормально, но как только я разместил код в общий модуль (сервер, привилегированный, вызов сервера) и подцепил рег. задание, то вылетает ошибка:
Может в настройках модуля что-то убрать?
(3) yurowski, у тебя 1С:Сервер запускается под конкретным пользователем - вот ему дать права, а не только, как по-умолчанию, "Разрешить запуск как службs"
Чтобы была возможность НА СЕРВЕРЕ обращаться к Excel через COM надо дать права доступа пользователю, от которого запускается сервер 1С. Если мы говорим про регламентные задания, то "перетащить на клиента" не вариант. Есть вариант - использовать умение платформы 8.3.6(7?) читать книги Excel в табличный документ без использования Excel - ТабличныйДокумент.Прочитать()
Там есть нюансы:
1. все листы склеиваются в один табличный документ через разделитель страниц. Вот тут находили решение по обратному разделению на страницы. К сожалению, имена страниц теряются.
2. Могут быть проблемы со считыванием значений как значения (например, дата). По умолчанию считываются текстовые представления. Можно указать параметр для чтения значений а не текста, но с первой попытки у меня что-то не срослось, и больше я не пробовал.
3. Цветовое оформление может быть считано не совсем точно.
Даже с такими ограничениями в одном проекте мне удалось успешно отказаться от обращения к Excel.
Теперь про права, если всё-таки без обращения через COM не обойтись.
Потребуется зайти в "Службы компонентов" (Панель управления-Администрирование, или comexp.msc, или dcomcnfg.exe) - Настройка DCOM, и найти там Microsoft Excel Application.
Если его там нет - значит у вас 64-разрядная система и установлен 32-разрядный Excel. Решение - запустить "comexp.msc /32" для управления 32-разрядными COM-серверами.
Что тут нужно:
1. установить явно от имени какого пользователя будет запускаться Excel (вкладка "Удостоверение").
2. На вкладке "Безопасность" пользователя, от которого стартует 1С (обычно USR1CV8), явно прописать в списках на запуск и доступ.
Maspi; Egovigor; klaus38; etri; vlast; N191119; rolin555; Ghost_X; onetone; tiniji; Tangram; mythos; natarezn; + 13 – Ответить
Приносим извинения. Запрошенное содержимое было удалено. Вы будете автоматически перенаправлены через 1 секунду.
Лучший отвечающий
Вопрос
На Windows 10 и windows 7 все работает без проблем.
На Windows server 2012r2 процесс в диспетчере запускается, а сам Excel нет. Данные не выгружаются и документ не открывается.
Ошибка сервера в приложении '/'.
Исключение из HRESULT: 0x800A03EC
Описание: Необработанное исключение при выполнении текущего веб-запроса. Изучите трассировку стека для получения дополнительных сведений о данной ошибке и о вызвавшем ее фрагменте кода.
Необработанное исключение при выполнении текущего веб-запроса. Информацию о происхождении и месте возникновения исключения можно получить, используя следующую трассировку стека исключений.
Трассировка стека:
[COMException (0x800a03ec): Исключение из HRESULT: 0x800A03EC]
Microsoft.Office.Interop.Excel.Workbooks.Open(String Filename, Object UpdateLinks, Object ReadOnly, Object Format, Object Password, Object WriteResPassword, Object IgnoreReadOnlyRecommended, Object Origin, Object Delimiter, Object Editable, Object Notify, Object Converter, Object AddToMru, Object Local, Object CorruptLoad) +0
ais_matpom.Otchety.Button6_Click(Object sender, EventArgs e) in D:\Разное мое\АИС_МАТПОМ\ПРОЕКТЫ\ais_matpom\ais_matpom\Otchety.aspx.cs:2699
System.Web.UI.WebControls.Button.OnClick(EventArgs e) +11762653
System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +150
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +6016
Читайте также: