При автоматизации бизнес-процессов часто возникает задача загрузки данных из файлов Microsoft Excel. Разработчики 1С нередко сталкиваются с ситуацией, когда код для чтения Excel-файла, прекрасно работающий на клиентском компьютере, наотрез отказывается выполняться на сервере. Как правило, это сопровождается ошибкой «Класс не зарегистрирован» при попытке создать COM-объект Excel.Application.
Давайте разберемся, почему так происходит и какие существуют надежные способы обойти эту проблему (например, универсальная загрузка из Excel "одним нажатием"). Основная причина ошибки заключается в том, что для работы объекта Excel.Application требуется установленный на машине пакет Microsoft Office, а устанавливать офисные приложения на сервер — плохая практика с точки зрения безопасности, лицензирования и потребления ресурсов. Рассмотрим несколько альтернативных и правильных подходов к решению этой задачи.
Это самый распространенный и рекомендуемый способ для чтения данных из Excel-файлов на сервере, обеспечивающий импорт данных из различных форматов (*.xls, *.xlsx, *.csv и др.). Идея заключается в том, чтобы работать с Excel-файлом не как с документом приложения, а как с источником данных, похожим на базу данных. Для этого используется технология ActiveX Data Objects (ADO).
Проанализируем по шагам, что для этого нужно сделать:
rphost.exe). Если у вас 64-битная операционная система, но 32-битный сервер 1С, вам нужно установить 32-битную (x86) версию драйвера. И наоборот..xlsx (Excel 2007 и новее) используется провайдер Microsoft.ACE.OLEDB.12.0 (или 16.0 для более новых версий). Для старых файлов .xls (Excel 97-2003) можно использовать старый провайдер Microsoft.Jet.OLEDB.4.0.Для файла .xlsx она выглядит так:
"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Temp\MyFile.xlsx;Extended Properties=\"Excel 12.0 Xml;HDR=Yes;IMEX=1\";"
Разберем ее ключевые параметры в секции Extended Properties:
Excel 12.0 Xml — указывает на формат современного файла Excel. Для старого формата .xls используется Excel 8.0.HDR=Yes (или No) — очень важный параметр. HDR=Yes означает, что первая строка в вашем файле является строкой заголовков (Header). В этом случае драйвер будет использовать значения из этой строки в качестве имен полей (колонок). Если заголовков нет, укажите HDR=No.IMEX=1 — критически важный параметр для избежания проблем со смешанными типами данных в столбцах. Он указывает драйверу работать в режиме импорта (IMport/EXport) и трактовать все данные в столбцах как текст. Это предотвращает ситуацию, когда числа в столбце читаются корректно, а следующие за ними текстовые значения в том же столбце превращаются в NULL.ADODB.Connection для установки соединения и ADODB.Recordset для выполнения SQL-запроса и получения данных.
Посмотрим на готовый пример кода:
Эта функция принимает полный путь к файлу и возвращает готовую ТаблицуЗначений. Также вы можете использовать этот шаблон простой обработки загрузки из excel в своих проектах.
&НаСервере
Функция ПрочитатьExcelЧерезADO(ПолныйПутьКФайлу)
Перем ТаблицаРезультат;
Попытка
// 1. Создаем COM-объект для подключения к источнику данных
Соединение = Новый COMОбъект("ADODB.Connection");
// 2. Формируем строку подключения
СтрокаПодключения = "Provider=Microsoft.ACE.OLEDB.12.0;"
+ "Data Source=" + ПолныйПутьКФайлу + ";"
+ "Extended Properties=""Excel 12.0 Xml;HDR=Yes;IMEX=1"";";
// 3. Открываем соединение
Соединение.Open(СтрокаПодключения);
// 4. Формируем текст SQL-запроса для чтения данных с листа
// Обратите внимание: имя листа должно быть заключено в квадратные скобки,
// а в конце должен стоять знак доллара '$'
ИмяЛиста = "Лист1"; // Замените на имя вашего листа
ТекстЗапроса = "SELECT * FROM [" + ИмяЛиста + "$]";
// 5. Создаем COM-объект для хранения результата запроса
НаборЗаписей = Новый COMОбъект("ADODB.Recordset");
НаборЗаписей.Open(ТекстЗапроса, Соединение);
// 6. Создаем таблицу значений для загрузки данных в 1С
ТаблицаРезультат = Новый ТаблицаЗначений;
// 7. Динамически создаем колонки в таблице на основе заголовков из Excel
Для ИндексКолонки = 0 По НаборЗаписей.Fields.Count - 1 Цикл
ИмяКолонки = НаборЗаписей.Fields(ИндексКолонки).Name;
ТаблицаРезультат.Колонки.Добавить(ИмяКолонки);
КонецЦикла;
// 8. Перебираем все строки из набора записей и заполняем таблицу 1С
Пока НЕ НаборЗаписей.EOF() Цикл
НоваяСтрока = ТаблицаРезультат.Добавить();
Для ИндексКолонки = 0 По ТаблицаРезультат.Колонки.Количество() - 1 Цикл
НоваяСтрока[ИндексКолонки] = НаборЗаписей.Fields(ИндексКолонки).Value;
КонецЦикла;
// Переходим к следующей записи
НаборЗаписей.MoveNext();
КонецЦикла;
Исключение
Сообщить("Произошла ошибка при чтении файла Excel: " + ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
// 9. Обязательно закрываем соединение и освобождаем объекты
Если НаборЗаписей <> Неопределено Тогда
Если НаборЗаписей.State = 1 Тогда // 1 - adStateOpen
НаборЗаписей.Close();
КонецЕсли;
НаборЗаписей = Неопределено;
КонецЕсли;
Если Соединение <> Неопределено Тогда
Если Соединение.State = 1 Тогда // 1 - adStateOpen
Соединение.Close();
КонецЕсли;
Соединение = Неопределено;
КонецЕсли;
Возврат ТаблицаРезультат;
КонецФункции
Для более сложных задач, когда нужно не просто прочитать данные, а, например, работать с форматированием, формулами и картинками, возможностей ADO может не хватить. В этом случае на помощь приходят внешние компоненты — специализированные библиотеки, расширяющие функциональность 1С.
Можно выделить два основных типа таких компонент:
.dll), которые напрямую взаимодействуют с платформой 1С. Они могут быть как платными, так и бесплатными. Их преимущество — скорость, недостаток — их нужно найти, установить и зарегистрировать в системе.Этот путь сложнее в реализации, но незаменим для нетривиальных задач обработки Excel-документов.
Иногда самое простое решение — самое эффективное. Этот подход заключается в том, чтобы вообще избежать обработки сложного бинарного формата .xlsx на сервере.
Рассмотрим логику этого метода:
.csv файл передается на сервер 1С (например, через стандартный диалог выбора файла).СтрРазделить().Преимущества:
Недостатки:
В заключение, для большинства стандартных задач по загрузке данных из Excel на сервере метод с использованием ADO является "золотым стандартом". Он сочетает в себе простоту настройки и достаточную функциональность. Если же вам нужен полный контроль над документом, стоит изучить возможности внешних компонент. А для самых простых и контролируемых процессов импорта не стоит забывать о надежном методе с предварительной конвертацией в CSV.