Имя: Пароль:
1C
1С v8
ЗУП 3.1, платформа 8.3.11, ошибки &НаКлиенте с COMОбъект("Word.Application")
0 Serg_1960
 
04.06.18
15:51
Толстый 32-битовый клиент на 64-битовом сервере 1C под Windows Server 2012 R2, внешняя обработка работает и файловом, и в клиент-серверном вариантах работы, но сыпятся ошибки при подключении обработки через "Дополнительные отчеты и обработки"...

Была ошибка "-2147467262(0х80004002) Интерфейс не поддерживается." -пользователю USR1CV8 дал права на запуск MicrosoftWord в DCOMе - ошибка ушла. Добавил папки Desktop в каталоги systemprofile на всякий случай.

Сейчас ошибка на следующей строке алгоритма - при Activate():
"Произошла исключительная ситуация (Microsoft word): Не удается активизировать приложение."

ЧЯДНТ?
1 Serg_1960
 
04.06.18
15:59
Если вызвать как внешнюю обработку (через Файл - Открыть) -  обработка работает без ошибок.

Я так понимаю, разница в вызове внешней обработки на клиенте и на сервере. Но где смотреть и куда копать - что-то не соображаю.
2 Serg_1960
 
04.06.18
16:04
Вспоминаю, что были проблемы с V83.COMConnector между УПП 1.3 и ЗУП 3.1. (отображение зарплаты в бухгалтерском учете).  Но эта проблема в своё время была преодолена и импорт/экспорт данных сейчас идёт нормально.
3 Вафель
 
04.06.18
16:05
самам мс не рекомендует ворд так запускать
4 Вафель
 
04.06.18
16:05
хотя на клиенте можно, но прием здесь тогда USR1CV8
5 Serg_1960
 
04.06.18
16:21
Я выше говорил - ошибка была на клиенте в строке <<"Новый COMОбъект("Word.Application")>> - вероятно права USR1CV8 неявно используются при создании COMОбъект-ов - для запуска приложения используется "Запускающий пользователь".

Если использовать в "Удостоверение"  галочку "Текущий пользователь" или "Указанный пользователь", то 1С зависает позднее - при активации документа MS Word.
6 Флориан
 
04.06.18
16:38
думаю что "ОтчетОбъект =ВнешниеОтчеты.Создать(ИмяФайла,Ложь)" должна на клиенте запускаться
7 Serg_1960
 
04.06.18
17:06
У меня часть пользователей работает в тонком клиенте :(
8 Флориан
 
04.06.18
17:24
На сервере вообще Word есть? Запустили его хоть раз под USR1CV8? Он там инициалы спрашивает в форме модальной
9 Serg_1960
 
04.06.18
17:45
На сервере Microsoft Word 2010 (64-бит). При чём тут инициалы - не понял. Но мысль интересная -завтра проверю, когда админ придёт.
10 Serg_1960
 
04.06.18
17:48
Права посмотреть USR1CV8. А то, вдруг, у него только вход в качестве службы и всё, привет.
11 Сергиус
 
04.06.18
17:49
(0)Делай инициализацию и вызов com-объекта в клиентской процедуре внешней обработки.
12 Serg_1960
 
04.06.18
17:54
(11) Так и делаю. Я уж подстраховался со всех сторон :(

&НаКлиенте
    Адрес    = ПолучитьДанныеМакетаНаСервере("ТрудовойДоговор");
    Данные    = ПолучитьИзВременногоХранилища(Адрес);
    УдалитьИзВременногоХранилища(Адрес);
    Адрес    = Неопределено;
    
    // попытка работы через MSWord
    ТекстОшибки = "";
    Попытка
        ИмяФайла    = ПолучитьИмяВременногоФайла("doc");
        Данные.Записать(Имяфайла);
        Данные        = Неопределено;
        MSWord        = Новый COMОбъект("Word.Application");
        MSWord.Displayalerts        = Ложь; // Не отображать предупреждения и сообщения, на все вопросы ответы "по умолчанию"
        MSWord.Application.Visible    = Истина;
        MSWord.Activate();
...

&НаСервере
Функция ПолучитьДанныеМакетаНаСервере(ИмяМакета)
    
    Обработка    = РеквизитФормыВЗначение("Объект");
    Макет        = Обработка.ПолучитьМакет(ИмяМакета);
    ИмяФайла    = ПолучитьИмяВременногоФайла("tmp");
    Макет.Записать(Имяфайла);
    Адрес        = Новый УникальныйИдентификатор();
    Результат    = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайла), Адрес);
    
    УдалитьФайлы(ИмяФайла); // принудительная очистка данных
    Обработка    = Неопределено;
    Макет        = Неопределено;
    ИмяФайла    = Неопределено;
    Адрес        = Неопределено;
    
    Возврат Результат; // возврат адреса временного хранилища (строка)
    
КонецФункции
13 Сергиус
 
04.06.18
19:29
(12)А на клиенте точно Ворд есть и нормально работает? И кстати, с сервера можно сразу ДвоичныеДанные возвращать, без помещения в хранилище.
14 Serg_1960
 
04.06.18
20:57
(13) Да, есть. В данном, конкретном, случае сеанс запускается на сервере 1С. На передачу через файл, завернутый в хранилище, можно не обращать внимание - во-первых: не принципиально, а во-вторых - это "хвосты", оставленные от промежуточного контроля каждом этапа работы. Потом приберу и оптимизирую.
15 Сияющий в темноте
 
04.06.18
21:29
Есть мнение,что кто то создал Com-сервер Word,не поставил ему видимость через Visible=True,и пытается вызвать метод Activate,который визуально подсвечивает ячейку.
Я бы на месте ворда тоже бы обиделся
16 Сергиус
 
04.06.18
23:26
(15)MSWord.Application.Visible    = Истина;

Вот в коде есть установка видимости, или о чем речь?
17 Сергиус
 
04.06.18
23:28
(14)Имеется ввиду сеанс, под которым идет запуск внешней обработки? Т.е. клиент 1с установлен на компе, где находится сервер 1с или что?
18 Serg_1960
 
05.06.18
09:20
(17) В данном конкретном случае - это удаленный рабочий стол (Remote Desktop Connection) и WINWORD запускается из-под USR1CV8 :(
19 hhhh
 
05.06.18
09:40
(18) разве у Remote Desktop Connection пользователь USR1CV8?
20 Serg_1960
 
05.06.18
11:02
Эх... забодался объяснять :) См.(5)

Когда вызывается печать документа, то обработка запускается на сервере из справочника "Дополнительные отчеты и обработки". А так, как у обработки "ВызовКлиентскогоМетода", то выполняется клиентский метод обработки - вызывается процедура Печать() формы обработки...

Короче: &НаКлиенте <<Новый COMОбъект("Word.Application")>> порождает процесс WINWORD от имени USR1CV8. Не спрашивай "Почему?" - скажи что делать :)
21 dubraver
 
05.06.18
11:09
Могу лишь свой кусок кода кинуть который работает в ЗУП 3.1 в тонком клиенте.
&НаСервере
Функция ПолучитьДанныеМакета(ИмяМакета)
    
    ТекОбъект = РеквизитФормыВЗначение("Объект");  
    ТрудовойДоговор = ТекОбъект.ПолучитьМакет(ИмяМакета);
    Возврат ТрудовойДоговор;
КонецФункции

&НаКлиенте
Процедура ПечатьФормыWord(ОбъектыНазначенияМассив, ИмяМакета) Экспорт
            

    ТрудовойДоговор = ПолучитьДанныеМакета(ИмяМакета);
        
    мИмяФайла = ПолучитьИмяВременногоФайла("docx");
    УдалитьФайлы(мИмяФайла);
    ТрудовойДоговор.Записать(мИмяФайла);
    
    MSWord = Новый COMОбъект("Word.Application");
    WordДокумент = MSWord.Documents.Open(мИмяФайла);
    
    wdWindowStateMaximize=1;
    wdWindowStateMinimize=2;
    
    MSWord.Application.Visible = Истина;
    MSWord.Application.WindowState = wdWindowStateMinimize;
    MSWord.Application.WindowState = wdWindowStateMaximize;
22 Serg_1960
 
06.06.18
09:16
(8) Кстати, - спасибо.

USR1CV8 был прописан только для работы службы. Добавил права на вход в систему и прочее - увидел, что MS Word каждый раз зависает на модальном окне с предупреждение о критической ошибке в предыдущем сеансе и предложением запустить сеанс в безопасном режиме.

(21) Интересное решение и эффект от .WindowState :) Благодарю.

Свою проблему ещё не решил.
23 Serg_1960
 
06.06.18
14:04
С проблемой определился - в момент вызова MS Word возникает локальное окно с ошибкой:
Microsoft Word
Не удается сохранить файл автозамены (MSO1049.acl).
Он может быть доступен только для чтения, или у вас нет прав на его изменение.