Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

WORD через Com

WORD через Com
Я
   folo
 
29.10.20 - 09:46
Добрый день. из 1С не работает SaveAs для файла WORD. Все на клиенте.
WORD =  Новый COMОбъект("Word.Application");
NewDoc  = WORD.Documents.Add(Шаблон);
...
Прекрасно открывает WORD и выводит шаблон.
Если вместо вывода задать  NewDoc.SaveАs(_ИмяФайла);  показывает ошибку "Метод не найден (SaveAS)".  Причем Save() отрабатывает- выводит запрос на сохранение.  
Кто нибудь встречался с такой фигней ?
   ДенисЧ
 
1 - 29.10.20 - 09:47
   folo
 
2 - 29.10.20 - 09:48
Тоже не работает
   mikecool
 
3 - 29.10.20 - 09:48
(1) бгг, а еще на БСП и переименование методов в типовых наезжают
   Волшебник
 
4 - 29.10.20 - 09:50
(3) Так то Microsoft, светоч демократии. Ну конечно не такой, как Apple, но тоже идол
   Василий Алибабаевич
 
5 - 29.10.20 - 09:50
(0) "Метод не найден (SaveAS)"
А он теперь называется SaveAS2 (с двойкой)
   ДенисЧ
 
6 - 29.10.20 - 09:51
(2) "Весь взвод-разгильдяи, шагали не в ногу. Один старший сержант Иванщенко молодец, в ногу шагал"...
В смысле - если у всех работает, а у тебя нет, может дело в тебе?
   folo
 
7 - 29.10.20 - 09:51
Метод объекта не обнаружен (SaveАs2)
   folo
 
8 - 29.10.20 - 09:54
(6) Готов признать, но кто бы подсказал что во мне не так? Совершенно типовая схема, описанная в тысяче мест у меня не работает.
   Василий Алибабаевич
 
9 - 29.10.20 - 09:56
(8) Давай код от
NewDoc  = WORD.Documents.Add(Шаблон);
до 
NewDoc.SaveAs2();

заполнение документа можно опустить.
   folo
 
10 - 29.10.20 - 10:01
WORD =  Новый COMОбъект("Word.Application");
NewDoc  = WORD.Documents.Add(Шаблон);
NewDoc.Activate();
Замена = NewDoc.Content.Find;
Замена.Execute( "[Номер]",,,,,,,,,Реквизиты.Номер,2);
Если СразуВФайл Тогда
 _ИмяФайла = Строка(КаталогНаДиске+""+Реквизиты.ФамилияИО+" "+_Описание+".Docx");
  NewDoc.SaveАs2(_ИмяФайла,0);
  NewDoc.Close(false);    

Иначе

NewDoc.Application.Visible = Истина;
 Если NewDoc.ActiveWindow.View.SplitSpecial = 0 Тогда//константа wdPaneNone 

    NewDoc.ActiveWindow.ActivePane.View.Type = 3;//константа wdPrintView равно 3

    Иначе
    NewDoc.ActiveWindow.View.Type = 3;//константа wdPrintView равно 3

 КонецЕсли;
КонецЕсли
   folo
 
11 - 29.10.20 - 10:29
Все слились. Видимо в коде ошибки нет.
   arsik
 
12 - 29.10.20 - 11:37
(10) Зачем через COM? В БСП примеры есть для работы с Docx без COM. У нас так договора штампуются.
   folo
 
13 - 29.10.20 - 11:52
(12) Спасибо, посмотрю.
   shuhard
 
14 - 29.10.20 - 12:48
(12) +100500 куда проще извлечь из docx xml и с ним работать
Word.Application - вредная затея
   Armando
 
15 - 29.10.20 - 12:55
(3) Это другое, вы не понимаете!
   Armando
 
16 - 29.10.20 - 12:56
Советую посмотреть в сторону OpenXML. (12) как раз об этом
   arsik
 
17 - 29.10.20 - 13:10
Вот минимум который нужен
&НаСервере
Функция ПолучитьОписаниеОбластейМакетаОфисногоДокумента()
    
    ОписаниеОбластей = Новый Структура;
    
    УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "ВерхнийКолонтитул","ВерхнийКолонтитул");
    УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "Текст1",            "Общая");
    УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "Текст2",            "Общая");
    УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "Текст3",            "Общая");
    УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "Текст4",            "Общая");
    УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "СписокСотрудники",    "Список");
    УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "ТаблицаСотрудники","СтрокаТаблицы");
    
    Возврат ОписаниеОбластей;
    
КонецФункции

&НаСервере
Функция ПолучитьДанныеОбъекта()
    ДанныеОбъекта = Новый Структура;
    
    ДанныеОбъекта.Вставить("НаименованиеОрганизации", СокрЛП(Объект.Организация.НаименованиеСокращенное));
    ДанныеОбъекта.Вставить("НаименованиеОрганизацииПолное", СокрЛП(Объект.Организация.НаименованиеПолное));
    ДанныеОбъекта.Вставить("Дата", Формат(Объект.ДатаДоговора,"ДФ='dd.MM.yyyy ""г.""'"));
    ДанныеОбъекта.Вставить("ДатаПолная", Формат(Объект.ДатаДоговора,"ДФ='dd MMMM yyyy ""г.""'"));
    ДанныеОбъекта.Вставить("НомерПриказа", СокрЛП(ЭтотОбъект.НомерПриказа));
    ДанныеОбъекта.Вставить("НазваниеГорода", СокрЛП(ЭтотОбъект.Город));
    ДанныеОбъекта.Вставить("НаименованиеМагазина", СокрЛП(ЭтотОбъект.НаименованиеМагазина));
    ДанныеОбъекта.Вставить("Основание", СокрЛП(ЭтотОбъект.Основание));
    
    ДанныеОбъекта.Вставить("СписокСотрудники", Новый Массив);
    ДанныеОбъекта.Вставить("ТаблицаСотрудники", Новый Массив);
    
    Для Каждого СтрокаТабличнойЧасти Из Объект.Сотрудники Цикл
        ФИОПолное = СокрЛП(СтрокаТабличнойЧасти.Сотрудник.ФизическоеЛицо.ФИО);
        ФИОСокращенное = ФизическиеЛицаЗарплатаКадры.РасшифровкаПодписи(ФИОПолное);
        Должность = СокрЛП(СтрокаТабличнойЧасти.Должность);
        
        ДанныеОбъекта.СписокСотрудники.Добавить(Новый Структура("ФИОСотрудникаПолное,ДолжностьСотрудника",ФИОПолное,Должность));
        
        Если СтрокаТабличнойЧасти.Бригадир тогда
            ДанныеОбъекта.Вставить("ФИОБригадираПолное",ФИОПолное);
            ДанныеОбъекта.Вставить("ФИОБригадира",ФИОСокращенное);
            ДанныеОбъекта.Вставить("ПолБригадира",СтрокаТабличнойЧасти.Сотрудник.ФизическоеЛицо.Пол);
            ДанныеОбъекта.Вставить("ДолжностьБригадира",Должность);
            Продолжить;
        КонецЕсли;
        
        ДанныеОбъекта.ТаблицаСотрудники.Добавить(Новый Структура("ФИОСотрудника,Дата",ФИОСокращенное,ДанныеОбъекта.Дата));
    КонецЦикла;
    
    РезультатСклонения = "";
    Если ФизическиеЛицаЗарплатаКадры.Просклонять(ДанныеОбъекта.ФИОБригадираПолное, 4, РезультатСклонения, ДанныеОбъекта.ПолБригадира) Тогда
        ДанныеОбъекта.Вставить("ФИОБригадираПолноеСклоненное",РезультатСклонения);
    Иначе
        ДанныеОбъекта.Вставить("ФИОБригадираПолноеСклоненное",ДанныеОбъекта.ФИОБригадираПолное);
    КонецЕсли;    
    
    РезультатСклонения = "";
    Если ФизическиеЛицаЗарплатаКадры.Просклонять(ДанныеОбъекта.ФИОБригадираПолное, 2, РезультатСклонения, ДанныеОбъекта.ПолБригадира) Тогда
        ДанныеОбъекта.Вставить("ФИОБригадираПолноеСклоненноеДоговор",РезультатСклонения);
    Иначе
        ДанныеОбъекта.Вставить("ФИОБригадираПолноеСклоненноеДоговор",ДанныеОбъекта.ФИОБригадираПолноеСклоненное);
    КонецЕсли;    
    
    РезультатСклонения = ПолучитьСклоненияСтроки(ДанныеОбъекта.ДолжностьБригадира,,"ПД=Винительный");
    ДанныеОбъекта.Вставить("ДолжностьБригадираСклоненная",РезультатСклонения[0]);

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

&НаСервере
Функция ПолучитьДоговорНаСервере()
    ДвоичныеДанныеМакета = РеквизитФормыВЗначение("Объект").ПолучитьМакет("Договор");
    Макет = УправлениеПечатью.ИнициализироватьМакетОфисногоДокумента(ДвоичныеДанныеМакета,Неопределено);
    Области = ПолучитьОписаниеОбластейМакетаОфисногоДокумента();
    ДанныеОбъекта = ПолучитьДанныеОбъекта();
    
    Если Макет = Неопределено Тогда
        Возврат Неопределено;
    КонецЕсли;
    
    ЗакрытьОкноПечатнойФормы = Ложь;
    Попытка
        ПечатнаяФорма = УправлениеПечатью.ИнициализироватьПечатнуюФорму(, , Макет);
        АдресХранилищаПечатнойФормы = "";
        Если ПечатнаяФорма = Неопределено Тогда
            УправлениеПечатью.ОчиститьСсылки(Макет);
            Возврат Неопределено;
        КонецЕсли;
        
        Область = УправлениеПечатью.ОбластьМакета(Макет, Области["ВерхнийКолонтитул"]);
        УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, ДанныеОбъекта);
        
        Область = УправлениеПечатью.ОбластьМакета(Макет, Области["Текст1"]);
        УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, ДанныеОбъекта);
        
        Область = УправлениеПечатью.ОбластьМакета(Макет, Области["СписокСотрудники"]);
        УправлениеПечатью.ПрисоединитьИЗаполнитьКоллекцию(ПечатнаяФорма, Область, ДанныеОбъекта.СписокСотрудники);
        
        Область = УправлениеПечатью.ОбластьМакета(Макет, Области["Текст2"]);
        УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, ДанныеОбъекта);
        
        ОбластьТаблицаСотрудники = УправлениеПечатью.ОбластьМакета(Макет, Области["ТаблицаСотрудники"]);
        УправлениеПечатью.ПрисоединитьИЗаполнитьКоллекцию(ПечатнаяФорма, ОбластьТаблицаСотрудники, ДанныеОбъекта.ТаблицаСотрудники);
        
        Область = УправлениеПечатью.ОбластьМакета(Макет, Области["Текст3"]);
        УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, ДанныеОбъекта);
        
        УправлениеПечатью.ПрисоединитьИЗаполнитьКоллекцию(ПечатнаяФорма, ОбластьТаблицаСотрудники, ДанныеОбъекта.ТаблицаСотрудники);
        
        АдресХранилищаПечатнойФормы = УправлениеПечатью.СформироватьДокумент(ПечатнаяФорма);
    Исключение
        ОбщегоНазначения.СообщитьПользователю(КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
        ЗакрытьОкноПечатнойФормы = Истина;
        Возврат Неопределено;
    КонецПопытки;
    
    УправлениеПечатью.ОчиститьСсылки(ПечатнаяФорма, ЗакрытьОкноПечатнойФормы);
    УправлениеПечатью.ОчиститьСсылки(Макет);
    
    ИмяФайла = СокрЛП(Объект.Организация)+"-"+СокрЛП(ЭтотОбъект.НаименованиеМагазина)+"-"+Формат(Объект.ДатаДоговора,"ДФ=dd.MM.yyyy");
    ИмяФайла = СтрЗаменить(ИмяФайла,"""","")+".docx";
    
    ФайлДляЗаписи = Новый Структура("АдресВоВременномХранилище,Представление",АдресХранилищаПечатнойФормы,ИмяФайла);
    Возврат ФайлДляЗаписи;
КонецФункции

   folo
 
18 - 29.10.20 - 15:32
Вопрос решился так : Файл шаблона копируется в файл с нужным именем. Именно он открывается в WORD , заполняется и записывается командой Save.
Жаль кучу времени потерял на исследование SaveAS, Saveas2. В чем причина так и не понял.
   hhhh
 
19 - 29.10.20 - 15:38
(18) ну может потому что там шаблон, а не файл doc?

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