При работе в конфигураторе «1С:Предприятие» разработчики часто сталкиваются с неприятной ситуацией: при попытке открыть или отредактировать существующий макет типа Active document (обычно это шаблоны Microsoft Word или Excel) система выдает критическую ошибку: «Не удалось создать объект. Возможно, отсутствует соответствующее приложение».
Особенно часто эта проблема проявляется внезапно — например, после обновления платформы 1С (характерно для переходов на релизы 8.3.15.1700 и выше). При этом самое удивительное, что в режиме пользователя (в тонком или толстом клиенте) печатные формы по этим макетам могут продолжать формироваться и выводиться на экран без каких-либо сбоев. В рамках этой статьи мы подробно разберем, почему возникает этот сбой, и рассмотрим несколько эффективных способов его устранения.
Для того чтобы понять природу этой ошибки, проанализируем архитектуру взаимодействия приложений. Технология Active document внутри конфигуратора 1С полагается на механизм OLE/COM (In-Process OLE Automation). Это значит, что 1С пытается инициализировать графический интерфейс и библиотеки Microsoft Word или Excel непосредственно внутри своего собственного запущенного процесса.
Начиная с версии платформы 8.3.15, программа установки 1С по умолчанию инсталлирует и запускает 64-разрядную (x64) версию клиента (включая Конфигуратор) на всех современных 64-битных операционных системах Windows. В то же время на компьютерах пользователей и разработчиков очень часто по умолчанию устанавливается 32-разрядный (x86) пакет Microsoft Office (даже на 64-битных ОС Windows это стандартная рекомендация Microsoft для старых версий Office).
В этом и кроется корень проблемы: 64-разрядный процесс Конфигуратора 1С физически не может загрузить в свое адресное пространство 32-разрядные библиотеки COM-сервера Microsoft Office. Операционная система Windows блокирует такое межразрядное взаимодействие внутри одного процесса, в результате чего конфигуратор выдает ошибку о «невозможности создания объекта».
Ниже мы подробно разберем четыре практических варианта решения этой проблемы, начиная с простых обходных путей и заканчивая лучшими практиками разработки в 1С.
Если у вас нет возможности или прав администратора для переустановки Microsoft Office на компьютере, самым быстрым решением будет запуск Конфигуратора 1С в режиме x86 (32 бит). В этом случае разрядности Конфигуратора и MS Office совпадут, и макет откроется без ошибок.
Рассмотрим по шагам, как настроить запуск:
Также вы можете запустить 32-битный конфигуратор напрямую из папки установки платформы, минуя стандартный стартер. Для этого перейдите по пути C:\Program Files (x86)\1cv8\<Номер_Версии_Платформы>\bin\ и запустите файл 1cv8.exe (или 1cv8g.exe).
Если ваша компания планомерно переходит на современные стандарты ПО, наиболее правильным системным решением будет выравнивание разрядности операционной системы, платформы 1С и офисного пакета. Для этого выполните следующие действия:
После этого 64-битный Конфигуратор 1С сможет напрямую инициализировать 64-битные OLE-объекты Word и Excel, и макеты будут открываться штатно.
Использование технологии Active document в современной разработке 1С считается устаревшим подходом (deprecated) именно из-за жесткой привязки к конкретным версиям и разрядностям стороннего софта на компьютерах пользователей. Опытные разработчики рекомендуют переводить шаблоны документов на работу через механизм Двоичных данных.
Разберем по шагам, как перестроить работу с шаблонами:
Active document в конфигураторе (запустив его в 32-битном режиме, как описано в Варианте 1) и сохраните сам шаблон файла на жесткий диск (например, как файл Шаблон.docx).Active document из метаданных.Шаблон.docx.Проанализируем пример программного кода для реализации этого механизма:
// 1. Получаем макет двоичных данных из конфигурации
МакетДвоичныеДанные = ПолучитьМакет("ИмяВашегоМакетаДвоичныеДанные");
// 2. Формируем уникальный путь во временном каталоге системы
ИмяВременногоФайла = ПолучитьИмяВременногоФайла(".docx");
// 3. Выгружаем двоичные данные файла на локальный диск
МакетДвоичныеДанные.Записать(ИмяВременногоФайла);
Попытка
// 4. Инициализируем внешнее приложение MS Word
MSWord = Новый COMОбъект("Word.Application");
MSWord.Visible = Ложь; // Скрываем окно на время заполнения
// 5. Открываем временный файл шаблона
Документ = MSWord.Documents.Open(ИмяВременногоФайла);
// Здесь размещается ваш алгоритм поиска и замены параметров в файле
// Пример замены закладки:
// Документ.Bookmarks("ИмяЗакладки").Range.Text = "ЗначениеПараметра";
// 6. Показываем готовый документ пользователю
MSWord.Visible = Истина;
Исключение
// Обработка непредвиденных ошибок при работе с COM
СообщениеОбОшибке = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
ВызватьИсключение "Не удалось сформировать документ Word. Причина: " + СообщениеОбОшибке;
// В случае сбоя закрываем процесс Word, если он успел создаться
Если MSWord <> Неопределено Тогда
MSWord.Quit();
КонецЕсли;
КонецПопытки;
Данный метод полностью избавляет вас от проблем несовместимости архитектур в Конфигураторе, а также значительно повышает стабильность работы печатных форм у конечных пользователей.
Если печать документов должна выполняться в фоновых заданиях или процедурах на стороне сервера 1С:Предприятие (который практически всегда является 64-разрядным), а на сервере установлен 32-битный Office, могут возникать аналогичные ошибки. Для их решения системные администраторы используют следующие настройки:
dcomcnfg) и создают новое COM+ приложение, в которое добавляют компоненты Microsoft Word/Excel. В свойствах приложения на вкладке «Активация» указывают запуск в выделенном процессе (библиотека суррогата dllhost.exe), что позволяет обращаться к 32-битным компонентам из 64-битного сервера 1С.USR1CV8 или аналогичным) для инициализации COM-объектов MS Office требует наличия папок рабочего стола в системном профиле Windows. Необходимо вручную создать следующие пустые каталоги и предоставить к ним полные права учетной записи службы 1С:
C:\Windows\System32\config\systemprofile\DesktopC:\Windows\SysWOW64\config\systemprofile\DesktopТаким образом, мы детально рассмотрели проблему несовместимости разрядностей приложений при работе с макетами типа Active document и изучили все возможные методы ее устранения — от быстрых локальных настроек до полноценного рефакторинга кода конфигурации.