При автоматизации бизнес-процессов разработчики часто сталкиваются с ситуацией, когда на рабочем месте пользователя установлены программы разной разрядности. Например, платформа 1С:Предприятие имеет разрядность x32 (32-бит), а пакет Microsoft Office Excel — x64 (64-бит), или наоборот. При попытке запустить код, использующий технологию OLE/COM для интеграции с Excel, система выдает ошибку: Произошла исключительная ситуация (ASAx.Application): Класс не зарегистрирован или Не удалось создать COM-объект.
В этой статье мы подробно рассмотрим, почему возникает эта проблема, разберем несколько вариантов её решения (от простых организационных до глубоких технических настроек операционной системы Windows), а также изучим современные альтернативные способы работы с файлами Excel, которые вообще не требуют использования COM-технологий.
Выясним причину конфликта. Проблема кроется в механизмах Windows. 32-битное приложение (в данном случае 1С) ищет ключи зарегистрированных COM-объектов в ветке реестра HKEY_CLASSES_ROOT\Wow6432Node\CLSID, в то время как 64-битный Excel регистрирует свои интерфейсы в стандартной 64-битной ветке HKEY_CLASSES_ROOT\CLSID. Из-за этой изоляции прямое создание объекта через привычный конструктор Новый COMОбъект("Excel.Application") становится невозможным.
---
Рассмотрим самый простой практический способ, предложенный участниками форума, который не требует изменения кода обработок или переустановки пакета Microsoft Office. Операционная система Windows позволяет устанавливать и использовать на одном компьютере одновременно несколько версий и разрядностей платформы 1С:Предприятие.
Часто бухгалтеры или другие специалисты не могут полностью перейти на 64-битную платформу 1С из-за внешних ограничений — например, из-за конфликтов со сторонними компонентами сдачи электронной отчетности (такими как СБИС, Контур или ЕГАИС), которые жестко привязаны к 32-битной архитектуре. В этом случае мы можем настроить рабочее место следующим образом:
Таким образом, создав на рабочем столе два ярлыка запуска с разными параметрами разрядности, мы полностью решаем проблему совместимости без переустановки офисного пакета.
---
Если вам необходимо, чтобы 32-битная платформа 1С без проблем общалась с 64-битным Excel напрямую через COM-соединение, мы можем настроить операционную систему так, чтобы она выступала посредником и корректно перенаправляла запросы. Разберем этот процесс по шагам.
Шаг 1. Регистрация идентификатора AppID в системном реестре
Нам необходимо связать исполняемый файл 64-битного Excel с его уникальным GUID в реестре для 32-битного окружения:
Win + R, введите regedit и нажмите Enter для запуска Редактора реестра.HKEY_CLASSES_ROOT\AppID.EXCEL.EXE.AppID.{00020812-0000-0000-C000-000000000046}.Шаг 2. Настройка служб компонентов (DCOM)
Теперь настроим параметры безопасности и учетную запись запуска для приложения Excel:
Win + R и выполните команду:
mmc comexp.msc /32USR1CV8), предоставив ему полные права.Шаг 3. Создание системных папок Desktop (Критически важный шаг!)
При межразрядном взаимодействии через COM-интерфейс Windows часто перенаправляет запросы в профиль системной службы. Если Excel не обнаружит папок рабочего стола в системном профиле, он просто аварийно завершится без вывода ошибок. Чтобы этого избежать, обязательно создайте вручную две папки на диске:
C:\Windows\SysWOW64\config\systemprofile\DesktopC:\Windows\System32\config\systemprofile\DesktopПосле выполнения этих настроек перезагрузите компьютер. Теперь связка Новый COMОбъект("Excel.Application") будет успешно отрабатывать в 32-битном приложении 1С.
---
Использование COM-соединений для работы с офисными файлами постепенно уходит в прошлое. Сама корпорация Microsoft официально не рекомендует использовать автоматизацию пакета MS Office на стороне серверов или в фоновых заданиях из-за проблем со стабильностью, скоростью работы и утечками памяти.
Современные версии платформы 1С:Предприятие 8.3 обладают мощным встроенным функционалом, который позволяет читать, анализировать и записывать файлы форматов XLS и XLSX напрямую, без установленного MS Excel на компьютере. Это полностью снимает проблему разрядности и отлично работает как под управлением Windows, так и на Linux-серверах.
Рассмотрим пример кода, в котором мы загружаем файл Excel в объект ТабличныйДокумент и обходим его ячейки:
&НаСервере
Процедура ПрочитатьФайлExcelНативно(ПутьКФайлу)
ТабДок = Новый ТабличныйДокумент;
Попытка
// Чтение файла выполняется платформой самостоятельно
ТабДок.Прочитать(ПутьКФайлу);
Исключение
ВызватьИсключение "Не удалось прочитать файл! Ошибка: " + ОписаниеОшибки();
КонецПопытки;
КоличествоСтрок = ТабДок.ВысотаТаблицы;
КоличествоКолонок = ТабДок.ШиринаТаблицы;
// Обходим строки табличного документа
Для НомерСтроки = 1 По КоличествоСтрок Цикл
// Получаем значение из первой колонки
ЗначениеКолонки1 = ТабДок.Область(НомерСтроки, 1).Текст;
// Получаем значение из второй колонки
ЗначениеКолонки2 = ТабДок.Область(НомерСтроки, 2).Текст;
// Здесь выполняем обработку полученных данных...
КонецЦикла;
КонецПроцедуры
Если структура файла Excel представляет собой классическую "плоскую" таблицу (где первая строка содержит заголовки, а последующие — данные), мы можем мгновенно загрузить её в готовую ТаблицуЗначений в обход построчного чтения:
&НаСервере
Функция ЗагрузитьExcelВТаблицуЗначений(ПутьКФайлу)
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ПутьКФайлу);
// Используем ПостроительЗапроса для автоматического анализа областей таблицы
Построитель = Новый ПостроительЗапроса;
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабДок.Область());
Построитель.ЗаполнитьНастройки();
Построитель.Выполнить();
// Результат выгружаем в стандартную Таблицу Значений
Возврат Построитель.Результат.Выгрузить();
КонецФункции
Для создания отчетов в формате Excel нам также не требуется COM. Мы можем программно сформировать табличный документ в 1С и сохранить его в нужном формате одной строчкой кода:
&НаСервере
Процедура ВыгрузитьДанныеВExcel(ПутьКФайлу)
ТабДок = Новый ТабличныйДокумент;
// Заполняем макет или ячейки табличного документа программно
ОбластьЯчейки = ТабДок.Область(1, 1);
ОбластьЯчейки.Текст = "Отчет по продажам";
ОбластьЯчейки.Шрифт = Новый Шрифт(,,Истина); // Жирный шрифт
ТабДок.Область(2, 1).Текст = "Товар";
ТабДок.Область(2, 2).Текст = "Количество";
// Записываем файл на диск в формате XLSX
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);
КонецПроцедуры
---
Если нативная работа с ТабличныйДокумент вам не подходит по причине сложного форматирования исходных файлов, рассмотрите еще два альтернативных варианта:
Microsoft.ACE.OLEDB.12.0). Это работает в разы быстрее классического COM-соединения, однако на компьютер потребуется установить драйвер Microsoft Access Database Engine соответствующей разрядности.Новый COMОбъект("Excel.Application") на работу с китайским офисным аналогом: Новый COMОбъект("KET.Application"). Данный пакет часто более лоялен к разрядностям операционной системы при вызовах из 32-битных приложений.Мы проанализировали различные варианты решения проблемы несовместимости разрядностей 1С и Excel. Для быстрого исправления ситуации "здесь и сейчас" отлично подойдет вариант с параллельной установкой платформ 1С или настройка DCOM. Однако в качестве долгосрочной стратегии развития систем автоматизации настоятельно рекомендуем переводить все обработки на нативное чтение файлов силами платформы 1С — это гарантирует стабильную работу вашей конфигурации в любых инфраструктурных условиях.