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

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

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

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

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

Проанализируем программную реализацию этого метода. Сначала нам необходимо создать объект приложения, открыть книгу и выбрать нужный лист. Рассмотрим пример кода:


Попытка
    Эксель = Новый COMОбъект("Excel.Application");
    Книга = Эксель.Workbooks.Open(ПутьКФайлу);
    Лист = Книга.Sheets(1); // Обращаемся к первому листу
Исключение
    Сообщить("Ошибка при открытии Excel: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

// Определяем количество заполненных строк
ВсегоСтрок = Лист.Cells.SpecialCells(11).Row;

Для НомерСтроки = 1 По ВсегоСтрок Цикл
    ЗначениеЯчейки = СокрЛП(Лист.Cells(НомерСтроки, 1).Value);
    // Обработка полученных данных
КонецЦикла;

// Важно корректно закрыть приложение
Эксель.Quit();
Эксель = Неопределено;

Разберем важные детали: использование SpecialCells(11) позволяет быстро найти последнюю заполненную ячейку. При работе с COM-объектами крайне важно всегда завершать процесс через Quit(), иначе в памяти компьютера будут оставаться "зависшие" процессы EXCEL.EXE, что может привести к критической нехватке ресурсов сервера.

Метод 2: Чтение данных через ADODB (без установки Excel)

Если на сервере не установлен Microsoft Office, мы можем воспользоваться технологией ADO. Этот способ рассматривает файл Excel как базу данных, где листы выступают в роли таблиц. Проанализируем этот подход: он работает быстрее, чем COM, но накладывает ограничения на формат данных (например, сложно работать с ячейками разного типа в одной колонке).

Посмотрим на пример настройки соединения для чтения файла .xlsx:


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

Попытка
    Connection.Open(СтрокаСоединения);
    RecordSet = Connection.Execute("SELECT * FROM [Лист1$]");
    
    Пока НЕ RecordSet.EOF() Цикл
        // Обращение к полям по индексу или имени колонки
        Значение = RecordSet.Fields.Item(0).Value;
        RecordSet.MoveNext();
    КонецЦикла;
    
    Connection.Close();
Исключение
    Сообщить("Ошибка ADO: " + ОписаниеОшибки());
КонецПопытки;

В параметре Extended Properties мы указываем HDR=YES, если первая строка содержит заголовки, и IMEX=1 для принудительного чтения всех данных как текста, что помогает избежать ошибок при смешанных типах данных в одной колонке. Выясним причину популярности этого метода: он идеально подходит для фоновых заданий на сервере, где визуальное приложение Excel не требуется.

Метод 3: Использование встроенного объекта Платформы — ТабличныйДокумент

Начиная с современных версий платформы 1С 8.3, разработчики получили возможность читать файлы Excel напрямую средствами встроенного языка без использования внешних библиотек. Это самый быстрый и надежный способ, так как он полностью кроссплатформенный (работает и на Windows, и на Linux) и не зависит от стороннего ПО.

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

  1. Создаем объект ТабличныйДокумент.
  2. Используем метод Прочитать() с указанием типа файла.
  3. Обходим ячейки в цикле.

Проанализируем пример кода:


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

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

Для НомерСтроки = 1 По ВсегоСтрок Цикл
    Для НомерКолонки = 1 По ВсегоКолонок Цикл
        ТекОбласть = ТабДок.Область(НомерСтроки, НомерКолонки);
        Значение = ТекОбласть.Текст; // Или ТекОбласть.Значение
        // Дальнейшая логика обработки
    КонецЦикла;
КонецЦикла;

Разберем подробнее параметр СпособЧтенияЗначенийТабличногоДокумента. Если мы укажем Значение, система попытается автоматически преобразовать типы данных (числа, даты) в типы 1С. Если указать Текст, то все данные будут прочитаны в строковом виде, как они отображаются в ячейке. Этот метод рекомендуется для большинства задач импорта, так как он обеспечивает максимальную производительность.

Сравнение и выводы

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

Важные моменты для запоминания:

Выясним причину возможных ошибок: часто при загрузке .xlsx через ТабличныйДокумент возникают проблемы с форматами дат. В этом случае полезно проверить формат ячейки в исходном файле или читать данные как текст с последующим программным преобразованием через Дата().

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

← На главную