8.х Ошибка получения макета типа Active Document

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Bkmz, 4 апр 2017.

  1. TopicStarter Overlay
    Bkmz
    Offline

    Bkmz Опытный в 1С

    Регистрация:
    6 июл 2013
    Сообщения:
    416
    Симпатии:
    11
    Баллы:
    29
    Есть обработка в которой в макет помещен документ Word-овский. Я его получаю заполняю шаблон значениями из Таблицы значений. Проблема в том что на файловом варианте эта обработка работает а на серверном нет. В чем может быть проблема?

    Ошибка выскакивает здесь:

    [​IMG]


    Сама обработка:

    Вложения:

  2. TopicStarter Overlay
    Bkmz
    Offline

    Bkmz Опытный в 1С

    Регистрация:
    6 июл 2013
    Сообщения:
    416
    Симпатии:
    11
    Баллы:
    29
    Еще вопрос в тему.

    Почему при сохранении макета типа active document в файл word кодом:
    Код:
    ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
    Макет  = ОбработкаОбъект.ПолучитьМакет("ШаблонПисьмаПросрочка");
    ИмяФайла = КаталогВременныхФайлов() + "\"файл.doc";
    Макет.Записать(ИмяФайла);
    Я получаю вместо нормального документа вот такой

    [​IMG]
  3. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.246
    Симпатии:
    963
    Баллы:
    204
    Какой тип значения у Макет?
  4. TopicStarter Overlay
    Bkmz
    Offline

    Bkmz Опытный в 1С

    Регистрация:
    6 июл 2013
    Сообщения:
    416
    Симпатии:
    11
    Баллы:
    29
  5. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.246
    Симпатии:
    963
    Баллы:
    204
    Ну а что ж вы хотите? :)
    Простым Записать() там непойми чего может быть....

    Вроде еще нужно сделать:

    OLEMSWord = Макет.Получить();
  6. TopicStarter Overlay
    Bkmz
    Offline

    Bkmz Опытный в 1С

    Регистрация:
    6 июл 2013
    Сообщения:
    416
    Симпатии:
    11
    Баллы:
    29
    [​IMG]

    [​IMG]


    Из статьи: http://infostart.ru/public/270277/

    Когнитивный диссонанс

    Код:
    &НаСервере
    АктивныйДокумент = ПолучитьМакет("Макет");
    КомОбъект = АктивныйДокумент.Получить();
    Вот самые первые строчки, на которые натыкается в гугле юный неофит. В файловом варианте такой код сработает корректно (неважно в толстом или тонком клиенте). Т.к. и сервер и клиент у нас находятся на одной машине, и MS Word тоже установлен на этой машине.

    А давайте представим, что у нас клиент-сервер, да ещё и сервер находится на другой машине. Будет оно работать в тонком клиенте? Нет. И тут возникнет когнитивный диссонанс. WTF? o_O
    --- Объединение сообщений, 5 апр 2017 ---
    У меня как раз серверный вариант
  7. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.246
    Симпатии:
    963
    Баллы:
    204
    Когнитивного диссонанса нет, т.к. в режиме управляемого приложения нет объекта типа ActiveDocument от слова совсем :)

    Выход: макет делать в виде двоичных данных, и гонять результат на клиента через временное хранилище.
    Bkmz нравится это.
  8. TopicStarter Overlay
    Bkmz
    Offline

    Bkmz Опытный в 1С

    Регистрация:
    6 июл 2013
    Сообщения:
    416
    Симпатии:
    11
    Баллы:
    29
    Код:
    &НаСервере
    Функция ПолучитьДанныеМакета()
        АдресХранилища = Новый УникальныйИдентификатор();
        МакетПисьма = Обработки.ФормированиеПисемПоДепонентам.ПолучитьМакет("ШаблонПисьмо");
        Возврат ПоместитьВоВременноеХранилище(МакетПисьма, АдресХранилища);
    КонецФункции 
    
    &НаКлиенте
    Процедура СформироватьПисьма(Команда)
       Попытка
         Индификатор = ПолучитьДанныеМакета();
         МакетПисьма = ПолучитьИзВременногоХранилища(Индификатор);
         ИмяФайла = "Письмо.doc";
         ИмяФайлаПолное = "E:\ЭР\Яковенко\" + ИмяФайла;
         МакетПисьма.Записать(ИмяФайлаПолное);
       Исключение
         Сообщить(ОписаниеОшибки());
       КонецПопытки;
    КонецПроцедуры
    Я правильно понял?
    --- Объединение сообщений, 5 апр 2017 ---
    Так что это уже пережиток?
  9. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.246
    Симпатии:
    963
    Баллы:
    204
    В первом приближении - да.

    Только проще будет MSWord установить на сервер, выполнять заполнение и сохранение файла на сервере и уже результат гнать на клиента иначе придется на каждом клиенте устанавливать MSWord.
  10. TopicStarter Overlay
    Bkmz
    Offline

    Bkmz Опытный в 1С

    Регистрация:
    6 июл 2013
    Сообщения:
    416
    Симпатии:
    11
    Баллы:
    29
    Есть код:

    Код:
    &НаКлиенте
    Процедура ПолучитьМакет(Команда)
       
        Попытка
            Индификатор = ПолучитьДанныеМакета();
            МакетПисьма = ПолучитьИзВременногоХранилища(Индификатор);
            ИмяФайла = "Письмо4.doc";
            ИмяФайлаПолное = "E:\ЭР\Яковенко\" + ИмяФайла;
            МакетПисьма.Записать(ИмяФайлаПолное);
        Исключение
            Сообщить(ОписаниеОшибки());
        КонецПопытки;
       
        Попытка
            Шаблон = Новый COMОбъект("Word.Application");
        Исключение
            Сообщить("Ошибка при попытке создать объект ""MS Word""!" + Символы.ПС +
                     "Возможно приложение ""MS Word"" не установлено или установлено неправильно.", СтатусСообщения.Внимание);
                 КонецПопытки;
       
        Шаблон.Documents.Open(ИмяФайлаПолное);
        Попытка
            Шаблон.Application.Documents(1).Content.Find.Execute("{Сумма}",,,,,,,,, ЭтаФорма.Сумма, 2);               
            Шаблон.Application.Documents(1).Content.Find.Execute("{Контрагент}",,,,,,,,, ЭтаФорма.Контрагент, 2);               
            //Перемещаемся до строки в таблице
            Шаблон.Application.Selection.MoveDown(,8);       
            //Перемещаемся вниз, выделяем строку таблицы и копируем ее в буфер обмена
            Шаблон.Application.Selection.SelectRow();
            Шаблон.Application.Selection.Copy();
            Для каждого Строка Из Этаформа.ТЗ Цикл
                //Заменяем значения
                Шаблон.Application.Selection.Find.Execute("{НомерСчета}" ,,,,,,,,,Строка.НомерСчета, 2);
                Шаблон.Application.Selection.Find.Execute("{ДатаПоставки}" ,,,,,,,,,Строка.ДатаПоставки, 2);
                //Последний параметр поиска пустой
                Шаблон.Application.Selection.Find.Execute("{КрайняяДата}" ,,,,,,,,,Строка.КрайняяДата, 2);
                Шаблон.Application.Selection.Find.Execute("{СтоимостьТоваров}" ,,,,,,,,,Строка.СтоимостьТоваров, 2);
                //Перемещаемся вниз, вставляем из буфера обмена строку
                Шаблон.Application.Selection.MoveDown();
                Шаблон.Application.Selection.Paste();
                //Перемещаемся вверх и выделяем строку для замены значений
                Шаблон.Application.Selection.MoveUp();
                Шаблон.Application.Selection.SelectRow();
            КонецЦикла;
            //Вырезаем лишнюю строку
            Шаблон.Application.Selection.Cut();
            Шаблон.Application.Visible = Истина;       
        Исключение
            // Если произойдет ошибка выводятся данные об ошибке и объект закрывается.
            Сообщить("Ошибка: " + ОписаниеОшибки(), СтатусСообщения.Внимание);
            Шаблон.Application.Quit(0);
        КонецПопытки;
    
       
    КонецПроцедуры
    
    &НаСервере
    Функция ПолучитьДанныеМакета()
    
        АдресХранилища = Новый УникальныйИдентификатор();
        ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
        Макет             = ОбработкаОбъект.ПолучитьМакет("ШаблонПисьмаПросрочка");
        Возврат ПоместитьВоВременноеХранилище(Макет, АдресХранилища);
       
    КонецФункции   
    
    Если перенести заполнение документа с сервера на клиент то вот этот код отказывается работать:

    Код:
     Шаблон.Application.Documents(1).Content.Find.Execute("{Сумма}",,,,,,,,, ЭтаФорма.Сумма, 2);              
            Шаблон.Application.Documents(1).Content.Find.Execute("{Контрагент}",,,,,,,,, ЭтаФорма.Контрагент, 2);   
  11. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.246
    Симпатии:
    963
    Баллы:
    204
    Чего говорит?
    Версия MSOffice на клиенте совпадает с версией на сервере?

Поделиться этой страницей