Почему возникает ошибка при получении макета MS Word (ActiveDocument) в 1С 8.3.16 и как ее исправить?

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

Многие разработчики при переходе на новые версии платформы 1С сталкиваются с непредвиденными ошибками в старом коде. Разберем типичную ситуацию: при попытке получить макет договора в формате MS Word с помощью метода Получить возникает ошибка вида: {ВнешняяОбработка.Договор.Форма.Форма.Форма(55)}: MSWord = Договор.Получить; {ВнешняяОбработка.Договор.Форма.Форма.Форма(3)}: Серверная;. Выясним причину такого поведения платформы (начиная с релиза 8.3.16) и подробно рассмотрим актуальные способы решения проблемы.

Проанализируем причину ошибки в платформе 1С 8.3.16

Чтобы понять, почему код перестал работать, посмотрим на внутренние изменения платформы. Начиная с версии 1С:Предприятие 8.3.16, компания «1С» кардинально изменила механизм отображения веб-контента и HTML-документов на формах. Устаревший движок на базе Internet Explorer был полностью заменен на современный движок WebKit (Chromium Embedded Framework).

Как это работало раньше? Технология ActiveDocument использовалась в 1С в качестве OLE-контейнера. Пользователь мог открыть форму справочника или документа и прямо внутри этой формы видеть полноценный редактор MS Word (вместе с панелями инструментов и меню), чтобы, например, отредактировать договор. Однако технология ActiveX является проприетарной разработкой Microsoft и поддерживалась исключительно в Internet Explorer. В новом движке Chromium она работать перестала. Из-за этого пропала возможность встраивать интерфейс MS Office непосредственно в управляемые формы 1С, а вызов метода Получить для таких макетов теперь приводит к ошибке.

Рассмотрим пути решения и альтернативы

Поскольку вернуть редактор MS Word внутрь формы 1С в новых версиях платформы невозможно, нам необходимо переписать логику работы с документами. Разберем по шагам три основных способа адаптации вашего кода.

Решение 1. Использование COM-объектов в независимом окне

Взаимодействие с MS Word не исчезло полностью. Мы по-прежнему можем программно формировать документы, но теперь редактор должен открываться как отдельное, самостоятельное окно операционной системы.

Для заполнения документа мы используем вызов Automation сервера. Посмотрим на пример кода, который демонстрирует этот подход:


// Создаем COM-объект для работы с Word
WordApp = Новый COMОбъект("Word.Application");
// Открываем шаблон документа (путь к файлу шаблона)
Документ = WordApp.Documents.Open(ПутьКШаблону);

// Здесь располагается ваш код заполнения параметров макета...

// Делаем Word видимым для пользователя (откроется отдельное окно)
WordApp.Visible = Истина;

Обратите внимание: при таком подходе пользователь работает с документом в стандартном окне MS Word, а не внутри 1С. После завершения редактирования ему потребуется сохранить файл самостоятельно.

Решение 2. Переход на макеты типа «Двоичные данные»

Это наиболее рекомендуемый разработчиками платформы сценарий. Теперь шаблоны файлов Word (в форматах .doc или .docx) следует хранить в конфигурации или базе данных не как ActiveDocument, а в виде двоичных данных. Разберем алгоритм действий:

  1. Извлекаем шаблон из макета (двоичные данные) на сервере.
  2. Сохраняем его во временный файл средствами платформы 1С.
  3. Через COM-объект программно заполняем этот временный файл необходимыми реквизитами (данными контрагента, суммами и т.д.).
  4. Передаем готовый файл с сервера на клиент, используя временное хранилище.
  5. На клиентской стороне сохраняем файл на диск и открываем его средствами операционной системы.

Для открытия готового файла на клиенте мы используем процедуру ЗапуститьПриложение. Посмотрим на пример вызова на стороне клиента:


// Путь к заполненному файлу, который мы сохранили на диск пользователя
ПутьКГотовомуФайлу = ПолучитьИмяВременногоФайла("docx");

// Сохраняем полученные с сервера данные...
// ...

// Запускаем файл в приложении по умолчанию (MS Word)
ЗапуститьПриложение(ПутьКГотовомуФайлу);

Решение 3. Полный отказ от использования MS Word

Использование COM-объектов имеет серьезные ограничения: они работают только на операционной системе Windows и требуют обязательно установленного пакета MS Office на компьютере клиента. В условиях импортозамещения и перехода на ОС Linux (или использования веб-клиентов) этот подход становится нерабочим.

Рассмотрим альтернативу: полный перенос печатных форм (в том числе сложных договоров) на стандартные Табличные документы 1С (mxl) или формирование их в формате HTML.

Преимущества данного подхода:

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

← На главную