Почему после обновления платформы 1С перестала работать загрузка из Excel и как это исправить?

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

Переход на новые версии платформы «1С:Предприятие» — это стандартная процедура обслуживания информационной системы, которая, однако, может преподнести неприятные сюрпризы. Довольно распространенной является ситуация, когда после обновления (например, при переходе с ветки 8.3.12 на 8.3.14 и выше) внезапно перестает работать привычный импорт данных из файлов Excel. Ситуация усложняется, если код используемой обработки закрыт разработчиком (засекречен), и мы не можем внести изменения непосредственно в алгоритм загрузки.

В этой статье мы подробно разберем, почему ломается интеграция с Excel через механизм COM-соединения, проанализируем неочевидные системные факторы и настроим окружение Windows и платформы 1С так, чтобы восстановить работоспособность обработки без изменения ее исходного кода.

Причина 1: Конфликт разрядности (32-бит против 64-бит)

Давайте детально рассмотрим наиболее частую причину сбоя. При переходе на новые релизы платформы (особенно начиная с версии 8.3.14) фирма «1С» изменила подход к установке клиентских приложений. В дистрибутивах по умолчанию стал предлагаться 64-разрядный клиент.

Даже если системный администратор или пользователь уверены, что «разрядность осталась прежней», программа установки могла автоматически развернуть 64-битный тонкий или толстый клиент 1С. В то же время на рабочих местах пользователей чаще всего установлен стандартный 32-битный пакет Microsoft Office.

Суть проблемы: Процесс 1С, запущенный в 64-битной архитектуре, физически не может напрямую инициализировать внутри своего адресного пространства 32-битный COM-сервер Microsoft Excel. При попытке вызова конструктора Новый COMОбъект("Excel.Application") операционная система возвращает ошибку «Класс не зарегистрирован» или «Недопустимая строка с указанием класса».

Выясним архитектурное соответствие по шагам:

  1. Откроем запущенное приложение 1С и перейдем в меню Справка — О программе.
  2. Внимательно изучим строку с описанием приложения. Если мы видим там обозначение x86_64, значит, запущен 64-битный клиент. Обозначение x86 указывает на 32-битный клиент.
  3. Аналогично проверим разрядность Excel. Откроем Excel, перейдем в меню Файл — Учетная запись — О программе Excel. Там будет четко указано «32-разрядная» или «64-разрядная».

Решение проблемы: Если мы обнаружили несовпадение разрядностей, у нас есть два пути решения:

Причина 2: Сбой регистрации библиотеки comcntr.dll и COM-объектов

При обновлении платформы файлы новой версии записываются в новую директорию на диске (например, C:\Program Files\1cv8\8.3.14.1976\bin\). При этом старые связи в системном реестре Windows могут перезаписаться некорректно или вовсе не обновиться. Особенно это касается компоненты COM-соединения comcntr.dll.

Проанализируем ситуацию: если загрузка из Excel обращается к внешнему COM-соединению для обмена данными или сама обработка использует сопутствующие библиотеки 1С, отсутствие актуальной регистрации компоненты заблокирует выполнение кода.

Для исправления этой проблемы произведем принудительную перерегистрацию библиотеки в операционной системе под правами администратора:

  1. Закроем все запущенные сеансы «1С:Предприятие».
  2. Запустим командную строку Windows (cmd) обязательно с правами Администратора.
  3. Выполним команду регистрации для нужной разрядности платформы. Например, для 64-битной платформы команда будет выглядеть так:

regsvr32 "C:\Program Files\1cv8\8.3.14.1976\bin\comcntr.dll"

Для 32-битной платформы путь будет вести в каталог Program Files (x86):

regsvr32 "C:\Program Files (x86)\1cv8\8.3.14.1976\bin\comcntr.dll"

После успешного выполнения команды система выдаст уведомление об успешной регистрации библиотеки. Перезапустим 1С и проверим работу загрузки.

Причина 3: Запуск на сервере и отсутствие папок профиля Desktop

Если наша информационная база работает в клиент-серверном варианте, а код загрузки выполняется на стороне сервера (например, в фоновом задании или под директивой &НаСервере), то запуск Microsoft Excel происходит от имени технической учетной записи, под которой стартует служба «Агента сервера 1С» (обычно это USR1CV8).

Суть проблемы: Для успешной инициализации COM-объекта Excel операционной системе Windows требуются физические папки рабочего стола (Desktop) в профиле системного пользователя. Если этих папок нет (а после обновления ОС или самой платформы профили службы могли быть сброшены), Excel завершает работу с критической ошибкой при попытке открыть файл.

Разберем, как решить эту проблему созданием системных каталогов:

  1. Откроем проводник на сервере, где функционирует служба 1С.
  2. В зависимости от разрядности операционной системы перейдем по путям и вручную создадим пустую папку с именем Desktop:

Для 64-битных систем Windows Server создаем две папки:

Для 32-битных систем создаем одну папку:

Важно: После создания папок необходимо предоставить полные права доступа (Чтение и Запись) для учетной записи, от имени которой запущена служба сервера 1С (например, пользователю USR1CV8 или LocalSystem).

Причина 4: Сброс настроек безопасности DCOM для Microsoft Excel

Иногда операционная система Windows блокирует запуск Excel в фоновом режиме по соображениям безопасности. Это контролируется службой компонентов DCOM.

Рассмотрим по шагам процесс настройки разрешений DCOM для Excel:

  1. Нажмем сочетание клавиш Win + R, введем команду dcomcnfg и нажмем Enter.
  2. В открывшемся окне перейдем по дереву: Службы компонентов — Компьютеры — Мой компьютер — Настройка DCOM.
  3. Найдем в списке элемент Microsoft Excel Application (или его программный идентификатор).
  4. Если вы используете 64-битную Windows и 32-битный Office, этого элемента в стандартном списке может не быть. В таком случае запустите утилиту настройки DCOM специальной командой через «Выполнить»:

mmc comexp.msc /32

  1. Кликнем правой кнопкой мыши по Microsoft Excel Application и выберем Свойства.
  2. На вкладке Удостоверение (Identity) переключим настройку с положения «Запускающий пользователь» на «Текущий пользователь». Это позволит запускать Excel в контексте активного сеанса.
  3. На вкладке Безопасность (Security) в разделах «Разрешения на запуск и активацию» выберем пункт «Настроить», добавим учетную запись службы сервера 1С (например, USR1CV8) и предоставим ей все права.

Причина 5: Ограничения безопасного режима в 1С 8.3.14

Платформа 1С версии 8.3.14 принесла значительные изменения в механизмы безопасности. Если внешняя обработка загрузки данных добавлена в справочник «Дополнительные отчеты и обработки» и база работает под управлением современных конфигураций (например, БГУ или БП), то по умолчанию внешние обработки запускаются в так называемом Безопасном режиме.

В безопасном режиме платформы выполнение метода Новый COMОбъект категорически запрещено на уровне ядра 1С. Система моментально прерывает выполнение кода безопасности ради защиты от вредоносного ПО.

Посмотрим, как отключить данное ограничение:

  1. Зайдем в информационную базу под правами Администратора.
  2. Перейдем в раздел Администрирование — Печатные формы, отчеты и обработки — Дополнительные отчеты и обработки.
  3. Найдем нашу обработку по загрузке из Excel и откроем ее карточку.
  4. Найдем переключатель или флаг Безопасный режим и переведем его в положение Выключен (или укажем режим работы «Небезопасный»).
  5. Запишем изменения и повторим попытку загрузки файла.

Перспективное решение: Отказ от COM-соединения

Хотя в рассматриваемой ситуации код обработки засекречен разработчиком, мы должны понимать, почему технология COM постепенно уходит в прошлое. Использование Excel.Application требует обязательной установки Microsoft Office на каждом рабочем компьютере или сервере, работает исключительно под операционной системой Windows и часто приводит к зависанию процессов EXCEL.EXE в памяти устройства.

Если у вас появится возможность связаться с разработчиками или заменить обработку, рассмотрите современную и стабильную альтернативу — чтение файлов силами самой платформы 1С с помощью объекта ТабличныйДокумент.

Проанализируем пример кода, который работает на любой операционной системе (включая Linux), не требует установленного Microsoft Excel и выполняется в разы быстрее:


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

Использование метода Прочитать() объекта ТабличныйДокумент полностью решает проблемы несовместимости разрядностей, регистрации библиотек и настройки прав DCOM, обеспечивая надежную работу системы в любых условиях.

← На главную