При стандартной интеграции 1С 7.7 с электронными таблицами разработчики чаще всего используют COM-объект Microsoft Excel через вызов СоздатьОбъект("Excel.Application"). Однако на терминальных серверах, рабочих станциях без офисного пакета или при политике минимизации лицензий данный способ вызывает критическую ошибку выполнения, так как соответствующий OLE-сервер не зарегистрирован в операционной системе.
Рассмотрим несколько надежных и проверенных способов прочитать данные из файла Excel в платформе 1С:Предприятие 7.7 без развертывания пакета Microsoft Office.
Библиотека «Йоксель» является одним из самых популярных решений в среде 1С 7.7. Она позволяет напрямую работать с файлами электронных таблиц, открывать их как табличные документы и быстро преобразовывать содержимое в штатную таблицу значений.
Разберем по шагам типовой алгоритм загрузки таблицы Excel с помощью объектов Йокселя:
ТабличныйДокумент.2 соответствует формату Excel).Йоксель.КонвертерВТаблицуЗначений, передаем ему открытый документ и считываем данные в объект ТаблицаЗначений.Посмотрим на практический пример кода:
ВыбТипФайла = 2; // Формат Excel
ВыбСжиматьКартинки = 1;
Таб = СоздатьОбъект("ТабличныйДокумент");
Попытка
Таб.Открыть(ФайлДанных, ВыбТипФайла, ВыбСжиматьКартинки);
Исключение
Сообщить("Ошибка открытия файла: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
ТЗ = СоздатьОбъект("ТаблицаЗначений");
Конвертер = СоздатьОбъект("Йоксель.КонвертерВТаблицуЗначений");
Конвертер.УстановитьДокумент(Таб);
Конвертер.ОпределятьСтруктуру = 0;
Конвертер.ПроверятьСтруктуру = 0;
Конвертер.СтрокДляОпределенияСтруктуры = 50;
Попытка
ТЗ = Конвертер.Загрузить();
Исключение
Сообщить("Ошибка конвертации данных: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
После выполнения данного кода в переменной ТЗ находится полностью готовая таблица значений, строки и колонки которой можно обойти стандартными методами платформы.
Файл книги Excel можно рассматривать как реляционный источник данных и обращаться к его листам с помощью стандартных SQL-запросов через технологию ADO. Для этого не требуется сам Excel, но необходимы системные драйверы OLE DB или ODBC.
Проанализируем ключевые технические нюансы работы с ADO в среде 1С 7.7:
.xls (Excel 97–2003) применяется провайдер Microsoft.Jet.OLEDB.4.0 со свойством Extended Properties="Excel 8.0;". Для современного формата .xlsx необходим провайдер Microsoft.ACE.OLEDB.12.0 (или новее) со свойством Extended Properties="Excel 12.0 Xml;".Null. Чтобы принудительно считывать все ячейки как текст, в строку подключения в параметр Extended Properties обязательно добавляют IMEX=1;.[Лист1$].Для прямого разбора двоичных файлов Excel разработаны легковесные внешние компоненты, работающие без зависимостей от установленного офисного пакета (например, библиотека MiracleV8).
Разберем пример чтения данных с последовательным обходом ячеек через внешнюю компоненту:
Если ЗагрузитьВнешнююКомпоненту("MiracleV8.dll") = 0 Тогда
Сообщить("Не удалось загрузить компоненту MiracleV8.dll!");
Возврат;
КонецЕсли;
XLS = СоздатьОбъект("AddIn.MiracleClass");
XLS.ReadXLS(ФормИмяФайлаДанных);
ТЗ = СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("Код");
ТЗ.НоваяКолонка("Наименование");
Для СчСтрок = 1 По КонСтрока Цикл
Код = Прав("000" + СокрЛП(XLS.ReadCell(1, СчСтрок, 1)), 3);
Наименование = СокрЛП(XLS.ReadCell(1, СчСтрок, 2));
ТЗ.НоваяСтрока();
ТЗ.Код = Код;
ТЗ.Наименование = Наименование;
КонецЦикла;
XLS = 0;
Обратите внимание: При использовании подобных компонент номер листа и граничные строки обычно задаются явно или определяются предварительным сканированием диапазона.
Большинство старых библиотек и внешних компонент для 1С 7.7 проектировались под двоичный формат BIFF8 (файлы с расширением .xls). Если на вход поступает современный файл .xlsx (OpenXML), они могут работать некорректно или вызывать ошибку чтения.
В такой ситуации рекомендуем следующие подходы:
--headless --convert-to csv. Полученный результат 1С 7.7 моментально считывает встроенным объектом СоздатьОбъект("Текст")..xlsx представляет собой ZIP-архив. Распаковав его с помощью любой консольной утилиты, можно напрямую прочитать структуры xl/sharedStrings.xml (таблица общих строк) и xl/worksheets/sheet1.xml (ячейки листа) стандартным системным объектом MSXML2.DOMDocument. Этот способ исключает любые проблемы с драйверами и разрядностью операционной системы.