Имя: Пароль:
1C
1С v8
WORD через Com
,
0 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
2 folo
 
29.10.20
09:48
Тоже не работает
3 mikecool
 
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) "Весь взвод-разгильдяи, шагали не в ногу. Один старший сержант Иванщенко молодец, в ногу шагал"...
В смысле - если у всех работает, а у тебя нет, может дело в тебе?
7 folo
 
29.10.20
09:51
Метод объекта не обнаружен (SaveАs2)
8 folo
 
29.10.20
09:54
(6) Готов признать, но кто бы подсказал что во мне не так? Совершенно типовая схема, описанная в тысяче мест у меня не работает.
9 Василий Алибабаевич
 
29.10.20
09:56
(8) Давай код от
NewDoc  = WORD.Documents.Add(Шаблон);
до
NewDoc.SaveAs2();

заполнение документа можно опустить.
10 folo
 
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
КонецЕсли;
КонецЕсли
11 folo
 
29.10.20
10:29
Все слились. Видимо в коде ошибки нет.
12 arsik
 
гуру
29.10.20
11:37
(10) Зачем через COM? В БСП примеры есть для работы с Docx без COM. У нас так договора штампуются.
13 folo
 
29.10.20
11:52
(12) Спасибо, посмотрю.
14 shuhard
 
29.10.20
12:48
(12) +100500 куда проще извлечь из docx xml и с ним работать
Word.Application - вредная затея
15 Armando
 
29.10.20
12:55
(3) Это другое, вы не понимаете!
16 Armando
 
29.10.20
12:56
Советую посмотреть в сторону OpenXML. (12) как раз об этом
17 arsik
 
гуру
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";
    
    ФайлДляЗаписи = Новый Структура("АдресВоВременномХранилище,Представление",АдресХранилищаПечатнойФормы,ИмяФайла);
    Возврат ФайлДляЗаписи;
КонецФункции
18 folo
 
29.10.20
15:32
Вопрос решился так : Файл шаблона копируется в файл с нужным именем. Именно он открывается в WORD , заполняется и записывается командой Save.
Жаль кучу времени потерял на исследование SaveAS, Saveas2. В чем причина так и не понял.
19 hhhh
 
29.10.20
15:38
(18) ну может потому что там шаблон, а не файл doc?
Основная теорема систематики: Новые системы плодят новые проблемы.