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

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

1С: как прочитать файл Excel

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

Чтение файлов Excel — одна из самых частых задач при работе с 1С: загрузка прайсов поставщиков, импорт номенклатуры, перенос остатков при переходе на новую базу. Платформа «1С:Предприятие» предлагает несколько способов решить эту задачу, и выбор зависит от того, где выполняется код (на клиенте или на сервере), установлен ли Microsoft Excel и какой формат у файла — старый XLS или новый XLSX.

Основных подхода три: чтение через COM-объект Excel.Application, чтение через объект «ТабличныйДокумент» с методом Прочитать() и разбор XLSX как ZIP-архива с XML внутри. Первый способ самый гибкий, но требует установленного Excel. Второй — самый простой и не требует ничего, кроме платформы. Третий подходит для серверных Linux-окружений, где COM недоступен в принципе.

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

Как выбрать способ чтения Excel в 1С

Прежде чем писать код, определите три условия: где исполняется код (тонкий клиент, толстый клиент, сервер), установлен ли на этой машине Microsoft Excel и какой объём данных нужно прочитать. От ответов зависит, какой метод будет работать, а какой завершится ошибкой ещё на этапе инициализации.

COM-подключение даёт полный доступ к файлу: листы, ячейки, формулы, объединённые области, цвета. Но оно медленное на больших файлах, требует Excel той же разрядности, что и процесс 1С, и недоступно на Linux-сервере. ТабличныйДокумент читает только значения и простое форматирование, зато работает везде и заметно быстрее.

Сравнение способов чтения Excel

ТабличныйДокумент.Прочитать()

Работает без Excel, на клиенте и сервере, включая Linux. Читает XLS и XLSX. Не даёт доступа к формулам и именам листов напрямую.

COM-объект Excel.Application

Полный доступ к файлу: листы, формулы, форматирование. Требует установленный Excel, Windows и совпадение разрядности. Медленный на больших файлах.

Разбор XLSX как ZIP+XML

Подходит для Linux-сервера без Excel и для потоковой обработки больших файлов. Требует аккуратной работы с sharedStrings и структурой архива.

Чтение через ТабличныйДокумент — универсальный способ

Объект ТабличныйДокумент умеет открывать файлы форматов XLS, XLSX, ODS и MXL штатным методом Прочитать(). Это рекомендуемый способ для большинства прикладных задач: загрузки прайсов, списков контрагентов, начальных остатков. Код одинаково работает на клиенте и на сервере, платформа сама разбирает структуру файла.

Минимальный пример чтения файла и обхода ячеек:

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

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

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

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

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

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

// дальше — обработка и запись в справочник

КонецЦикла;

Обратите внимание на параметр СпособЧтенияЗначенийТабличногоДокумента.Значение — он указывает платформе читать вычисленные значения ячеек, а не текст формул. Если файл содержит формулы, без этого параметра вы можете получить в ячейке строку с формулой вместо числа.

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

Чтение через COM-объект Excel.Application

COM-подключение используют, когда нужно то, чего не умеет ТабличныйДокумент: перебор листов по именам, чтение формул, работа с объединёнными ячейками, скрытыми строками и цветом заливки. Типичный сценарий — сложный прайс, где данные разнесены по нескольким листам и часть цен вычисляется формулами.

Попытка

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

Исключение

Сообщить("Не удалось создать COM-объект. Проверьте, установлен ли Excel.");

Возврат;

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

Excel.Visible = Ложь;

Excel.DisplayAlerts = Ложь;

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

Лист = Книга.Worksheets(1);

ПоследняяСтрока = Лист.Cells(Лист.Rows.Count, 1).End(-4162).Row; // xlUp

Для НомерСтроки = 2 По ПоследняяСтрока Цикл

Наименование = Лист.Cells(НомерСтроки, 1).Value;

Цена = Лист.Cells(НомерСтроки, 3).Value;

КонецЦикла;

Книга.Close(Ложь);

Excel.Quit();

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

Два момента здесь критичны. Первый — обязательное завершение процесса: вызовы Close и Quit, а затем обнуление переменной. Если этого не сделать, в памяти останется зависший процесс EXCEL.EXE, который удерживает файл и мешает его повторному открытию. Второй — константа -4162 (xlUp) для поиска последней заполненной строки: в 1С нет доступа к перечислениям Excel, поэтому числовые значения констант указывают напрямую.

Разбор XLSX как архива — вариант для Linux-сервера

Файл XLSX по своей сути — ZIP-архив, внутри которого лежат XML-файлы: workbook.xml со списком листов, sharedStrings.xml со словарём строк и sheet1.xml, sheet2.xml и так далее с данными ячеек. Эту структуру можно разобрать средствами платформы без Excel и без ТабличногоДокумента — через ЧтениеZipФайла и ЧтениеXML.

Такой подход оправдан в двух случаях: когда сервер 1С работает под Linux и COM недоступен, а ТабличныйДокумент по какой-то причине не справляется, и когда нужно потоково обработать очень большой файл, не загружая его целиком в память. Ячейки со строковыми значениями хранят не сам текст, а индекс в sharedStrings.xml, поэтому сначала читается словарь строк, а затем по индексам восстанавливаются значения.

Минус очевиден: код получается объёмным, нужно аккуратно обрабатывать типы ячеек, даты (в XLSX они хранятся как числа) и варианты хранения строк (shared strings против inline strings). Для разовой загрузки прайса это избыточно, для промышленной интеграции на Linux — рабочий вариант.

Проверка данных после чтения

Файл прочитался без ошибок — ещё не значит, что данные корректны. Excel свободно хранит в одной колонке и числа, и текст, и даты, а 1С строго типизирована. Перед записью в справочники или регистры каждое значение нужно проверить и привести к нужному типу.

Типовая проверка выглядит так: строку с ценой очищают от пробелов и неразрывных пробелов (Символ(160)), заменяют запятую на точку и преобразуют через Число() внутри Попытка/Исключение. Даты из Excel часто приходят как текст в произвольном формате — надёжнее распарсить их функцией Дата() с явным разбором частей, чем полагаться на автоматическое преобразование.

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

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

Количество прочитанных строк
Норма

Совпадает с количеством строк в файле минус заголовок

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

Строк меньше — возможен обрыв на пустой строке внутри данных

Числовые колонки
Норма

Все значения успешно преобразуются в тип Число

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

Часть значений содержит текст, пробелы или символы валют

Даты
Норма

Даты попадают в ожидаемый диапазон периода загрузки

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

Даты сдвинуты или распознаны как числа вида 45000

Итоговая сумма
Норма

Контрольная сумма по колонке совпадает с итогом в файле

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

Суммы расходятся — есть пропущенные или задвоенные строки

Типичные ошибки и их причины

Самая частая ошибка при COM-подключении — «Ошибка при создании объекта из компоненты». Причины: Excel не установлен, разрядность Office не совпадает с разрядностью клиента 1С, либо код выполняется на сервере, где Office отсутствует. Лечится переходом на ТабличныйДокумент или установкой соответствующей версии Office.

Вторая группа ошибок связана с самим файлом. Файл, открытый в Excel другим пользователем, может читаться с блокировкой или не открываться вовсе. Файлы формата XLSB (двоичный формат Excel) ТабличныйДокумент не читает — их нужно предварительно пересохранить в XLSX. Повреждённые файлы, которые Excel сам открывает «с восстановлением», платформа часто отклоняет.

Типичные ошибки
01
Не закрыт COM-объект Excel — процесс EXCEL.EXE остаётся в памяти и блокирует файл при следующей загрузке.
02
Чтение без СпособЧтенияЗначенийТабличногоДокумента.Значение — вместо чисел в ячейках оказываются тексты формул.
03
Обход фиксированного диапазона строк вместо ВысотаТаблицы — пустой хвост файла создаёт тысячи пустых записей в базе.
04
Загрузка без транзакции — при ошибке в середине файла половина данных записана, половина нет, и повторная загрузка создаёт дубли.
05
Сравнение наименований из Excel без сокращения пробелов — из-за лишних пробелов создаются дубли номенклатуры.

Готовые механизмы типовых конфигураций

Прежде чем писать собственную загрузку, проверьте типовые возможности конфигурации. В решениях на Библиотеке стандартных подсистем (УТ, ERP, Бухгалтерия) есть универсальная загрузка данных из табличных документов: пользователь выбирает файл, сопоставляет колонки полям объекта в интерактивной форме, и система сама записывает данные с проверкой дублей.

Для загрузки прайсов в УТ и ERP существует отдельный механизм регистрации цен поставщиков, который принимает файлы Excel напрямую. В Бухгалтерии загрузка из Excel встроена в ряд документов и справочников. Использование типовых механизмов избавляет от поддержки собственного кода при обновлении конфигурации.

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

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

Нужно разово загрузить данные в типовую конфигурациюИспользуйте встроенную загрузку из табличного документа — код писать не нужно
Нужен свой код, Excel на машине не установленЧитайте через ТабличныйДокумент.Прочитать()
Нужны листы, формулы и форматирование, Excel установленИспользуйте COM-объект с обязательным закрытием процесса
Код выполняется на Linux-сервереТабличныйДокумент или разбор XLSX как ZIP-архива

Частые вопросы

Можно ли прочитать Excel в 1С без установленного Microsoft Office?

Да. Метод ТабличныйДокумент.Прочитать() разбирает файлы XLS и XLSX собственными средствами платформы и не требует ни Excel, ни других программ. Это работает и на клиенте, и на сервере, включая Linux.

Почему ТабличныйДокумент не открывает мой файл?

Частые причины: файл в формате XLSB (двоичный формат, не поддерживается), файл повреждён или защищён паролем, либо это файл старого формата, сохранённый с ошибками. Пересохраните файл в формате XLSX через Excel или LibreOffice и повторите попытку.

Как прочитать конкретный лист книги Excel через ТабличныйДокумент?

Метод Прочитать() по умолчанию читает первый лист. Для доступа к другим листам в управляемых формах используют чтение с указанием листа через параметры метода либо COM-подключение, где лист выбирается по имени: Книга.Worksheets("Лист2").

Даты из Excel читаются как числа вида 45000. Что делать?

Excel хранит даты как количество дней от базовой даты (1 января 1900 года). Если значение пришло числом, преобразуйте его: ДатаЗначение = Дата(1900,1,1) + (ЧислоИзExcel - 2) * 86400. Поправка -2 связана с особенностью отсчёта в Excel. При чтении через ТабличныйДокумент со способом «Значение» даты обычно распознаются автоматически.

Как загрузить очень большой файл, если не хватает памяти?

Разбейте файл на части по несколько десятков тысяч строк и загружайте порциями с записью в транзакции. Альтернатива — потоковый разбор XLSX через ЧтениеZipФайла и ЧтениеXML, при котором файл не загружается в память целиком. Также убедитесь, что обход идёт по ВысотаТаблицы, а не по заведомо избыточному диапазону.

COM-объект работает на клиенте, но падает на сервере. Почему?

На сервере 1С, скорее всего, не установлен Microsoft Excel, либо сервер работает под Linux, где COM-технология недоступна в принципе. Также проверьте разрядность: 64-разрядный сервер 1С не сможет создать COM-объект 32-разрядного Office без дополнительных настроек. Для серверного выполнения перепишите загрузку на ТабличныйДокумент.

Итог

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

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