К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как в 1С получить лист Excel

Как в 1С получить лист Excel: чтение через COM-объект, табличный документ, ADO. Код, проверка результата, типичные ошибки и ответы на вопросы.

Получение листа Excel в 1С — типовая задача при загрузке прайсов, обмене данными с контрагентами и обработке отчётов из сторонних систем. В зависимости от конфигурации и режима работы (файловая база, клиент-сервер, тонкий или веб-клиент) применяются разные подходы: COM-объект Excel, чтение через табличный документ, ADO или библиотеки без установленного Office.

Выбор способа критичен: COM-подключение требует установленного Microsoft Excel на том компьютере, где выполняется код, и не работает на сервере под Linux. Чтение через табличный документ универсальнее, но поддерживает только формат, который платформа умеет интерпретировать, и не даёт доступа к формулам и скрытым листам. Ошибка в выборе метода — самая частая причина сбоев при переносе обработки с разработческого компьютера на сервер.

Ниже разобраны рабочие способы получения листа Excel с готовым кодом, критерии выбора метода, проверка результата и типичные ошибки, которые приводят к потере данных или зависанию процессов.

Какие способы получения листа Excel существуют в 1С

Платформа 1С не имеет встроенного объекта «лист Excel», поэтому лист получают одним из четырёх путей. Первый — COM-автоматизация: 1С запускает процесс Excel и обращается к его объектной модели (Workbook → Worksheet). Второй — чтение файла в объект «Табличный документ» методом Прочитать(), после чего данные обходятся построчно. Третий — ADO (ADODB.Connection), который рассматривает книгу Excel как источник данных, а листы — как таблицы. Четвёртый — внешние компоненты и библиотеки, работающие с форматом XLSX напрямую.

COM-подход даёт полный доступ: имена листов, формулы, скрытые листы, форматирование. Но он привязан к Windows и установленному Office, медленно работает на больших файлах и оставляет зависшие процессы EXCEL.EXE при ошибках. Табличный документ работает везде, где работает платформа, но «видит» только данные видимой области и может искажать типы (например, превращать коды с ведущими нулями в числа).

Сравнение вариантов

COM-объект Excel

Полный доступ к листам, формулам и форматам. Требует Windows и установленный Office там, где исполняется код; не работает на Linux-сервере.

Табличный документ

Работает на любой платформе и на сервере без Office. Нет доступа к формулам и скрытым листам, возможна потеря форматов и типов.

ADO (ADODB)

Быстрое чтение листов как таблиц SQL-запросами. Требует провайдера OLE DB на машине, слабо контролирует типы колонок.

Получение листа через COM-объект Excel

COM-подключение — классический способ для клиентских обработок в файловых базах. Сначала создаётся объект Excel.Application, затем открывается книга, и из коллекции Sheets берётся нужный лист по имени или индексу. Индексация листов в объектной модели Excel начинается с единицы, а не с нуля — это частый источник ошибок.

Попытка

Excel = Новый COMОбъект("Excel.Application");

Исключение

Сообщить("Excel не установлен: " + ОписаниеОшибки());

Возврат;

КонецПопытки;

Excel.Visible = Ложь;

Excel.DisplayAlerts = Ложь;

Книга = Excel.Workbooks.Open("C:\Данные\Прайс.xlsx");

Лист = Книга.Sheets("Товары"); // или Книга.Sheets(1) — первый лист

Значение = Лист.Cells(2, 3).Value; // строка 2, колонка 3

После получения объекта листа данные читают через Cells(Строка, Колонка).Value или UsedRange. Перед циклом полезно определить реальные границы данных: Лист.UsedRange.Rows.Count и Лист.UsedRange.Columns.Count. Обращение к ячейкам по одной в цикле — медленная операция, для больших диапазонов выгоднее выгрузить весь UsedRange в массив одним вызовом и обходить уже его.

Как узнать имена всех листов книги

Если имя листа заранее неизвестно (пользователи присылают файлы с произвольными названиями), переберите коллекцию Sheets и соберите имена в список для выбора. Это надёжнее, чем жёстко зашивать имя «Лист1», которое в файле поставщика может отличаться.

Для Индекс = 1 По Книга.Sheets.Count Цикл

ИмяЛиста = Книга.Sheets(Индекс).Name;

// добавить ИмяЛиста в список выбора

КонецЦикла;

Обязательное закрытие Excel

Незакрытый COM-объект оставляет в памяти процесс EXCEL.EXE, который блокирует файл и накапливается при повторных запусках. Завершение работы оборачивают в попытку и выполняют всегда, даже при ошибке чтения:

Книга.Close(Ложь);      // без сохранения изменений

Excel.Quit();

Excel = Неопределено;

Получение данных листа через табличный документ

Универсальный способ без привязки к Office: платформа сама разбирает файл XLSX или XLS и помещает содержимое в табличный документ. Метод доступен и на клиенте, и на сервере, в том числе на Linux.

ТабДок = Новый ТабличныйДокумент;

ТабДок.Прочитать("C:\Данные\Прайс.xlsx", СпособЧтенияЗначенийТабличногоДокумента.Значение);

Для НомерСтроки = 2 По ТабДок.ВысотаТаблицы Цикл

Артикул = ТабДок.Область(НомерСтроки, 1).Текст;

Цена = ТабДок.Область(НомерСтроки, 3).Текст;

КонецЦикла;

Ограничение метода: читается первый (или активный при сохранении) лист книги, доступа к произвольному листу по имени нет. Если в файле несколько листов и нужен не первый, табличный документ не подойдёт — используйте COM или ADO. Также проверяйте типы: числовые коды с ведущими нулями и даты в текстовом виде могут интерпретироваться не так, как ожидает загрузка.

Чтение листа через ADO

ADO рассматривает книгу Excel как базу данных: каждый лист — таблица с именем вида «ИмяЛиста$». Способ быстрее COM на больших файлах и не требует видимого окна Excel, но нужен установленный провайдер OLE DB (ACE или Jet) и тоже работает только под Windows.

Соединение = Новый COMОбъект("ADODB.Connection");

Соединение.Open("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Данные\Прайс.xlsx;

|Extended Properties=""Excel 12.0;HDR=YES""");

Набор = Новый COMОбъект("ADODB.Recordset");

Набор.Open("SELECT * FROM [Товары$]", Соединение);

Пока НЕ Набор.EOF Цикл

Артикул = Набор.Fields(0).Value;

Набор.MoveNext();

КонецЦикла;

Имя листа в запросе берётся в квадратные скобки с символом доллара: [Товары$]. Параметр HDR=YES означает, что первая строка — заголовки колонок. Учтите, что провайдер определяет тип колонки по первым строкам, и смешанные данные (числа и текст в одном столбце) могут читаться с потерями части значений.

Как выбрать подходящий способ

Критерии выбора сводятся к трём вопросам: где исполняется код, установлен ли Office и нужен ли доступ к конкретному листу по имени. Для разовой загрузки на рабочем месте пользователя с установленным Excel COM — самый простой и гибкий вариант. Для регламентной загрузки на сервере — только табличный документ или ADO при наличии провайдера.

Маршрут решения

Как выбрать действие

Код выполняется на клиенте, Office установлен, нужен лист по имени или формулыИспользуйте COM-объект Excel.Application
Код выполняется на сервере или Office не установленЧитайте файл в табличный документ методом Прочитать()
Файл большой, нужны только данные таблицами и есть провайдер OLE DBИспользуйте ADO с запросом к листу [ИмяЛиста$]
Имя листа в файлах поставщика меняетсяПереберите Sheets и дайте пользователю выбрать лист из списка

Проверка результата и типичные ошибки

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

Контрольные точки

Как проверить результат

Лист найден по имени
Норма

Sheets(Имя) вернул объект без исключения

Тревожный признак

Ошибка «индекс выходит за границы» — листа нет, перечислите Sheets для диагностики

Диапазон данных
Норма

UsedRange.Rows.Count больше 1, ячейки содержат значения

Тревожный признак

UsedRange пуст или содержит только заголовок — файл пустой или данные на другом листе

Типы значений
Норма

Коды с ведущими нулями читаются как текст, даты — как даты

Тревожный признак

Нули обрезаны, даты превратились в числа — корректируйте чтение или формат ячеек

Процесс Excel после работы
Норма

EXCEL.EXE завершён после Quit()

Тревожный признак

Процесс завис в диспетчере задач — не вызван Quit() или оборвана попытка

Типичные ошибки
01
Индексация листов с нуля — в COM-модели Excel первый лист имеет индекс 1, обращение Sheets(0) даёт ошибку.
02
Отсутствие Excel.Quit() — процесс EXCEL.EXE остаётся в памяти и блокирует файл при следующем запуске.
03
Использование COM на сервере без Office или под Linux — обработка падает в момент создания COMОбъект.
04
Чтение ячеек по одной в цикле на больших файлах — загрузка растягивается на десятки минут; выгружайте диапазон массивом.
05
Жёстко зашитое имя листа «Лист1» — в реальных файлах поставщиков лист называется иначе, и загрузка прерывается.

FAQ

Как получить лист Excel по имени, если оно содержит пробелы или кириллицу?

В COM-объекте имя передаётся как есть: Книга.Sheets("Лист закупок") — пробелы и кириллица допустимы. В ADO-запросе имя берётся в квадратные скобки с долларом: [Лист закупок$]. Если имя содержит апостроф, его нужно удвоить в строке запроса.

Можно ли получить лист Excel на сервере 1С под Linux?

Через COM — нет, COM-технология существует только в Windows. На Linux-сервере читайте файл в табличный документ методом Прочитать() либо используйте внешние библиотеки разбора XLSX, подключаемые как внешние компоненты.

Почему при чтении через табличный документ пропадают ведущие нули в кодах?

Платформа преобразует содержимое ячейки в число, если оно выглядит как число. Чтобы сохранить исходный текст, читайте область как текст (свойство Текст области), а не как значение, либо заранее приводите колонку в самом Excel к текстовому формату.

Как узнать, сколько листов в книге и как они называются?

Через COM: Книга.Sheets.Count вернёт количество, а перебор Sheets(1..N) с чтением свойства Name даст имена. Через ADO имена листов можно получить из схемы каталога соединения методом OpenSchema. Табличный документ такой информации не предоставляет.

Что делать, если процесс EXCEL.EXE завис и блокирует файл?

Завершите процесс через диспетчер задач, затем проверьте код: перед выходом должны вызываться Книга.Close(Ложь) и Excel.Quit(), причём в ветке обработки ошибок тоже. Надёжнее всего обернуть всю работу в Попытка/Исключение и выполнять закрытие в обоих случаях.

Какой способ быстрее для файла на несколько десятков тысяч строк?

Быстрее всего ADO за счёт чтения наборами записей. COM с построчным обходом ячеек — самый медленный вариант; если COM неизбежен, выгружайте весь UsedRange в массив одним вызовом и обходите массив, это ускоряет обработку в разы.

Итог

Что важно запомнить

Лист Excel в 1С получают через COM (полный доступ, но только Windows и Office), табличный документ (универсально, но без формул и выбора листа) или ADO (быстро, через SQL-запросы к листам). Листы в COM нумеруются с 1, процесс Excel обязательно закрывают через Quit(), а на сервере без Office используют только чтение в табличный документ.