Разработка и Конфигурация · 11 мин
Как прочитать файл Excel в 1С
Способы чтения файлов Excel в 1С: через COM-объект, табличный документ и ADO. Примеры кода, типичные ошибки, проверка результата и ответы на вопросы.
Чтение данных из Excel — одна из самых частых задач при работе с 1С: загрузка прайсов поставщиков, импорт номенклатуры, перенос остатков при переходе на новую базу. Встроенного «мастера чтения Excel» в платформе нет, поэтому разработчики используют несколько рабочих подходов: COM-подключение к приложению Excel, чтение через объект «ТабличныйДокумент», а также доступ через ADO. У каждого способа есть свои требования, ограничения и подводные камни.
Выбор метода зависит от условий: установлен ли Microsoft Excel на компьютере, где выполняется код, какой формат файла нужно прочитать (xls, xlsx, csv), где выполняется обработка — на клиенте или на сервере, и насколько велик файл. Ниже разобраны основные способы с примерами кода, проверкой результата и типичными ошибками.
Что нужно проверить перед чтением файла
Прежде чем писать код, определите три вещи. Во-первых, формат файла: старый бинарный .xls, современный .xlsx или текстовый .csv. От этого зависит, какие механизмы доступны. Во-вторых, место выполнения кода: на клиенте, где есть Excel пользователя, или на сервере 1С, где Excel обычно не установлен и устанавливать его не рекомендуется. В-третьих, структуру данных: есть ли строка заголовков, сколько листов в книге, начинаются ли данные с первой строки.
Также убедитесь, что файл не открыт в Excel в момент чтения — это самая частая причина ошибок «файл занят» или чтения устаревшей версии. Если файл приходит от контрагентов, заранее договоритесь о фиксированной структуре колонок, иначе любая перестановка столбцов сломает загрузку.
Способ 1. Чтение через ТабличныйДокумент — без установленного Excel
Объект «ТабличныйДокумент» в платформе 1С умеет открывать файлы форматов xls, xlsx, mxl, ods и некоторых других напрямую, без какого-либо офисного пакета. Это самый простой и безопасный способ, который работает и на клиенте, и на сервере.
Минимальный код выглядит так:
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать("C:\Данные\Прайс.xlsx", СпособЧтенияЗначенийТабличногоДокумента.Значение);
ВсегоСтрок = ТабДок.ВысотаТаблицы;
ВсегоКолонок = ТабДок.ШиринаТаблицы;
Для НомерСтроки = 2 По ВсегоСтрок Цикл
Наименование = ТабДок.Область(НомерСтроки, 1).Текст;
ЦенаСтрокой = ТабДок.Область(НомерСтроки, 3).Текст;
// дальнейшая обработка значений
КонецЦикла;
Обратите внимание на параметр СпособЧтенияЗначенийТабличногоДокумента: значение «Значение» возвращает вычисленный результат ячеек, «Текст» — отображаемое представление. Для загрузки чисел и дат обычно удобнее «Значение», но помните, что из ячейки вы получаете строку или число — приведение типов нужно делать явно, с обработкой ошибок через Попытка/Исключение.
Ограничения способа: читается только первый (или активный) лист книги, сложное форматирование и объединённые ячейки могут давать неожиданные результаты, а очень большие файлы (десятки тысяч строк) загружаются медленно и потребляют много памяти.
Способ 2. Чтение через COM-объект Excel.Application
Если на компьютере, где выполняется код, установлен Microsoft Excel, можно подключиться к нему как к COM-серверу. Этот способ даёт полный доступ к книге: все листы, формулы, форматы ячеек, скрытые строки. Он работает только на толстом или тонком клиенте под Windows с установленным Office.
Попытка
Excel = Новый COMОбъект("Excel.Application");
Исключение
Сообщить("Excel не установлен или недоступен: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
Excel.DisplayAlerts = Ложь;
Книга = Excel.Workbooks.Open("C:\Данные\Прайс.xlsx");
Лист = Книга.Worksheets(1);
ПоследняяСтрока = Лист.Cells(Лист.Rows.Count, 1).End(-4162).Row; // xlUp
Для НомерСтроки = 2 По ПоследняяСтрока Цикл
Наименование = СокрЛП(Лист.Cells(НомерСтроки, 1).Value);
КонецЦикла;
Книга.Close(Ложь);
Excel.Quit();
Excel = Неопределено;
Критически важно всегда закрывать книгу и вызывать Quit(), иначе в памяти останутся зависшие процессы EXCEL.EXE, которые со временем заблокируют файлы и перегрузят сервер терминалов. Блок Попытка/Исключение должен охватывать всю работу, а в секции Исключение тоже нужно пытаться закрыть Excel.
Способ 3. Чтение через ADO (OLE DB)
ADO позволяет читать лист Excel как таблицу базы данных SQL-запросом, без открытия приложения Excel. Способ требует наличия провайдера OLE DB (ACE OLEDB) соответствующей разрядности и хорошо подходит для больших файлов, потому что работает быстрее построчного обхода ячеек через COM.
Идея кода: создаётся COMОбъект("ADODB.Connection"), в строке подключения указывается провайдер Microsoft.ACE.OLEDB и путь к файлу, затем выполняется запрос вида SELECT * FROM [Лист1$]. Результат обходится как набор записей через Recordset. Главные ограничения: провайдер должен совпадать по разрядности с процессом 1С, типы колонок определяются по первым строкам (смешанные данные могут читаться как NULL), а имя листа в запросе должно точно совпадать с реальным.
Сравнение способов чтения Excel
Работает везде без Excel, простой код. Ограничение: один лист, медленно на очень больших файлах.
Полный доступ к книге, формулам и листам. Ограничение: нужен установленный Excel, риск зависших процессов.
Быстро на больших объёмах, SQL-фильтрация. Ограничение: нужен провайдер нужной разрядности, капризен к типам данных.
Максимально надёжно и быстро, читается встроенным ТекстовыйДокумент. Ограничение: требует подготовки файла, теряются форматы и листы.
Как выбрать способ под свою задачу
Если обработка будет работать на сервере или в файловой базе у пользователей без Office — выбирайте ТабличныйДокумент, это единственный вариант без внешних зависимостей. Если нужно читать несколько листов, формулы или форматы и Excel гарантированно установлен — COM-объект. Для регулярной загрузки больших выгрузок (сотни тысяч строк) рассмотрите ADO или договоритесь с поставщиком данных о формате CSV.
Как выбрать способ
Проверка результата и обработка данных
После чтения не записывайте данные в базу сразу — сначала проверьте, что прочиталось именно то, что ожидалось. Контрольные точки: количество прочитанных строк совпадает с количеством строк в файле минус заголовок; числовые колонки действительно содержат числа (функция проверки через попытку преобразования); даты распознаны корректно, а не как текст; нет «съехавших» колонок, когда значение цены попадает в колонку наименования.
Типичная ошибка — чтение дат. Excel хранит даты как числа, и в зависимости от способа чтения вы можете получить либо дату, либо число вида 45000, либо строку в региональном формате. Всегда проверяйте несколько первых строк вручную через вывод в сообщения или в таблицу значений на форме, прежде чем включать запись в справочники и документы.
Как проверить результат чтения
Совпадает с числом строк данных в файле
Строк меньше или больше — возможно, обрезаны пустые строки или прочитан не тот лист
Значения преобразуются в тип Число без ошибок
Ошибки преобразования — в ячейках текст, пробелы или разделитель дробной части не совпадает с региональными настройками
Распознаются как тип Дата с правильным днём и месяцем
День и месяц перепутаны местами или дата прочитана как число
Прочитана вторая строка файла (после заголовка)
Заголовок попал в данные или первая строка данных потеряна
Типичные ошибки и как их избежать
Большинство проблем при чтении Excel в 1С повторяются от проекта к проекту. Знание этих ошибок экономит часы отладки.
Отдельно стоит упомянуть безопасность: файлы от внешних контрагентов могут содержать макросы. При чтении через ТабличныйДокумент макросы не выполняются, что является дополнительным плюсом этого способа. При COM-подключении отключайте запуск макросов и не открывайте файлы из недоверенных источников в интерактивном Excel.
Частые вопросы
Можно ли прочитать xlsx в 1С без установленного Excel?
Да. Объект ТабличныйДокумент методом Прочитать() открывает xls и xlsx без офисного пакета — это штатная возможность платформы. Работает и на клиенте, и на сервере. Ограничение — читается один лист и нет доступа к формулам.
Почему числа из Excel читаются как текст?
Чаще всего из-за неразрывных пробелов в качестве разделителя тысяч, другого символа дробной части или того, что ячейка в Excel отформатирована как текст. Перед преобразованием удаляйте пробелы функцией СтрЗаменить и приводите разделитель к точке или запятой в зависимости от настроек.
Как прочитать не первый, а нужный лист книги?
Через ТабличныйДокумент выбрать лист нельзя — читается активный лист. Если нужен конкретный лист, используйте COM-объект Excel (Worksheets с индексом или именем) либо ADO-запрос с указанием имени листа в формате [ИмяЛиста$].
Что делать, если файл очень большой и чтение зависает?
ТабличныйДокумент на файлах в сотни тысяч строк работает медленно и потребляет много памяти. Варианты: читать через ADO с SQL-фильтрацией, попросить поставщика данных выгружать CSV (читается ТекстовыйДокумент построчно и быстро) или разбивать файл на части.
Как загрузить данные из Excel в веб-клиенте 1С?
В веб-клиенте COM-объекты недоступны. Файл передаётся на сервер через помещение во временное хранилище (НачатьПомещениеФайла), а на сервере читается ТабличныйДокументом. Это стандартная схема загрузки файлов в браузерном режиме.
Безопасно ли открывать Excel-файлы от контрагентов через COM?
Есть риск: при COM-открытии могут выполняться макросы, если не отключён их запуск. Безопаснее читать внешние файлы через ТабличныйДокумент (макросы не выполняются) или через ADO, а COM использовать только для доверенных источников.
Что важно запомнить
Универсальный способ без Excel — ТабличныйДокумент.Прочитать(). COM-объект даёт полный доступ к книге, но требует установленного Excel и обязательного закрытия приложения. Для больших файлов и регулярных загрузок надёжнее всего CSV. Перед записью в базу всегда проверяйте количество строк, типы чисел и корректность дат.