Разработка и Конфигурация · 12 мин
Как в 1С прочитать данные из файла Excel
Как в 1С прочитать файл Excel: чтение через табличный документ, COM-объект Excel.Application и внешние компоненты. Примеры кода, ошибки, FAQ.
Загрузка данных из Excel — одна из самых частых задач в 1С: прайсы поставщиков, остатки, списки контрагентов и номенклатуры почти всегда приходят именно в формате XLS или XLSX. Встроенные механизмы платформы позволяют прочитать такой файл без установленного Microsoft Office, а при необходимости — работать с книгой напрямую через COM-объект. Выбор способа зависит от версии платформы, режима работы (тонкий клиент, веб-клиент, сервер) и требований к скорости.
Основных подхода три: чтение файла в объект «Табличный документ» с последующим обходом ячеек, подключение к Excel через COM-объект Excel.Application и использование специализированных внешних компонент или готовых обработок. Первый способ универсален и работает даже на сервере без Office, второй даёт доступ к формулам, листам и форматированию, третий оправдан при больших объёмах.
Ниже разобраны все три сценария с примерами кода на встроенном языке 1С, типичными ошибками и способами проверки результата. Примеры применимы к платформе 8.3 в управляемых формах; для обычных форм отличия минимальны.
Выбор способа чтения: что учесть до написания кода
Прежде чем писать код, определите три вещи: где будет выполняться чтение (клиент или сервер), установлен ли на этой машине Microsoft Excel и какой объём данных нужно обработать. От ответов зависит и архитектура решения, и его надёжность.
Чтение через табличный документ — единственный вариант, который работает на сервере 1С без дополнительного ПО, в веб-клиенте и на Linux. COM-подключение требует установленного Excel и прав на создание COM-объектов, поэтому на 64-разрядном сервере оно часто недоступно или нестабильно. Для файлов на сотни тысяч строк оба способа медленные — там имеет смысл конвертировать файл в CSV или использовать внешние компоненты.
Сравнение способов чтения Excel
Работает везде, включая сервер и веб-клиент, не требует Office. Ограничение: читается только активный лист, формулы возвращаются как вычисленные значения.
Полный доступ к листам, формулам, именованным диапазонам. Ограничение: нужен установленный Excel, не работает в веб-клиенте, риск зависших процессов.
Максимальная скорость на больших объёмах. Ограничение: теряются типы данных, один лист на файл, нужна предварительная конвертация.
Чтение файла через табличный документ
Объект «Табличный документ» умеет открывать файлы форматов XLS, XLSX и ODS напрямую. После чтения содержимое листа становится доступно построчно через область ячеек. Это рекомендуемый способ по умолчанию: он не требует внешних зависимостей и одинаково работает на клиенте и на сервере.
Порядок действий: поместить файл во временное хранилище (в клиент-серверном режиме), создать объект ТабличныйДокумент, вызвать метод Прочитать с указанием пути и способа чтения, затем пройти циклом по строкам и колонкам. Границы данных определяют свойства ВысотаТаблицы и ШиринаТаблицы.
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ИмяФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);
Для НомерСтроки = 2 По ТабДок.ВысотаТаблицы Цикл
Наименование = ТабДок.Область("R" + НомерСтроки + "C1").Текст;
ЦенаСтрокой = ТабДок.Область("R" + НомерСтроки + "C2").Текст;
// дальше — преобразование типов и запись в базу
КонецЦикла;
Обратите внимание на способ чтения: СпособЧтенияЗначенийТабличногоДокумента.Значение возвращает вычисленные значения, а вариант «Текст» — отображаемое представление. Для загрузки чисел и дат надёжнее режим «Значение», иначе число с разделителями разрядов можно получить как строку с пробелами.
Доступ к ячейке через Область("R{Cтрока}C{Колонка}") — медленная операция при десятках тысяч обращений. Если файл большой, читайте данные в цикле с минимумом лишних обращений и отключите отображение табличного документа на форме до окончания загрузки.
- 1Поместите файл во временное хранилище или передайте путь на сервере
- 2Создайте объект ТабличныйДокумент и вызовите Прочитать() с режимом «Значение»
- 3Определите границы: ВысотаТаблицы и ШиринаТаблицы
- 4Пройдите циклом по строкам, пропустив строку заголовков
- 5Преобразуйте строковые значения в числа и даты с проверкой
- 6Запишите данные в базу в одной транзакции
Чтение через COM-объект Excel.Application
COM-подключение даёт полный контроль над книгой: можно выбрать конкретный лист по имени, прочитать формулы, узнать реальные границы UsedRange, обработать несколько листов за один запуск. Расплачиваться за это приходится требованием установленного Excel и потенциальной нестабильностью.
Типовой код подключения выглядит так. Обязательно оберните его в попытку/исключение и гарантированно завершайте процесс Excel в конце — иначе в системе останутся «висеть» невидимые экземпляры EXCEL.EXE, которые со временем исчерпают память сервера.
Попытка
Excel = Новый COMОбъект("Excel.Application");
Исключение
Сообщить("Excel не установлен или COM недоступен: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
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 = Неопределено;
Константа -4162 — это xlUp, числовой эквивалент встроенной константы Excel, поскольку через COM из 1С именованные константы недоступны. Поиск последней строки снизу вверх надёжнее, чем UsedRange: UsedRange может включать ранее отформатированные, но уже пустые строки.
Проверка и преобразование данных после чтения
Всё, что прочитано из Excel, по умолчанию недоверчиво: ячейка с «числом» может содержать текст, дата может быть строкой в произвольном формате, а вместо суммы — формула с ошибкой. Загрузка таких данных напрямую в справочники и документы приводит к дублям и битым ссылкам.
Минимальный набор проверок: строка не пустая, число преобразуется функцией Число() без исключения (предварительно убрав неразрывные пробелы и заменив запятую на точку при необходимости), дата распознаётся функцией Дата() или разбирается вручную. Для ссылочных полей — номенклатуры, контрагентов — сначала выполняйте поиск в базе и только при успехе пишите строку документа.
Полезный приём — загрузка в два прохода: сначала весь файл читается в таблицу значений с валидацией, пользователю показывается список ошибок с номерами строк Excel, и только после подтверждения данные записываются в базу. Это избавляет от частично загруженных документов, которые потом приходится искать и удалять вручную.
Как проверить результат загрузки
Совпадает с числом заполненных строк в файле минус заголовок
Строк меньше — часть отсеялась молча; больше — прочитаны пустые «хвосты» UsedRange
Суммы и количества в 1С сходятся с итогами в Excel
Расхождения на строки с разделителями разрядов или текстом вместо числа
Даты соответствуют исходным, год корректный
Даты «перевернулись» (день и месяц поменялись местами) на файлах с американским форматом
Типичные ошибки и их устранение
Самая частая жалоба — «файл не открывается». При работе на сервере причина почти всегда в том, что путь к файлу указывает на диск клиентской машины, недоступный серверу. Решение — передача файла через временное хранилище (ПоместитьВоВременноеХранилище) и извлечение его на сервере во временный файл.
Вторая группа ошибок — кодировка и формат. Файл с расширением XLSX, сохранённый сторонней программой с нарушениями стандарта, может не открыться табличным документом, хотя Excel его читает. В таком случае пересохраните файл в Excel или запросите у отправителя корректный файл. Формат XLSB (двоичная книга) табличный документ не читает вовсе — его нужно пересохранить в XLSX.
Третья группа — производительность. Построчное чтение через COM с обращением Cells(Стр, Кол).Value внутри двойного цикла на большом файле занимает минуты, потому что каждое обращение — отдельный COM-вызов. Ускорить можно чтением диапазона в массив одним обращением (Range.Value возвращает двумерный массив) или переходом на табличный документ.
Альтернативы: внешние компоненты и готовые обработки
Если штатные средства не справляются по скорости или функциональности, существуют внешние компоненты для чтения Excel, работающие без установленного Office и заметно быстрее перебора ячеек. Их подключают к конфигурации как внешние компоненты по технологии Native API или COM. Перед внедрением проверьте поддержку вашей разрядности платформы и лицензионные условия конкретной компоненты.
Для разовых загрузок часто достаточно готовых универсальных обработок загрузки из табличного документа, которые входят в состав типовых конфигураций или распространяются отдельно. Они позволяют настроить соответствие колонок файла реквизитам объектов без программирования. Это разумный выбор, когда задача — периодическая загрузка прайсов силами пользователя, а не разработка собственного механизма.
Наконец, простейший обходной путь для больших объёмов — сохранить лист в CSV и прочитать его как текстовый файл построчно. Скорость чтения текста на порядки выше, а потеря форматирования для обмена данными обычно несущественна. Минус — один лист на файл и необходимость договориться с отправителем о формате и разделителе.
Как выбрать способ чтения
Частые вопросы о чтении Excel в 1С
Можно ли прочитать XLSX без установленного Excel?
Да. Метод ТабличныйДокумент.Прочитать() открывает XLS, XLSX и ODS собственными средствами платформы, Office для этого не нужен. Ограничение — читается первый (активный) лист и только вычисленные значения, без доступа к формулам.
Почему табличный документ прочитал только один лист из нескольких?
Это штатное поведение: при чтении файла Excel в табличный документ загружается один лист. Если нужны остальные, используйте COM-подключение с перебором Worksheets либо сохраните каждый лист отдельным файлом.
Числа из Excel загружаются как текст. Что делать?
Причина обычно в неразрывных пробелах-разделителях разрядов или региональных настройках. Уберите из строки символы пробелов (включая неразрывный, код 160), приведите разделитель дробной части к точке или запятой в соответствии с ожиданиями функции Число(), и только потом преобразовывайте.
Как прочитать Excel в фоновом задании на сервере?
Только через табличный документ: передайте файл в фоновое задание через временное хранилище или параметром в виде двоичных данных, сохраните во временный файл на сервере и вызовите Прочитать(). COM-объекты в фоновых заданиях использовать не рекомендуется из-за риска зависших процессов.
Файл XLSB не открывается. Это исправимо?
Двоичный формат XLSB платформа не читает. Откройте файл в Excel и пересохраните его как XLSX, после чего оба способа чтения заработают. Если файлы приходят регулярно, договоритесь с отправителем о смене формата.
Как защититься от загрузки дублей в справочники?
Перед созданием элемента выполняйте поиск по ключевым полям: для номенклатуры — по артикулу или наименованию, для контрагентов — по ИНН и КПП. Загружайте данные в одной транзакции после полной валидации файла, чтобы при ошибке не оставалось частично записанных данных.
Что важно запомнить
Универсальный способ прочитать Excel в 1С — ТабличныйДокумент.Прочитать(): он работает без Office, на клиенте и на сервере. COM Excel.Application даёт больше возможностей, но требует установленного Excel и аккуратного завершения процесса. Любые прочитанные данные валидируйте и преобразовывайте типы до записи в базу, а большие объёмы выносите в CSV или внешние компоненты.