08.01.13 — 17:24
Всем привет! Печ. форма формируется через Word. Открывается файл Word, там делаются замены после чего он сохраняется. Все отлично работало, пока не перенес базу на SQL.
Причем, если на этом сервере развернуть эту же базу в файловом варианте — все работает. А на SQL — нет.
Пробовал давать какие-угодно права пользователю, от имени которого запускается Агент сервера. Запускал его и под встроенной учеткой и под админом… нифига.
Вот фрагмент кода, который перестает работать на SQL:
Word = Новый COMОбъект(«Word.Application»);
Word.Visible = 0;
Документ = Word.Documents.Open(ИмяФайлаШаблона);
Fnd = Word.ActiveDocument.Range().Find;
Fnd.ClearFormatting();
Fnd.Forward = -1;
Выдает ошибку: «{ВнешняяОбработка.ФормированиеПоШаблону.МодульОбъекта(379)}: Ошибка при получении значения атрибута контекста (ActiveDocument)
Fnd = Word.ActiveDocument.Range().Find;
по причине:
Произошла исключительная ситуация (Microsoft Word): Данная команда недоступна, так как не открыт ни один документ.»
Пожалуйста, помогите разобраться в чем дело.
1 — 08.01.13 — 17:28
ну а путь к файлу у тебя какой? файл сам где лежит?
2 — 08.01.13 — 17:29
Сам Word установлен?
Что выдаст ПолучитьCOMОбъект(«», «Word.Application»)
или ПолучитьCOMОбъект(«d:temptemp.docx»)
3 — 08.01.13 — 17:29
ИмяФайлаШаблона — существует ли файл по этому пути, и доступен ли?
4 — 08.01.13 — 17:30
Сначала делал так:
ИмяФайлаШаблона = КаталогВременныхФайлов() + «ШаблонДоговора.docx»;
Потом переделал жестко:
ИмяФайлаШаблона = «C:UsersPublicDocuments» + «ШаблонДоговора.docx»;
Но не помогло.
5 — 08.01.13 — 17:31
Да, Word установлен. Если в файловом варианте развернуть, все работает, документ отлично формируется и открывается.
6 — 08.01.13 — 17:32
Ответь на (2)
7 — 08.01.13 — 17:32
Только выполни на сервере
8 — 08.01.13 — 17:33
Кода запускаешь файловую базу, доступны ком-обхекты локальной системы. Если сервер 1С находится на другой машине, откуда ему знать про «C:UsersPublicDocuments» терминального сервера или локальной машины?
9 — 08.01.13 — 17:38
Разумеется, я сто раз проверил существование файла, все права на него и все такое. В разные места его клал, админские права раздавал.
Запускаю я все на одном и том же сервере. И Word и 1C установлены на той машине, на которой я работаю.
Насчет (2): в первом случае результат тот же — «ни открыт ни один документ», во втором случае другая ошибка: «{ВнешняяОбработка.ФормированиеПоШаблону.МодульОбъекта(374)}: Ошибка при вызове метода контекста (ПолучитьCOMОбъект)
Word = ПолучитьCOMОбъект(ИмяФайлаШаблона);
по причине:
Ошибка получения объекта COM: Фильтр сообщений выдал диагностику о занятости приложения.»
10 — 08.01.13 — 17:40
У тебя и сервер 1С на той же машине стоит?
11 — 08.01.13 — 17:41
может как вариант повис на сервере COMОбъект Ворда. посмотри в процессах.
12 — 08.01.13 — 17:46
Vladal, Да, я когда разбирался с проблемой, установил все на одну машину. Сервер 1С, SQL и Word. На ней и разбираюсь.
zladenuw, ты прав. Там висела целая пачка процессов Word. Я их выбил, но теперь другая ошибка:
{ВнешняяОбработка.ФормированиеПоШаблону.МодульОбъекта(374)}: Ошибка при вызове метода контекста (ПолучитьCOMОбъект)
Word = ПолучитьCOMОбъект(ИмяФайлаШаблона);
по причине:
Ошибка получения объекта COM: Операция прервана
13 — 08.01.13 — 17:52
(12) Значит что-то из дочерних процессов может висеть и блокировать.
Скорее всего, он ответил на твой последний запрос com-объекта, что его прервали. Повтори через время или для верности перегрузи компьютер.
14 — 08.01.13 — 17:55
Я с проблемой второй день бьюсь и не раз перезагружал и даже переустанавливал платформу.
Если использовать «Word = Новый COMОбъект(«Word.Application»);», то COM объект создается. Т.е. по идее с СОМ все в порядке.
Для полной ясности скажу что стоит:
Платформа 8.2.17.153.
Сервер 1С — х64
Сервер SQL — 2012
Печатная форма для УТ 11. Хотя непонятно, какое это все имеет отношение к COM объекту… Короче, танцы с бубном продолжаются, спасибо за участие!
15 — 08.01.13 — 21:51
Если танцы с бубном не помогут, есть вариант без ворда если у тебя простая замена по тексту на нужные значения.
Переименовываешь файл docx в zip, извлекаешь в папку, находишь в подпапках файл с данными в формате xml, производишь в нем замены и назад выполняешь упаковку и переименование.
16 — 09.01.13 — 00:56
Pashkaa, это всем бубнам бубен ))) Я уж лучше на файловой версии все оставлю, чем так. Думаю, решение рано или поздно найдется. Буду с разными платформами экспериментировать. Вряд ли я единственный пытаюсь документ Word сформировать из базы 1С на SQL. А судя по тому, что в поиске ничего подобного нет, то ситуация не популярная и легко все может заработать на другой системе или конфигурации. Такие мысли у меня.
17 — 09.01.13 — 01:58
(16) напиши сетевую папку. Диск С: лучше не писать. Там есть такая фигня в правах как передача прав подчиненным папкам. Наследование.
То есть если ваш админ для диска С: задал неполные права твоему пользователю, то хоть ты застрелись, но хотя и будешь «давать какие-угодно права пользователю» на папку C:UsersPublicDocuments всё равно приоритет у прав на диск С:, которые и применятся.
18 — 09.01.13 — 03:52
(4) Посмотри пути.
Выполняется наверняка на сервере, значит далеко не факт, что у учетки запуска rphost-a есть права на путь-файл.
19 — 11.01.13 — 02:35
Разобрался. Кто бы мог подумать… Как я уже писал, это УТ 11 — т.е. управляемые формы. Перенес выполнение всех операций с объектом «Word = Новый COMОбъект(«Word.Application»)» с сервера на клиент — все заработало. Не спешите кидать тухлыми помидорами типа «конечно, Word не откроется на стороне сервера». Но раньше-то как-то открывался. Именно это меня и пустило по ложному следу. Выходит, доступность методов COM объектов на файловом сервере и SQL — разная.
Какой я сделал вывод:
Что касается конкретно метода Word.Documents.Open — если база файл-серверная, методу все равно где выполняться, на клиенте или на сервере. Документ открывается и показывается ни смотря ни на что. Но когда я перешел на SQL, метод ошибки выдавать не стал и внешне отрабатывает как я писал выше. Но если выполняется на стороне сервера — ничего не открывает и дальнейшее обращение к документу дает ошибку, а на стороне клиента — открывает.
20 — 11.01.13 — 07:43
сколько можно на эти грабли наступать.
http://infostart.ru/public/165910/
21 — 11.01.13 — 10:32
МихаилМ, по-моему не совсем по теме. Сом объект-то создается и остальные методы у него работают. Вы читали ветку или только последнее сообщение?
Сколько можно на эти грабли наступать… Сейчас-то конечно все сразу умные станут. )) Что раньше молчали? Давайте без этого.
22 — 11.01.13 — 10:47
(21)
из (9)>Разумеется, я сто раз проверил существование файла, все права на него и все такое. В разные места его клал, админские права раздавал.
не стыкуется с (19)
СЕсин
23 — 11.01.13 — 11:08
Чем же не стыкуется? В (9) я мудрил с самим файлом, а в (19) перенес выполнение кода с сервера на клиент. Короче, флуд пошел…
I am Generating XPS document from Word document recursively but I am getting the error below:
Error:
This command is not available because no document is open. at Miscrosoft.office.interop.Word.ApplicationClass.get_ActiveDocument at Line 65
which is:
wordApp.ActiveDocument.SaveAs2(xpsFile, FileFormat: Word.WdSaveFormat.wdFormatXPS);
I am using the Following Code to convert the Word Files to XPS files
public static string convertWordToXps(string path, string wordDocName)
{
Word.Application wordApp = new Word.Application();
wordApp.Documents.Open(string.Concat(path, "\", wordDocName), ConfirmConversions: false, ReadOnly: false);
string xpsFile = string.Concat(path, "\", Path.GetFileNameWithoutExtension(wordDocName), ".xps");
try
{
//wordApp.ActiveDocument.ExportAsFixedFormat(xpsFileName, WdExportFormat.wdExportFormatXPS, false, WdExportOptimizeFor.wdExportOptimizeForOnScreen, WdExportRange.wdExportAllDocument, 1, 1, WdExportItem.wdExportDocumentContent, false, true, WdExportCreateBookmarks.wdExportCreateNoBookmarks, false, true, false, nullObject);
wordApp.ActiveDocument.SaveAs2(xpsFile, FileFormat: Word.WdSaveFormat.wdFormatXPS);
return xpsFile;
}
catch (Exception e)
{
MessageBox.Show(e.getDetailedErrorMessage());
}
finally
{
wordApp.Quit(SaveChanges: false, OriginalFormat: Type.Missing, RouteDocument: Type.Missing);
}
return null;
}
Search Function
private void SearchDocuments(string directoryPath)
{
try
{
foreach (string fullName in Directory.GetFiles(directoryPath, "*.odt"))
{
InstructionsViewModel.convertWordToXps(System.IO.Path.GetDirectoryName(fullName), System.IO.Path.GetFileNameWithoutExtension(fullName));
}
foreach (string nestedDirectory in Directory.GetDirectories(directoryPath))
{
SearchDocuments(nestedDirectory);
}
}
catch (System.Exception error)
{
}
}
I want to convert all the Word files to XPS inside all the folders.
Проблема
При попытке использовать Microsoft Visual Basic for Applications (VBA) для изменения свойств документа появляется одно из приведенных ниже сообщений об ошибке.
Ошибка при выполнении ‘4248’:
Команда недоступна, так как нет открытых документов
Ошибка при выполнении ‘4605’:
Метод или свойство недоступны, поскольку окно документа не активно
или
Ошибка при выполнении ‘5941’:
Запрашиваемый номер семейства не существует
Причина
Проблема возникает, когда нет открытых документов или не открыт документ, на который сделана ссылка. В программе Word предусмотрено изменение свойств только открытых документов.
Примечание. Такие сообщения об ошибках могут появиться также в том случае, если открыт документ, у которого свойство Видимый имеет значение Ложь.
Временное решение
Корпорация Microsoft предлагает примеры программного кода только для иллюстрации и не предоставляет явных или подразумеваемых гарантий относительно их корректной работы в конкретных случаях и в пользовательских приложениях. Примеры в данной статье рассчитаны на пользователя, имеющего достаточный уровень знаний соответствующего языка программирования, а также необходимых средств разработки и отладки. Специалисты служб технической поддержки Microsoft могут пояснить назначение тех или иных конструкций кода в конкретном примере, но модификация примеров и их адаптация к задачам разработчика не поддерживается. Если вам требуется дополнительная консультация по вопросам программирования, вы можете обратиться в службу консалтинга Microsoft или связаться с сертифицированными партнерами компании Microsoft. Дополнительную информацию о партнерах корпорации Microsoft можно найти в Интернете по следующему адресу:
http://www.microsoft.com/partner/referral/ За дополнительной информацией обратитесь к веб-узле корпорации Microsoft по адресу:
http://support.microsoft.com/default.aspx?scid=fh;RU;CNTACTMSЗа дополнительной информацией об использовании приведенных в этой статье примеров обратитесь к следующей статье Microsoft Knowledge Base:
290140 How to Run Sample Code from Knowledge Ниже приведен пример макроса на языке Visual Basic for Applications для изменения значения поля Заголовок в диалоговом окне Свойства. Пример содержит специальный программный код для перехвата ошибок на случай, если нет открытых документов, и вывода соответствующего сообщения.
Sub ChangeDocProperties()On Error GoTo ErrHandler
ActiveDocument.BuiltInDocumentProperties("Title") = "My Title"
Exit SubErrHandler:
If Err <> 0 Then
'
' Display an error message.
'
MsgBox Err.Description
'
' Clear the error.
'
Err.Clear
Resume NextEnd If
End Sub
Приведенный ниже программный код предусмотрен для выполнения следующих целей.
-
Перехват ошибок, если нет открытых документов
и
-
Создание нового документа при перехвате ошибки
и
-
Возобновление нормальной работы в строке, вызвавшей появление ошибки
Sub ChangeDocProperties()On Error GoTo ErrHandler
ActiveDocument.BuiltInDocumentProperties("Title") = "My Title"
Exit SubErrHandler:
If Err <> 0 Then
'
' Add a document.
'
Documents.Add
'
' Clear the error.
'
Err.Clear
'
' Run the code that caused the error.
'
ResumeEnd If
End Sub
Ссылки
Для получения помощи по работе с Visual Basic обратитесь к следующей статье Microsoft Knowledge Base:
305326 Programming Resources for Visual Basic for Applications
Нужна дополнительная помощь?
<?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
- Прайс-лист с артикулом в отдельной колонке
13 Comments
-
коллеги
на MSO 2007 пробовали?
Reply ↓
-
(1) — было успешно протестировано на MS Office Word 2003, 2007(WinXP SP2).
Reply ↓
-
В CRM-решениях тоже используется штатный механизм печатных форм, формируемых из документов-шаблонов MS Word
Reply ↓
-
-
(0)
1. Пришлось в общем журнале самому добавлять кнопочку печати.
2. Не работает, выдает ошибку:
—————————————————————————
{ОбщийМодуль.печать_MSWord(58)}: Ошибка при получении значения атрибута контекста (ActiveDocument): Произошла исключительная ситуация (Microsoft Word): Данная команда недоступна, так как не открыт ни один документ.
Пока сч1 <= Word.Application.ActiveDocument.Fields.Count Цикл
—————————————————————————
Reply ↓
-
+ к (5) Ворд открывается абсолютно пустой, т.е. ни одного документа не открыто.
Reply ↓
-
+ к (5) Разобрался. Ошибка возникает если путь к документу указан не верно. Необходимо добавить обработчик ошибок. А так мне нравится. +
Reply ↓
-
(5-7). О, спасибо за конскрит, за коммерческую версию было бы стыдно…за концепт, конечно, тоже стыдно. И поэтому исправлено — непосредственно перед обработкой шаблона проверяется существование файла шаблона.
Reply ↓
-
а в чем изюминка?
обычно создаем шаблон-макет активх и его заполняем. автор придумал другое решение?
Reply ↓
-
СправочникСписокИсходныйДокумент1СНачалоВыбора говорит что не найдена процедура,в чем дело?????
Reply ↓
-
У меня с 2007 вордом такой глюк был, оказалась что дело не в 1С, а в ворде.
Лечится удалением кнопки «Междустрочный интервал» с панели инструментов ворда и
или заменой файл WWINTL.DLL в директории С:Program FilesMicrosoft OfficeOffice121049
Reply ↓
-
-
а под 8.2 есть решение? очень нужно
Reply ↓
Leave a Comment
Ваш адрес email не будет опубликован. Обязательные поля помечены *
Добрый день. Есть защищенный Word (рецензирование/защитить документ). Но защищен он не весь, есть области доступные для редактирования пользователем. При попытки выполнять замену текста в поле доступном для редактирования выдается ошибка «Произошла исключительная ситуация (Microsoft Word): Данная команда недоступна.»
Кто сталкивался с таким, как быть? Можно ли снимать защиту, а потом снова ее ставить?
Добавлено через 2 часа 44 минуты
Ап, что неужели я первый?))
Добавлено через 3 часа 31 минуту
Знатоки ворда где вы?)