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

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

Как прочитать таблицу Excel в 1С

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

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

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

Важно понимать разницу между «прочитать файл» и «загрузить данные в базу». Чтение даёт только сырые значения ячеек; дальше потребуется сопоставление колонок с реквизитами, поиск или создание элементов справочников и контроль дублей. Эти этапы тоже рассмотрены в статье.

Выбор способа чтения: что учесть до написания кода

Перед выбором метода ответьте на четыре вопроса: где будет выполняться код (толстый клиент, тонкий клиент, сервер), установлен ли Excel на машине, какой формат файла (XLS, XLSX, CSV) и нужны ли формулы и форматирование или достаточно значений ячеек.

Метод ТабличныйДокумент.Прочитать() — универсальный: платформа сама разбирает XLS и XLSX, не требует Office, работает на сервере Linux. Ограничение — вы получаете значения «как отображаются», без доступа к объектной модели Excel, а очень большие файлы читаются медленно и требуют заметного объёма памяти.

COM-подход через Excel.Application подходит, когда нужны формулы, скрытые листы, точные форматы чисел или чтение по частям. Но он работает только в Windows с установленным Excel, а на сервере 1С его использование не рекомендуется: COM-вызовы нестабильны в многопоточной среде и могут оставлять зависшие процессы EXCEL.EXE.

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

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

Универсально, без Excel, клиент и сервер. Ограничение: нет доступа к формулам и объектной модели, медленно на больших файлах.

COM Excel.Application

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

CSV вместо XLSX

Самый быстрый и надёжный вариант, если файл можно сохранить в CSV. Ограничение: один лист, нет форматов, вопросы кодировки и разделителей.

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

Метод Прочитать() объекта «ТабличныйДокумент» загружает файл Excel целиком, после чего значения ячеек доступны через Область(Строка, Колонка).Текст или через построитель. Это рекомендуемый способ для регламентных загрузок, потому что он не зависит от внешних программ.

Типовой код чтения выглядит так:

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

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

Высота = ТабДок.ВысотаТаблицы;

Ширина = ТабДок.ШиринаТаблицы;

Для НомерСтроки = 2 По Высота Цикл // первая строка — шапка

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

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

Если ПустаяСтрока(Наименование) Тогда

Продолжить;

КонецЕсли;

// дальше — поиск номенклатуры и запись данных

КонецЦикла;

Параметр СпособЧтенияЗначенийТабличногоДокумента.Значение важен: он возвращает вычисленные значения ячеек, а не текст формул. Если файл содержит формулы и выбрать способ «Текст», в ячейках может оказаться сама формула.

Для чисел и дат помните: Область().Текст возвращает строку. Перед записью в базу преобразуйте её через Число() или Дата() с обработкой исключений, либо используйте свойство ПараметрРасшифровки/значение области. Надёжнее обернуть преобразование в попытку и логировать строки, которые не удалось разобрать.

bsl
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ИмяФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);
Для Стр = 2 По ТабДок.ВысотаТаблицы Цикл
    Значение = ТабДок.Область(Стр, 1).Текст;
КонецЦикла;

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

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

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

Excel.Visible = Ложь;

Excel.DisplayAlerts = Ложь;

Книга = Excel.Workbooks.Open(ИмяФайла);

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

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

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

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

КонецЦикла;

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

Excel.Quit();

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

Обязательно завершайте работу вызовами Close и Quit, иначе в памяти останется невидимый процесс EXCEL.EXE, который будет удерживать файл и накапливаться при каждой загрузке. Весь блок работы с Excel стоит оборачивать в Попытка ... Исключение с гарантированным закрытием в секции обработки ошибки.

Учтите: в 64-разрядном сервере 1С COM-вызов к 32-разрядному Excel (и наоборот) может завершаться ошибкой «Класс не зарегистрирован». Это одна из причин, почему на сервере предпочтителен табличный документ.

Определение структуры файла и сопоставление колонок

Реальные файлы от поставщиков редко имеют идеальную структуру: шапка может начинаться не с первой строки, порядок колонок меняется, встречаются объединённые ячейки и промежуточные итоги. Жёсткая привязка к номерам колонок — частая причина сбоев загрузки.

Надёжный приём — сначала найти строку заголовков, сканируя первые 10–20 строк на наличие ожидаемых названий («Артикул», «Наименование», «Цена»), и построить соответствие «имя колонки → номер колонки». Дальше читать данные по этому соответствию, а не по фиксированным номерам.

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

Порядок действий при загрузке файла
  1. 1
    Проверьте формат файла и то, что он не открыт в Excel у пользователя
  2. 2
    Найдите строку заголовков и постройте соответствие колонок
  3. 3
    Прочитайте данные построчно, пропуская пустые строки
  4. 4
    Преобразуйте строки в числа и даты с обработкой ошибок
  5. 5
    Найдите или создайте элементы справочников, проверьте дубли
  6. 6
    Запишите данные в транзакции и выведите протокол загрузки

Запись прочитанных данных в базу

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

Запись большого объёма данных выполняйте в транзакции или порциями (например, по 500–1000 строк с фиксацией). Полная транзакция на весь файл безопаснее с точки зрения целостности, но при десятках тысяч строк может привести к длинным блокировкам. Порционная запись требует возможности повторного запуска загрузки без дублей.

Всегда формируйте протокол: сколько строк прочитано, сколько загружено, какие строки пропущены и почему. Без протокола пользователь не сможет понять, почему из тысячи строк прайса загрузилось восемьсот.

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

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

Количество строк
Норма

Загружено столько строк, сколько содержательных строк в файле (минус шапка и пустые)

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

Разница без объяснений в протоколе — часть строк потеряна

Числа и даты
Норма

Цены числовые, даты в правильном порядке (день/месяц)

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

Цены как строки с пробелами, даты перевёрнуты (месяц/день)

Справочники
Норма

Элементы найдены по артикулу, новых дублей не создано

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

Появились дубли номенклатуры с похожими наименованиями

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

Ошибка «Ошибка при вызове метода контекста (Прочитать)» чаще всего означает, что файл открыт в Excel, повреждён или имеет расширение, не соответствующее содержимому (например, переименованный CSV). Проверьте, что файл закрыт, и откройте его в Excel вручную для диагностики.

Крайне распространена проблема с числами: Excel хранит число, а 1С читает текст с неразрывным пробелом или разделителем разрядов, и Число() падает. Лечится предварительной очисткой строки: замена неразрывных пробелов (Символ(160)) и удаление разделителей групп.

Ещё одна классика — даты в формате США (MM/DD/YYYY) или хранение даты как текста. Не полагайтесь на автоматическое преобразование: явно разбирайте строку даты по известному шаблону файла и собирайте дату через Дата(Год, Месяц, День).

Типичные ошибки при чтении Excel в 1С
01
Чтение по фиксированным номерам колонок — загрузка ломается, когда поставщик меняет порядок столбцов
02
Число() без очистки строки — ошибка преобразования из-за неразрывных пробелов и разделителей разрядов
03
Отсутствие Excel.Quit() при COM-чтении — зависшие процессы EXCEL.EXE и заблокированный файл
04
Чтение целиком в память без фильтрации — таймауты и нехватка памяти на файлах в десятки тысяч строк
05
Запись без протокола — невозможно понять, какие строки не загрузились и почему

Ограничения, альтернативы и оптимизация

Если формат файла под вашим контролем, договоритесь о выгрузке в CSV: чтение текстового файла через ЧтениеТекста или построчный разбор в разы быстрее и стабильнее, чем разбор XLSX. Единственные сложности — кодировка (UTF-8 предпочтительнее) и разделитель (точка с запятой в русской локали Excel).

Для очень больших файлов (сотни тысяч строк) табличный документ может не справиться по памяти. Варианты: попросить разбить файл, перейти на CSV и читать построчно, либо использовать внешние компоненты. В типовых конфигурациях есть готовые обработки загрузки из табличного документа (например, «Загрузка данных из файла» в БСП-based конфигурациях) — проверьте, не закрывает ли типовой механизм вашу задачу без разработки.

Наконец, при интерактивной загрузке на тонком клиенте помните: файл нужно сначала передать на сервер через НачатьПомещениеФайла (или поместить во временное хранилище), потому что серверный код не видит локальный диск пользователя.

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

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

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

Почему ТабличныйДокумент.Прочитать() выдаёт ошибку на файле XLSX?

Чаще всего файл открыт в Excel, повреждён или его расширение не соответствует содержимому (например, это CSV или HTML, переименованный в XLSX). Откройте файл в Excel и пересохраните — если он не открывается, проблема в самом файле.

Как прочитать конкретный лист книги Excel?

Через COM-объект лист выбирается по имени или индексу: Книга.Worksheets("Прайс"). Табличный документ при чтении загружает листы последовательно; для выборочной работы с листами без COM придётся разбирать структуру прочитанного документа или использовать сторонние библиотеки.

Почему числа из Excel превращаются в текст и как это исправить?

Метод Область().Текст возвращает отображаемую строку, которая может содержать неразрывные пробелы (Символ(160)) и разделители разрядов. Перед преобразованием очистите строку: СтрЗаменить(Значение, Символ(160), "") и удаление пробелов, затем вызывайте Число() внутри Попытка/Исключение.

Что быстрее для больших файлов — XLSX или CSV?

CSV существенно быстрее: файл читается построчно как текст без разбора структуры Excel-формата. Если источник данных может отдавать CSV в кодировке UTF-8 с фиксированным разделителем, это предпочтительный формат для регулярных больших загрузок.

Как избежать дублей при повторной загрузке одного файла?

Ищите существующие элементы по стабильному ключу (артикул, код, ИНН) перед созданием новых, а для документов и регистров храните признак загрузки (номер файла, дату) и перед записью удаляйте или перезаполняйте данные предыдущей загрузки. Тогда повторный запуск будет безопасен.

Итог

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

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