Разработка и Конфигурация · 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 при ошибках. Табличный документ работает везде, где работает платформа, но «видит» только данные видимой области и может искажать типы (например, превращать коды с ведущими нулями в числа).
Сравнение вариантов
Полный доступ к листам, формулам и форматам. Требует Windows и установленный Office там, где исполняется код; не работает на Linux-сервере.
Работает на любой платформе и на сервере без Office. Нет доступа к формулам и скрытым листам, возможна потеря форматов и типов.
Быстрое чтение листов как таблиц 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 при наличии провайдера.
Как выбрать действие
Проверка результата и типичные ошибки
После получения листа проверьте три вещи: лист с указанным именем существует, диапазон данных непустой, типы прочитанных значений соответствуют ожиданиям. Обращение к несуществующему листу через COM вызывает исключение — перехватывайте его и сообщайте пользователю, какие листы есть в файле на самом деле.
Как проверить результат
Sheets(Имя) вернул объект без исключения
Ошибка «индекс выходит за границы» — листа нет, перечислите Sheets для диагностики
UsedRange.Rows.Count больше 1, ячейки содержат значения
UsedRange пуст или содержит только заголовок — файл пустой или данные на другом листе
Коды с ведущими нулями читаются как текст, даты — как даты
Нули обрезаны, даты превратились в числа — корректируйте чтение или формат ячеек
EXCEL.EXE завершён после Quit()
Процесс завис в диспетчере задач — не вызван Quit() или оборвана попытка
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 используют только чтение в табличный документ.