Проблема взаимодействия 64-разрядного сервера 1С с 32-разрядными приложениями Microsoft Office (Word, Excel) является классической в мире системного администрирования и разработки на платформе 1С. Основная причина кроется в архитектурном ограничении операционной системы Windows: 64-битный процесс (каким является сервер 1С rphost.exe) не может напрямую загрузить в свое адресное пространство 32-битные динамические библиотеки (DLL), на которых базируется 32-разрядный Office.
В этой статье мы подробно разберем несколько стратегий решения этой задачи: от системной настройки «мостиков» между процессами до полного отказа от использования COM-объектов в пользу более современных и производительных методов.
Если нам необходимо оставить выполнение кода именно на сервере (например, для регламентных заданий), лучшим решением будет создание «обертки» в службах компонентов Windows. Это позволит запускать 32-битный Office в отдельном контейнере dllhost.exe, с которым 64-битный сервер 1С сможет общаться через межпроцессное взаимодействие.
Разберем этот процесс по шагам:
comexp.msc.Excel_32bit) и установим тип «Серверное приложение».Microsoft Excel Application). Если его нет в списке, придется выбрать регистрацию из файла, указав путь к исполняемому файлу Excel.После этой настройки 64-битный сервер 1С сможет обращаться к COMОбъект("Excel.Application"), и Windows сама перенаправит вызов в созданный 32-битный контейнер.
Часто ошибка инициализации COM-объекта на сервере возникает не только из-за разрядности, но и из-за отсутствия необходимых элементов окружения для профиля пользователя, под которым работает сервер 1С (обычно USR1CV8). Проанализируем, что нужно сделать в реестре и файловой системе.
Работа с реестром:
Для 32-битных приложений на 64-битных системах параметры хранятся в специальной ветке Wow6432Node. Если объект не виден в настройках DCOM, нам необходимо убедиться в наличии соответствующих ключей в HKEY_CLASSES_ROOT\Wow6432Node\CLSID. Мы можем вручную добавить права доступа для пользователя USR1CV8 на соответствующие ветки реестра, чтобы сервер 1С мог «увидеть» библиотеку типов Office.
Создание папок Desktop:
Многие компоненты Office (особенно Excel) требуют наличия папки Desktop в профиле системного пользователя. Без этого COM-объект просто не запустится в фоновом режиме. Нам необходимо создать следующие директории вручную:
C:\Windows\System32\config\systemprofile\DesktopC:\Windows\SysWOW64\config\systemprofile\DesktopПосле создания папок обязательно проверьте, что у пользователя, под которым запущен сервер 1С, есть полные права на эти папки.
Современная платформа 1С позволяет выполнять многие операции с файлами Office без установки самих приложений Microsoft Word или Excel. Рассмотрим пример загрузки данных из Excel с использованием только штатных средств 1С. Этот метод является самым быстрым и стабильным, так как не зависит от стороннего ПО.
Проанализируем пример кода для чтения файла Excel на сервере:
&НаСервере
Процедура ЗагрузитьДанныеИзExcel(ДанныеФайла)
// Получаем двоичные данные из временного хранилища
ДвоичныеДанные = ПолучитьИзВременногоХранилища(ДанныеФайла.Хранение);
// Создаем временный файл с нужным расширением
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
ДвоичныеДанные.Записать(ИмяВременногоФайла);
// Используем штатный объект ТабличныйДокумент для чтения файла
ТабличныйДокумент = Новый ТабличныйДокумент;
Попытка
ТабличныйДокумент.Прочитать(ИмяВременногоФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);
Исключение
Сообщить("Ошибка чтения файла: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// Удаляем временный файл сразу после чтения
УдалитьФайлы(ИмяВременногоФайла);
// Извлекаем данные из таблицы
Для НомерСтроки = 1 По ТабличныйДокумент.ВысотаТаблицы Цикл
ЗначениеКолонки1 = ТабличныйДокумент.Область(НомерСтроки, 1).Текст;
// Обработка данных...
КонецЦикла;
КонецПроцедуры
Этот способ идеально подходит для загрузки прайс-листов или накладных. Мы используем метод Прочитать объекта ТабличныйДокумент, который поддерживает форматы .xls и .xlsx «из коробки».
Если ваша задача — заполнение вордовских шаблонов, рассмотрите возможность работы с файлами .docx как с ZIP-архивами. Формат OpenXML представляет собой набор XML-файлов внутри архива. Разберем логику этого процесса:
.docx (который хранится в базе как двоичные данные).ЧтениеZipФайла для распаковки архива во временную папку.word/document.xml, где хранится основной текст документа.ЧтениеXML заменяем заранее подготовленные метки (например, [НомерДоговора]) на нужные значения.ЗаписьZipФайла.Такой подход полностью исключает необходимость установки Microsoft Office на сервере, работает молниеносно и не потребляет много оперативной памяти.
Как крайний вариант, если права администратора сервера ограничены и переписывать код под XML нет времени, можно перенести работу с COM-объектом на сторону клиента (рабочую станцию пользователя). На клиенте обычно установлен 32-битный Office, и 1С (даже 64-битная) может взаимодействовать с ним без проблем.
Однако помните о минусах:
Выяснив причину несовместимости, мы рекомендуем отдавать предпочтение Решению 3 (штатные средства 1С) для чтения данных и Решению 1 (COM+) для сложной генерации документов, если использование альтернатив невозможно.