Вход | Регистрация
 

Ошибка Word через ОболочкаActiveDocument на 64-разрядном сервере 1С

Ошибка Word через ОболочкаActiveDocument на 64-разрядном сервере 1С
Я
   Гений 1С
 
27.05.20 - 14:49
Пользователи работают на сервере РДП, база на сервере 1С. 1С там 64-разрядная.

Доп. внешняя печатная форма, серверная функция валится на Получить():

Макет = РеквизитФормыВЗначение("Объект").ПолучитьМакет("Макет"); //Тут возвращается вордовый ОболочкаActiveDocument
Макет.Получить()

Описания ошибки не выдает.

В файловом варианте все работает, т.к. выполнение происходит на сервере РДП.


Word.Application создается везде успешно.

    Попытка
        Word = Новый COMОбъект("Word.Application")
    Исключение
        Сообщить("Не удалось создать объект Word.Application: " + ОписаниеОШибки());
    КонецПопытки;

Может как-то можно загнать макет ОболочкаActiveDocument в Word.Application?


Сервер РДП:

Microsoft Windows 7 version 6.1 Service Pack 1 (Build 7601)
8.3.15.1830
Windows x86

Сервер 1С:
Microsoft Windows 7 version 6.1 Service Pack 1 (Build 7601)
8.3.15.1830
Windows x86-64
   fisher
 
1 - 27.05.20 - 14:53
У тебя внедренный в mxl вордовый ActiveDocument?
Надеюсь, у тебя чрезвычайно веские причины для такой архаичной лапароскопии.
   fisher
 
2 - 27.05.20 - 14:58
В те древние времена, когда так еще носили, на сервере это делать я не пробовал (тогда царил толстый клиент). Возможно, поможет какая-то магия с настройкой прав и компонентов для пользователя, под которым стартует сервер приложений.
   fisher
 
3 - 27.05.20 - 15:00
Безумная идея.
А попробуй на сервере запустить x64 конфигуратор и там его "перевнедрить".
   Lama12
 
4 - 27.05.20 - 15:03
(0) Гетерогенный системы - зло.
5 лет назад предупреждал своих чот не надо делать печатные формы в ворде. Нет, сказали им так удобнее и последствия их не страшат.
Теперь у всех стоит ворд 2019 или 365, а он глючный до безобразия. Теперь что б распечатать форму, нужно комп перезагрузить. А переделывать времени нет :-)
   Гений 1С
 
5 - 27.05.20 - 18:02
В принципе получилось, но виснет на первой операции поиска.
Код такой, если кому надо будет:

        Макет = ПолучитьМакетСервер();
        
        //Сообщить(ТипЗнч(Макет));

        Попытка
            MSWord = Макет.Полу3чить();  //Тут специально для тестов изменил название

        Исключение
            МояЗаписьЖурналаРегистрации("Отладка.Word",,,,"Не удалось получить макет так");
            ОписаниеОшибкиМакета = ОписаниеОшибки();
            Попытка
                MSWord = Новый COMОбъект("Word.Application");
                MSWord.Displayalerts = ложь;
                ВФ = ПолучитьИмяВременногоФайла("DOC"); 
                Макет.Записать(ВФ);
                //Документ = MSWord.Documents.Open(ВФ, ложь,,,,,,,,,,,,,,ложь ); //Тишина

                Документ = MSWord.Documents.Open(ВФ, ложь);//Тишина

                
            Исключение
                
                Сообщить("Ошибка при получении макета Word : " + ОписаниеОшибкиМакета);
                Сообщить("Не удалось создать объект Word.Application: " + ОписаниеОШибки());
                Возврат Результат;
            КонецПопытки;
            МояЗаписьЖурналаРегистрации("Отладка.Word",,,,"Создали объект Word");

        Конецпопытки;
        

Зависает на этом:

            
            Замена = Документ.Content.Find;
            Замена.Execute("%НомерДокумента%", Ложь, Истина, Ложь, ,    , Истина, ,    Ложь,СокрЛП(НомерДляПечати));

Видимо выдает какую-то ошибку и виснет.
   Гений 1С
 
6 - 27.05.20 - 21:03
В общем, после нескольких запусков "повесил" сервер, админ был не рад, перезагрузил.
Плюнул и переписал на клиента...
Столкнулся с тем, что ОболочкаАктивХДокумента живет только на сервере, поэтому заменил на старый добрый беспроблемный Word.Application.
Код, который работал с Word, переписывать не пришлось - объект тот же самый.






&НаКлиенте
Процедура ПечатьНаКлиенте(Результат)  Экспорт
    
    для каждого КЗ из Результат.Соо цикл
        СсылкаНаОбъект = КЗ.Ключ;
        СтруктураТаблиц = КЗ.Значение;
        
        ВыборкаОС = СтруктураТаблиц.ТЗОС[0];
        Для каждого СтрокаОС из  СтруктураТаблиц.ТЗПоОС цикл
            
            ДД = ПолучитьМакетСервер();
            ВФ = ПолучитьИмяВременногоФайла("DOC"); 
            ДД.Записать(ВФ);

            
            Попытка
                MSWord = Новый COMОбъект("Word.Application");
                MSWord.Displayalerts = ложь;
                //ВФ = ПолучитьИмяВременногоФайла("DOC"); 

                //Макет.Записать(ВФ);

                //Документ = MSWord.Documents.Open(ВФ, ложь,,,,,,,,,,,,,,ложь ); //Тишина

                Документ = MSWord.Documents.Open(ВФ, ложь);//Тишина

                
            Исключение
                
                //Сообщить("Ошибка при получении макета Word : " + ОписаниеОшибкиМакета);

                Сообщить("Не удалось создать объект Word.Application: " + ОписаниеОШибки());
                Возврат;
            КонецПопытки;
            МояЗаписьЖурналаРегистрации("Отладка.Word",,,,"Создали объект Word");
            
            
            
            Попытка
                //Документ = MSWord.Application.Documents(1);

                МояЗаписьЖурналаРегистрации("Отладка.Word",,,,"Получили документ Word");
                Документ.Activate();
                НомерДляПечати        = УбратьПрефиксы(ВычислитьНаСервере(СсылкаНаОбъект, "Номер"));
                Замена = Документ.Content.Find;
                Замена.Execute("%НомерДокумента%", Ложь, Истина, Ложь, ,    , Истина, ,    Ложь,СокрЛП(НомерДляПечати));
                



&НаСервере
Функция ТаблицуЗначенийВМассивСтруктур(ТЗ) Экспорт
    М = Новый Массив();
    Для Каждого Строка ИЗ ТЗ Цикл
        Структура = Новый Структура();
        Для Каждого Колонка ИЗ ТЗ.Колонки Цикл
            Структура.Вставить(Колонка.Имя, Строка[Колонка.Имя]);
        КонецЦикла;
        М.Добавить(Структура);
    КонецЦикла;
    Возврат М;    
КонецФункции 


&НаСервере
Функция ВычислитьНаСервере(Ссылка, Реквизит) Экспорт
    Возврат Вычислить("Ссылка." + Реквизит);
КонецФункции



&НаСервере
Функция ПолучитьМакетСервер()
    
    
    Макет = РеквизитФормыВЗначение("Объект").ПолучитьМакет("Макет");
    ВФ = ПолучитьИмяВременногоФайла("DOC"); 
    Макет.Записать(ВФ);
    ДД = Новый ДвоичныеДанные(ВФ);
    
    Возврат ДД;
КонецФункции

Список тем форума
Рекламное место пустует  Рекламное место пустует
Пользователь не знает, чего он хочет, пока не увидит то, что он получил.
Э. Йодан
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.