Почему возникает ошибка "Метод не найден (SaveAs)" при сохранении Word через COM в 1С и как это исправить

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Рассмотрим классическую ситуацию, с которой сталкиваются многие разработчики при интеграции 1С и Microsoft Word. Вы создаете COM-объект приложения Word, заполняете шаблон данными и пытаетесь сохранить готовый документ на диск с помощью метода SaveAs. Но вместо успешного сохранения система выдает ошибку: "Метод не найден (SaveAs)". При этом обычный вызов Save() успешно отрабатывает и вызывает диалоговое окно сохранения.

Проанализируем эту ситуацию по шагам, выясним неочевидные причины такого поведения и разберем несколько надежных способов решения задачи.

Причина 1: Скрытая ловушка кириллицы в коде

Разберем самую частую и самую обидную причину этой ошибки. В редакторе кода 1С визуально латинская буква "A" и русская "А" выглядят абсолютно одинаково. Если при наборе текста NewDoc.SaveAs(_ИмяФайла) вы случайно не переключили раскладку и набрали букву "А" на русском языке, платформа 1С передаст COM-объекту именно кириллическое имя метода.

Естественно, в объектной модели VBA Word метода с русской буквой нет, поэтому возникает справедливая ошибка "Метод не обнаружен". Тщательно проверяйте раскладку клавиатуры. Метод Save() у разработчиков обычно работает именно потому, что в нем нет буквы "A", и шанс ошибиться с раскладкой сводится к нулю.

Причина 2: Разница между методами SaveAs и SaveAs2

Посмотрим на развитие объектной модели Microsoft Office. Начиная с версии Office 2010, Microsoft добавила новый метод SaveAs2, который включает дополнительный параметр режима совместимости (Compatibility Mode).

  1. Если на компьютере установлен старый Word 2007, метода SaveAs2 там физически не существует.
  2. В новых версиях Office старый метод SaveAs скрыт из визуальных подсказок IntelliSense, но продолжает технически работать для обратной совместимости (если написан строго латиницей).

Также обратите внимание на параметры форматов. Если вы используете вызов вида NewDoc.SaveAs2(_ИмяФайла, 0), то второй параметр задает формат файла. Значение 0 соответствует старому формату ".doc". Если ваше имя файла оканчивается на ".docx", это вызовет конфликт форматов и предупреждения от самого Word.

Решение 1: Обходной путь с предварительным копированием

Если вы хотите оставить работу через COM-соединение, но методы сохранения с новым именем упорно не работают, применим простой обходной алгоритм:

  1. Сначала средствами платформы 1С скопируйте файл шаблона в нужный каталог под итоговым именем.
  2. Откройте этот новый файл через COM-объект Word.Application.
  3. Заполните необходимые данные и закладки.
  4. Вызовите простой метод Save() без параметров и закройте документ.

Этот метод работает безотказно и избавляет от необходимости бороться с форматами и версиями Office при вызове команд SaveAs.

Решение 2 (Рекомендуемое): Отказ от COM-объектов в пользу БСП

Рассмотрим более современный и безопасный подход. Работа через Word.Application — это вредная затея, особенно если код выполняется на сервере 1С. Серверному пользователю может не хватать прав, у него нет профиля рабочего стола (Desktop), и COM-объект может просто "зависнуть" в памяти, ожидая нажатия невидимой кнопки в диалоговом окне.

Гораздо проще и надежнее формировать документы .docx через извлечение и модификацию OpenXML. В Библиотеке стандартных подсистем (БСП) для этого есть готовый мощный функционал. Разберем пример формирования документа с таблицами и областями через БСП:


&НаСервере
Функция ПолучитьОписаниеОбластейМакетаОфисногоДокумента()
    ОписаниеОбластей = Новый Структура;
    УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "ВерхнийКолонтитул","ВерхнийКолонтитул");
    УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "Текст1", "Общая");
    УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "СписокСотрудники", "Список");
    УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "ТаблицаСотрудники","СтрокаТаблицы");
    Возврат ОписаниеОбластей;
КонецФункции

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

Преимущества использования БСП:

  1. Отсутствие зависимости от установленного пакета MS Office на клиенте или сервере.
  2. Документы формируются моментально, так как идет прямая работа с XML-структурой архива docx.
  3. Отсутствуют проблемы с COM-объектами, "зависшими" процессами winword.exe в диспетчере задач и ошибками методов.

Переход на формирование печатных форм через методы УправлениеПечатью является оптимальным решением, которое позволит забыть про ошибки объектной модели Word навсегда.

← На главную