Как программно прочитать данные из файла Excel в 1С:Предприятие 8.3?

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

В практике разработчика 1С часто возникает задача импорта данных из внешних источников, среди которых файлы формата Excel занимают лидирующее место. Для решения подобных задач часто используется универсальная загрузка из Excel, которая позволяет выполнить импорт справочников буквально «одним нажатием». Существует несколько принципиально разных подходов к программной реализации этой задачи, каждый из которых имеет свои преимущества и ограничения. В данной статье мы подробно проанализируем основные методы работы с файлами .xls и .xlsx, разберем программный код для каждого случая и выясним, какой способ лучше выбрать в зависимости от условий задачи.

Метод 1: Использование COM-объекта (Excel.Application)

Это классический и наиболее гибкий способ. Мы обращаемся к установленному в операционной системе приложению Microsoft Excel через механизм COM-соединения. Этот метод позволяет не только читать данные, но и полноценно управлять форматированием, формулами и структурой листа.

Рассмотрим алгоритм работы. Сначала нам необходимо создать объект Excel.Application, затем открыть книгу и обратиться к конкретному листу. Проанализируем пример кода:


Попытка
    Эксель = Новый COMОбъект("Excel.Application");
Исключение
    Сообщить("Не удалось создать объект Excel. Возможно, Microsoft Excel не установлен.");
    Возврат;
КонецПопытки;

Эксель.Visible = Ложь;
Эксель.DisplayAlerts = Ложь;

Попытка
    Книга = Эксель.Workbooks.Open(ПутьКФайлу);
    Лист = Книга.Sheets(1); // Обращаемся к первому листу
    
    // Определяем количество строк и колонок
    ВсегоСтрок = Лист.Cells.SpecialCells(11).Row;
    ВсегоКолонок = Лист.Cells.SpecialCells(11).Column;
    
    Для НомерСтроки = 1 По ВсегоСтрок Цикл
        СодержимоеЯчейки = Лист.Cells(НомерСтроки, 1).Value;
        // Обработка данных
    КонецЦикла;
    
    Книга.Close(Ложь);
Исключение
    Сообщить("Ошибка при чтении файла: " + ОписаниеОшибки());
КонецПопытки;

Эксель.Quit();

Важные моменты: при использовании этого метода крайне важно корректно завершать работу объекта Quit(), иначе в системе останутся "висящие" процессы excel.exe. Главным недостатком является необходимость установки платного пакета MS Office на сервере или клиентском компьютере, а также низкая скорость работы при больших объемах данных.

Метод 2: Чтение через встроенный объект ТабличныйДокумент

Если нам нужно просто прочитать данные без сложного форматирования, мы можем воспользоваться встроенным методом платформы 1С. Платформа умеет открывать файлы Excel напрямую, преобразуя их в свой внутренний формат ТабличныйДокумент. На практике часто применяется шаблон простой обработки загрузки из excel, построенный на этом принципе.

Разберем этот способ по шагам. Он значительно быстрее COM-соединения и не требует наличия установленного Excel. Это делает его идеальным для работы на сервере под управлением Linux.


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

КоличествоСтрок = ТабДок.ВысотаТаблицы;
КоличествоКолонок = ТабДок.ШиринаТаблицы;

Для НомерСтроки = 1 По КоличествоСтрок Цикл
    Для НомерКолонки = 1 По КоличествоКолонок Цикл
        ТекстЯчейки = ТабДок.Область(НомерСтроки, НомерКолонки).Текст;
        // Здесь мы можем проанализировать ситуацию и обработать данные
    КонецЦикла;
КонецЦикла;

Выясним причину, почему этот метод иногда предпочтительнее. Во-первых, ТабличныйДокумент работает нативно. Во-вторых, параметр СпособЧтенияЗначенийТабличногоДокумента.Значение позволяет получать именно типизированные данные (числа, даты), а не просто текст, который отображается в ячейке.

Метод 3: Использование ADO (ActiveX Data Objects)

Для очень больших файлов (сотни тысяч строк) использование COM-объекта Excel становится невозможным из-за утечек памяти и крайне низкой скорости. В таких случаях мы рекомендуем использовать подключение через драйвер Microsoft Access Text Driver или Microsoft Excel Driver. В этом случае файл Excel рассматривается как база данных, а листы — как таблицы. Такой подход позволяет реализовать быстрый импорт данных из форматов xls, xlsx, txt и других для первоначального заполнения базы.

Рассмотрим пример настройки строки соединения:


Connection = Новый COMОбъект("ADODB.Connection");
ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ПутьКФайлу + ";Extended Properties=""Excel 12.0 Xml;HDR=YES"";";

Попытка
    Connection.Open(ConnectionString);
    Recordset = Новый COMОбъект("ADODB.Recordset");
    ТекстЗапроса = "SELECT * FROM [Лист1$]"; // Обратите внимание на знак $ в названии листа
    
    Recordset.Open(ТекстЗапроса, Connection);
    
    Пока Recordset.EOF = 0 Цикл
        ЗначениеПоля = Recordset.Fields.Item(0).Value;
        Recordset.MoveNext();
    КонецЦикла;
    
    Recordset.Close();
    Connection.Close();
Исключение
    Сообщить("Ошибка ADO: " + ОписаниеОшибки());
КонецПопытки;

Преимущество данного метода заключается в колоссальной скорости чтения. Однако есть и минус: структура файла должна быть строго табличной, без объединенных ячеек и сложного оформления "шапки".

Метод 4: Прямое чтение XML-структуры (для формата .xlsx)

Современные файлы Excel с расширением .xlsx представляют собой ZIP-архив, внутри которого находятся файлы в формате XML. Мы можем разобрать этот архив программно средствами 1С, используя объекты ЧтениеZipФайла и ЧтениеXML.

Посмотрим на примерную логику процесса прямого чтения XML:

  1. Открываем файл через ЧтениеZipФайла.
  2. Извлекаем файл xl/worksheets/sheet1.xml (содержимое листа) и xl/sharedStrings.xml (библиотека строк).
  3. Последовательно читаем XML и сопоставляем индексы строк с данными.

Этот способ требует глубокого понимания структуры OpenXML, но он обеспечивает максимальную производительность и кроссплатформенность.

Сравнительный анализ и рекомендации

Давайте подведем итоги нашего исследования. Выбор метода напрямую зависит от ваших условий:

Проанализировав все способы, можно сделать вывод, что универсального решения не существует, но комбинация ТабличногоДокумента для простых задач и ADO для высоконагруженных систем перекрывает 95% потребностей бизнеса в автоматизации обмена данными.

← На главную