Переход на новые версии платформы «1С:Предприятие» — это стандартная процедура обслуживания информационной системы, которая, однако, может преподнести неприятные сюрпризы. Довольно распространенной является ситуация, когда после обновления (например, при переходе с ветки 8.3.12 на 8.3.14 и выше) внезапно перестает работать привычный импорт данных из файлов Excel. Ситуация усложняется, если код используемой обработки закрыт разработчиком (засекречен), и мы не можем внести изменения непосредственно в алгоритм загрузки.
В этой статье мы подробно разберем, почему ломается интеграция с Excel через механизм COM-соединения, проанализируем неочевидные системные факторы и настроим окружение Windows и платформы 1С так, чтобы восстановить работоспособность обработки без изменения ее исходного кода.
Давайте детально рассмотрим наиболее частую причину сбоя. При переходе на новые релизы платформы (особенно начиная с версии 8.3.14) фирма «1С» изменила подход к установке клиентских приложений. В дистрибутивах по умолчанию стал предлагаться 64-разрядный клиент.
Даже если системный администратор или пользователь уверены, что «разрядность осталась прежней», программа установки могла автоматически развернуть 64-битный тонкий или толстый клиент 1С. В то же время на рабочих местах пользователей чаще всего установлен стандартный 32-битный пакет Microsoft Office.
Суть проблемы: Процесс 1С, запущенный в 64-битной архитектуре, физически не может напрямую инициализировать внутри своего адресного пространства 32-битный COM-сервер Microsoft Excel. При попытке вызова конструктора Новый COMОбъект("Excel.Application") операционная система возвращает ошибку «Класс не зарегистрирован» или «Недопустимая строка с указанием класса».
Выясним архитектурное соответствие по шагам:
x86_64, значит, запущен 64-битный клиент. Обозначение x86 указывает на 32-битный клиент.Решение проблемы: Если мы обнаружили несовпадение разрядностей, у нас есть два пути решения:
При обновлении платформы файлы новой версии записываются в новую директорию на диске (например, C:\Program Files\1cv8\8.3.14.1976\bin\). При этом старые связи в системном реестре Windows могут перезаписаться некорректно или вовсе не обновиться. Особенно это касается компоненты COM-соединения comcntr.dll.
Проанализируем ситуацию: если загрузка из Excel обращается к внешнему COM-соединению для обмена данными или сама обработка использует сопутствующие библиотеки 1С, отсутствие актуальной регистрации компоненты заблокирует выполнение кода.
Для исправления этой проблемы произведем принудительную перерегистрацию библиотеки в операционной системе под правами администратора:
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С и проверим работу загрузки.
Если наша информационная база работает в клиент-серверном варианте, а код загрузки выполняется на стороне сервера (например, в фоновом задании или под директивой &НаСервере), то запуск Microsoft Excel происходит от имени технической учетной записи, под которой стартует служба «Агента сервера 1С» (обычно это USR1CV8).
Суть проблемы: Для успешной инициализации COM-объекта Excel операционной системе Windows требуются физические папки рабочего стола (Desktop) в профиле системного пользователя. Если этих папок нет (а после обновления ОС или самой платформы профили службы могли быть сброшены), Excel завершает работу с критической ошибкой при попытке открыть файл.
Разберем, как решить эту проблему созданием системных каталогов:
Desktop:Для 64-битных систем Windows Server создаем две папки:
C:\Windows\System32\config\systemprofile\DesktopC:\Windows\SysWOW64\config\systemprofile\DesktopДля 32-битных систем создаем одну папку:
C:\Windows\System32\config\systemprofile\DesktopВажно: После создания папок необходимо предоставить полные права доступа (Чтение и Запись) для учетной записи, от имени которой запущена служба сервера 1С (например, пользователю USR1CV8 или LocalSystem).
Иногда операционная система Windows блокирует запуск Excel в фоновом режиме по соображениям безопасности. Это контролируется службой компонентов DCOM.
Рассмотрим по шагам процесс настройки разрешений DCOM для Excel:
dcomcnfg и нажмем Enter.
mmc comexp.msc /32
USR1CV8) и предоставим ей все права.Платформа 1С версии 8.3.14 принесла значительные изменения в механизмы безопасности. Если внешняя обработка загрузки данных добавлена в справочник «Дополнительные отчеты и обработки» и база работает под управлением современных конфигураций (например, БГУ или БП), то по умолчанию внешние обработки запускаются в так называемом Безопасном режиме.
В безопасном режиме платформы выполнение метода Новый COMОбъект категорически запрещено на уровне ядра 1С. Система моментально прерывает выполнение кода безопасности ради защиты от вредоносного ПО.
Посмотрим, как отключить данное ограничение:
Хотя в рассматриваемой ситуации код обработки засекречен разработчиком, мы должны понимать, почему технология COM постепенно уходит в прошлое. Использование Excel.Application требует обязательной установки Microsoft Office на каждом рабочем компьютере или сервере, работает исключительно под операционной системой Windows и часто приводит к зависанию процессов EXCEL.EXE в памяти устройства.
Если у вас появится возможность связаться с разработчиками или заменить обработку, рассмотрите современную и стабильную альтернативу — чтение файлов силами самой платформы 1С с помощью объекта ТабличныйДокумент.
Проанализируем пример кода, который работает на любой операционной системе (включая Linux), не требует установленного Microsoft Excel и выполняется в разы быстрее:
&НаСервере
Функция ПрочитатьФайлExcelНаСервере(ПутьКФайлу) Экспорт
ТабДок = Новый ТабличныйДокумент;
Попытка
// Чтение файла формата XLSX или XLS напрямую платформой
ТабДок.Прочитать(ПутьКФайлу, СпособЧтенияТабличногоДокумента.XLSX);
Исключение
ЗаписатьЛогОшибки(ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
// Дальнейший обход строк и колонок табличного документа
Для СтрокаНом = 1 По ТабДок.ВысотаТаблицы Цикл
ЗначениеЯчейки = ТабДок.Область(СтрокаНом, 1).Текст;
// Обработка полученных данных...
КонецЦикла;
Возврат Истина;
КонецФункции
Использование метода Прочитать() объекта ТабличныйДокумент полностью решает проблемы несовместимости разрядностей, регистрации библиотек и настройки прав DCOM, обеспечивая надежную работу системы в любых условиях.