Разработка и Конфигурация · 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. Не даёт доступа к формулам и именам листов напрямую.
Полный доступ к файлу: листы, формулы, форматирование. Требует установленный Excel, Windows и совпадение разрядности. Медленный на больших файлах.
Подходит для 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 сам открывает «с восстановлением», платформа часто отклоняет.
Готовые механизмы типовых конфигураций
Прежде чем писать собственную загрузку, проверьте типовые возможности конфигурации. В решениях на Библиотеке стандартных подсистем (УТ, ERP, Бухгалтерия) есть универсальная загрузка данных из табличных документов: пользователь выбирает файл, сопоставляет колонки полям объекта в интерактивной форме, и система сама записывает данные с проверкой дублей.
Для загрузки прайсов в УТ и ERP существует отдельный механизм регистрации цен поставщиков, который принимает файлы Excel напрямую. В Бухгалтерии загрузка из Excel встроена в ряд документов и справочников. Использование типовых механизмов избавляет от поддержки собственного кода при обновлении конфигурации.
Как выбрать действие
Частые вопросы
Можно ли прочитать 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-объект нужен только для доступа к листам, формулам и форматированию и требует аккуратного закрытия процесса. Перед записью в базу всегда проверяйте типы, очищайте строки от лишних пробелов и делайте контрольную сверку итогов.