Рассмотрим классическую ситуацию, с которой сталкиваются многие разработчики при интеграции 1С и Microsoft Word. Вы создаете COM-объект приложения Word, заполняете шаблон данными и пытаетесь сохранить готовый документ на диск с помощью метода SaveAs. Но вместо успешного сохранения система выдает ошибку: "Метод не найден (SaveAs)". При этом обычный вызов Save() успешно отрабатывает и вызывает диалоговое окно сохранения.
Проанализируем эту ситуацию по шагам, выясним неочевидные причины такого поведения и разберем несколько надежных способов решения задачи.
Разберем самую частую и самую обидную причину этой ошибки. В редакторе кода 1С визуально латинская буква "A" и русская "А" выглядят абсолютно одинаково. Если при наборе текста NewDoc.SaveAs(_ИмяФайла) вы случайно не переключили раскладку и набрали букву "А" на русском языке, платформа 1С передаст COM-объекту именно кириллическое имя метода.
Естественно, в объектной модели VBA Word метода с русской буквой нет, поэтому возникает справедливая ошибка "Метод не обнаружен". Тщательно проверяйте раскладку клавиатуры. Метод Save() у разработчиков обычно работает именно потому, что в нем нет буквы "A", и шанс ошибиться с раскладкой сводится к нулю.
Посмотрим на развитие объектной модели Microsoft Office. Начиная с версии Office 2010, Microsoft добавила новый метод SaveAs2, который включает дополнительный параметр режима совместимости (Compatibility Mode).
SaveAs2 там физически не существует.SaveAs скрыт из визуальных подсказок IntelliSense, но продолжает технически работать для обратной совместимости (если написан строго латиницей).Также обратите внимание на параметры форматов. Если вы используете вызов вида NewDoc.SaveAs2(_ИмяФайла, 0), то второй параметр задает формат файла. Значение 0 соответствует старому формату ".doc". Если ваше имя файла оканчивается на ".docx", это вызовет конфликт форматов и предупреждения от самого Word.
Если вы хотите оставить работу через COM-соединение, но методы сохранения с новым именем упорно не работают, применим простой обходной алгоритм:
Word.Application.Save() без параметров и закройте документ.Этот метод работает безотказно и избавляет от необходимости бороться с форматами и версиями Office при вызове команд SaveAs.
Рассмотрим более современный и безопасный подход. Работа через Word.Application — это вредная затея, особенно если код выполняется на сервере 1С. Серверному пользователю может не хватать прав, у него нет профиля рабочего стола (Desktop), и COM-объект может просто "зависнуть" в памяти, ожидая нажатия невидимой кнопки в диалоговом окне.
Гораздо проще и надежнее формировать документы .docx через извлечение и модификацию OpenXML. В Библиотеке стандартных подсистем (БСП) для этого есть готовый мощный функционал. Разберем пример формирования документа с таблицами и областями через БСП:
&НаСервере
Функция ПолучитьОписаниеОбластейМакетаОфисногоДокумента()
ОписаниеОбластей = Новый Структура;
УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "ВерхнийКолонтитул","ВерхнийКолонтитул");
УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "Текст1", "Общая");
УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "СписокСотрудники", "Список");
УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "ТаблицаСотрудники","СтрокаТаблицы");
Возврат ОписаниеОбластей;
КонецФункции
&НаСервере
Функция СформироватьДоговорНаСервере()
// Получаем двоичные данные макета из реквизита
ДвоичныеДанныеМакета = РеквизитФормыВЗначение("Объект").ПолучитьМакет("Договор");
Макет = УправлениеПечатью.ИнициализироватьМакетОфисногоДокумента(ДвоичныеДанныеМакета, Неопределено);
Области = ПолучитьОписаниеОбластейМакетаОфисногоДокумента();
// Здесь должна быть функция получения данных в структуру (ДанныеОбъекта)
ДанныеОбъекта = ПолучитьДанныеОбъекта();
Если Макет = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
Попытка
ПечатнаяФорма = УправлениеПечатью.ИнициализироватьПечатнуюФорму(, , Макет);
// Заполняем простые параметры
Область = УправлениеПечатью.ОбластьМакета(Макет, Области["Текст1"]);
УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, ДанныеОбъекта);
// Заполняем коллекцию (таблицу)
ОбластьТаблица = УправлениеПечатью.ОбластьМакета(Макет, Области["ТаблицаСотрудники"]);
УправлениеПечатью.ПрисоединитьИЗаполнитьКоллекцию(ПечатнаяФорма, ОбластьТаблица, ДанныеОбъекта.ТаблицаСотрудники);
// Получаем готовый документ
АдресХранилищаПечатнойФормы = УправлениеПечатью.СформироватьДокумент(ПечатнаяФорма);
Исключение
ОбщегоНазначения.СообщитьПользователю(КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
Возврат Неопределено;
КонецПопытки;
УправлениеПечатью.ОчиститьСсылки(ПечатнаяФорма, Ложь);
УправлениеПечатью.ОчиститьСсылки(Макет);
ИмяФайла = "Договор_" + Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy") + ".docx";
ФайлДляЗаписи = Новый Структура("АдресВоВременномХранилище, Представление", АдресХранилищаПечатнойФормы, ИмяФайла);
Возврат ФайлДляЗаписи;
КонецФункции
Преимущества использования БСП:
Переход на формирование печатных форм через методы УправлениеПечатью является оптимальным решением, которое позволит забыть про ошибки объектной модели Word навсегда.