Как подружить 64-разрядный сервер 1С и 32-разрядный Microsoft Office?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Проблема взаимодействия 64-разрядного сервера 1С с 32-разрядными приложениями Microsoft Office (Word, Excel) является классической в мире системного администрирования и разработки на платформе 1С. Основная причина кроется в архитектурном ограничении операционной системы Windows: 64-битный процесс (каким является сервер 1С rphost.exe) не может напрямую загрузить в свое адресное пространство 32-битные динамические библиотеки (DLL), на которых базируется 32-разрядный Office.

В этой статье мы подробно разберем несколько стратегий решения этой задачи: от системной настройки «мостиков» между процессами до полного отказа от использования COM-объектов в пользу более современных и производительных методов.

Решение 1. Использование механизма COM+ (наиболее надежный серверный метод)

Если нам необходимо оставить выполнение кода именно на сервере (например, для регламентных заданий), лучшим решением будет создание «обертки» в службах компонентов Windows. Это позволит запускать 32-битный Office в отдельном контейнере dllhost.exe, с которым 64-битный сервер 1С сможет общаться через межпроцессное взаимодействие.

Разберем этот процесс по шагам:

  1. Откроем консоль «Службы компонентов» (Component Services) через Панель управления или выполнив команду comexp.msc.
  2. Перейдем в ветку «Компьютеры» — «Мой компьютер» — «Приложения COM+».
  3. Создадим новое приложение: правой кнопкой мыши «Создать» — «Приложение». В мастере выберем «Создать новое приложение», дадим ему понятное имя (например, Excel_32bit) и установим тип «Серверное приложение».
  4. Важный момент: На вкладке «Удостоверение» (Identity) необходимо указать пользователя, от имени которого будет запускаться Office. Рекомендуется использовать специально созданную учетную запись с правами администратора на локальном сервере, чтобы избежать проблем с доступом к принтерам или временным папкам.
  5. В созданном приложении откроем папку «Компоненты» и добавим туда нужный объект (например, Microsoft Excel Application). Если его нет в списке, придется выбрать регистрацию из файла, указав путь к исполняемому файлу Excel.

После этой настройки 64-битный сервер 1С сможет обращаться к COMОбъект("Excel.Application"), и Windows сама перенаправит вызов в созданный 32-битный контейнер.

Решение 2. Исправление реестра и создание системных папок

Часто ошибка инициализации COM-объекта на сервере возникает не только из-за разрядности, но и из-за отсутствия необходимых элементов окружения для профиля пользователя, под которым работает сервер 1С (обычно USR1CV8). Проанализируем, что нужно сделать в реестре и файловой системе.

Работа с реестром:

Для 32-битных приложений на 64-битных системах параметры хранятся в специальной ветке Wow6432Node. Если объект не виден в настройках DCOM, нам необходимо убедиться в наличии соответствующих ключей в HKEY_CLASSES_ROOT\Wow6432Node\CLSID. Мы можем вручную добавить права доступа для пользователя USR1CV8 на соответствующие ветки реестра, чтобы сервер 1С мог «увидеть» библиотеку типов Office.

Создание папок Desktop:

Многие компоненты Office (особенно Excel) требуют наличия папки Desktop в профиле системного пользователя. Без этого COM-объект просто не запустится в фоновом режиме. Нам необходимо создать следующие директории вручную:

После создания папок обязательно проверьте, что у пользователя, под которым запущен сервер 1С, есть полные права на эти папки.

Решение 3. Отказ от использования Office на сервере (Native 1C)

Современная платформа 1С позволяет выполнять многие операции с файлами Office без установки самих приложений Microsoft Word или Excel. Рассмотрим пример загрузки данных из Excel с использованием только штатных средств 1С. Этот метод является самым быстрым и стабильным, так как не зависит от стороннего ПО.

Проанализируем пример кода для чтения файла Excel на сервере:


&НаСервере
Процедура ЗагрузитьДанныеИзExcel(ДанныеФайла)
    // Получаем двоичные данные из временного хранилища
    ДвоичныеДанные = ПолучитьИзВременногоХранилища(ДанныеФайла.Хранение);
    
    // Создаем временный файл с нужным расширением
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
    ДвоичныеДанные.Записать(ИмяВременногоФайла);
    
    // Используем штатный объект ТабличныйДокумент для чтения файла
    ТабличныйДокумент = Новый ТабличныйДокумент;
    Попытка
        ТабличныйДокумент.Прочитать(ИмяВременногоФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);
    Исключение
        Сообщить("Ошибка чтения файла: " + ОписаниеОшибки());
        Возврат;
    КонецПопытки;
    
    // Удаляем временный файл сразу после чтения
    УдалитьФайлы(ИмяВременногоФайла);
    
    // Извлекаем данные из таблицы
    Для НомерСтроки = 1 По ТабличныйДокумент.ВысотаТаблицы Цикл
        ЗначениеКолонки1 = ТабличныйДокумент.Область(НомерСтроки, 1).Текст;
        // Обработка данных...
    КонецЦикла;
КонецПроцедуры

Этот способ идеально подходит для загрузки прайс-листов или накладных. Мы используем метод Прочитать объекта ТабличныйДокумент, который поддерживает форматы .xls и .xlsx «из коробки».

Решение 4. Прямая генерация документов (OpenXML)

Если ваша задача — заполнение вордовских шаблонов, рассмотрите возможность работы с файлами .docx как с ZIP-архивами. Формат OpenXML представляет собой набор XML-файлов внутри архива. Разберем логику этого процесса:

  1. Загружаем шаблон .docx (который хранится в базе как двоичные данные).
  2. Используем объект ЧтениеZipФайла для распаковки архива во временную папку.
  3. Находим файл word/document.xml, где хранится основной текст документа.
  4. С помощью текстовых функций или объекта ЧтениеXML заменяем заранее подготовленные метки (например, [НомерДоговора]) на нужные значения.
  5. Собираем архив обратно с помощью ЗаписьZipФайла.

Такой подход полностью исключает необходимость установки Microsoft Office на сервере, работает молниеносно и не потребляет много оперативной памяти.

Решение 5. Перенос выполнения на клиента

Как крайний вариант, если права администратора сервера ограничены и переписывать код под XML нет времени, можно перенести работу с COM-объектом на сторону клиента (рабочую станцию пользователя). На клиенте обычно установлен 32-битный Office, и 1С (даже 64-битная) может взаимодействовать с ним без проблем.

Однако помните о минусах:

Выяснив причину несовместимости, мы рекомендуем отдавать предпочтение Решению 3 (штатные средства 1С) для чтения данных и Решению 1 (COM+) для сложной генерации документов, если использование альтернатив невозможно.

← На главную