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

Ошибка 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 или кнопку "Обновить" в браузере.