Многие разработчики при переходе на новые версии платформы 1С сталкиваются с непредвиденными ошибками в старом коде. Разберем типичную ситуацию: при попытке получить макет договора в формате MS Word с помощью метода Получить возникает ошибка вида: {ВнешняяОбработка.Договор.Форма.Форма.Форма(55)}: MSWord = Договор.Получить; {ВнешняяОбработка.Договор.Форма.Форма.Форма(3)}: Серверная;. Выясним причину такого поведения платформы (начиная с релиза 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С в новых версиях платформы невозможно, нам необходимо переписать логику работы с документами. Разберем по шагам три основных способа адаптации вашего кода.
Взаимодействие с MS Word не исчезло полностью. Мы по-прежнему можем программно формировать документы, но теперь редактор должен открываться как отдельное, самостоятельное окно операционной системы.
Для заполнения документа мы используем вызов Automation сервера. Посмотрим на пример кода, который демонстрирует этот подход:
// Создаем COM-объект для работы с Word
WordApp = Новый COMОбъект("Word.Application");
// Открываем шаблон документа (путь к файлу шаблона)
Документ = WordApp.Documents.Open(ПутьКШаблону);
// Здесь располагается ваш код заполнения параметров макета...
// Делаем Word видимым для пользователя (откроется отдельное окно)
WordApp.Visible = Истина;
Обратите внимание: при таком подходе пользователь работает с документом в стандартном окне MS Word, а не внутри 1С. После завершения редактирования ему потребуется сохранить файл самостоятельно.
Это наиболее рекомендуемый разработчиками платформы сценарий. Теперь шаблоны файлов Word (в форматах .doc или .docx) следует хранить в конфигурации или базе данных не как ActiveDocument, а в виде двоичных данных. Разберем алгоритм действий:
Для открытия готового файла на клиенте мы используем процедуру ЗапуститьПриложение. Посмотрим на пример вызова на стороне клиента:
// Путь к заполненному файлу, который мы сохранили на диск пользователя
ПутьКГотовомуФайлу = ПолучитьИмяВременногоФайла("docx");
// Сохраняем полученные с сервера данные...
// ...
// Запускаем файл в приложении по умолчанию (MS Word)
ЗапуститьПриложение(ПутьКГотовомуФайлу);
Использование COM-объектов имеет серьезные ограничения: они работают только на операционной системе Windows и требуют обязательно установленного пакета MS Office на компьютере клиента. В условиях импортозамещения и перехода на ОС Linux (или использования веб-клиентов) этот подход становится нерабочим.
Рассмотрим альтернативу: полный перенос печатных форм (в том числе сложных договоров) на стандартные Табличные документы 1С (mxl) или формирование их в формате HTML.
Преимущества данного подхода:
winword.exe в памяти сервера и правами доступа при использовании COM.Подводя итог, можно с уверенностью сказать, что отказ от технологии ActiveDocument в 1С 8.3.16 — это шаг в сторону повышения стабильности и кроссплатформенности. Применяя описанные выше методы, мы сможем безболезненно перевести наши внешние обработки и печатные формы на современные стандарты разработки.