При разработке и сопровождении печатных форм или обработок в среде «1С:Предприятие» разработчики нередко используют макеты типа ActiveDocument. Однако в некоторых случаях при попытке загрузить файл Excel в конфигураторе появляется сообщение «неизвестный формат файла», а уже существующие макеты при попытке открытия выдают системное предупреждение: «Не удалось создать объект. Возможно, отсутствует соответствующее приложение». Разберем детально, почему это происходит и как исправить ошибку.
Проанализируем технические особенности работы макетов ActiveDocument в платформе «1С:Предприятие»:
.xls представляет собой составной файл структурированного хранилища OLE (Structured Storage). Формат .xlsx является OpenXML-контейнером (архивом ZIP с XML-документами внутри). Если в операционной системе повреждены или не сопоставлены OLE-провайдеры для работы с OpenXML, платформа пытается прочитать ZIP-архив как классическое OLE-хранилище и сообщает, что формат файла неизвестен.HKEY_CLASSES_ROOT, из-за чего сторонние контейнеры не могут взаимодействовать с приложением в режиме визуального внедрения.Если проблему необходимо устранить быстро, не вмешиваясь в настройки операционной системы рабочих станций и серверов, рассмотрим программный обход. Вместо прямого вызова внедренного документа методом Макет.Получить() мы можем сохранить макет на диск во временный файл и передать управление COM-серверу Excel.Application.
Посмотрим на пример практической реализации данного подхода:
МакетEXCEL = ПолучитьМакет("Макет");
ПолноеИмяФайлаДокумента = ПолучитьИмяВременногоФайла("xls");
// Записываем внедренный макет во временный каталог на диске
МакетEXCEL.Записать(ПолноеИмяФайлаДокумента);
Попытка
Эксель = Новый COMОбъект("Excel.Application");
Исключение
Сообщить("Не удалось запустить Excel: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// Открываем сохраненный файл как отдельную книгу
MSExcel = Эксель.WorkBooks.Open(ПолноеИмяФайлаДокумента);
Эксель.Visible = Истина;
Разберем по шагам, почему этот вариант работает даже тогда, когда макет выдает ошибку внедрения:
Записать() объекта макета выгружает исходные двоичные данные файла напрямую в файловую систему, не инициализируя визуальный OLE-контейнер внутри 1С.Новый COMОбъект("Excel.Application") запускает Microsoft Excel как независимый внешний процесс, что обходит ограничения адресного пространства внутри 1С.Если требуется восстановить штатную работу конфигуратора и открывать макеты непосредственно внутри окон 1С, выполним системные настройки:
"C:\Program Files\Microsoft Office\root\Office16\EXCEL.EXE" /regserver
/regserver перезаписывает все необходимые ключи OLE и ProgID в системном реестре.Технология ActiveDocument считается устаревающей и платформозависимой (она полностью неработоспособна на клиентах под управлением Linux, macOS и в веб-клиенте). Рассмотрим более современные и надежные альтернативы:
ПолучитьМакет(), сбрасывается во временный файл и открывается внешними библиотеками или COM-сервером. Это гарантирует отсутствие конфликтов внутри Конфигуратора.ТабличныйДокумент и загрузить данные туда, либо прочитать готовый файл прямо из кода, используя метод ТабличныйДокумент.Прочитать(ИмяФайла). Данный метод не требует установленного Microsoft Excel на рабочем месте пользователя и работает кроссплатформенно.