Разработка и Конфигурация · 13 мин
1С: как прочитать файл Excel — все рабочие способы
Как прочитать файл Excel в 1С: чтение через табличный документ, COM-объект Excel и ADO. Примеры кода, типичные ошибки, ограничения и проверка результата.
Чтение файлов Excel — одна из самых частых задач при загрузке данных в 1С: прайсы поставщиков, остатки, списки сотрудников, банковские выгрузки. В зависимости от версии платформы, режима работы (тонкий клиент, веб-клиент, сервер) и формата файла (xls или xlsx) применяются разные подходы, и выбор неправильного способа приводит к ошибкам вида «метод не обнаружен» или к чтению пустых данных.
Основных способа три: чтение через объект «ТабличныйДокумент» (штатный и самый простой), чтение через COM-объект Excel.Application (гибкий, но требовательный к окружению) и чтение через ADO-драйверы (быстрый для больших файлов, но с ограничениями). Ниже разобран каждый способ с готовым кодом, условиями применимости и типичными проблемами.
Перед чтением важно понять структуру файла: есть ли строка заголовков, начинаются ли данные с первой строки, нет ли объединённых ячеек и нескольких листов. От этого зависит, как правильно обойти область данных и не потерять значения.
Выбор способа чтения: что учесть до написания кода
Первый критерий — место выполнения кода. Если обработка работает на сервере 1С под Linux, COM-объект Excel недоступен в принципе. Если это файловая база на компьютере бухгалтера с установленным Microsoft Office — COM доступен, но зависит от разрядности: 32-битный клиент 1С не увидит 64-битный Excel и наоборот.
Второй критерий — формат и качество файла. Метод ТабличныйДокумент.Прочитать() поддерживает форматы xlsx и xls (через встроенный механизм платформы), но не выполняет макросы и не вычисляет формулы заново: в ячейке с формулой вы получите последнее сохранённое Excel значение. Если файл формируется сторонней программой и формулы не рассчитаны, данные будут пустыми или нулевыми.
Третий критерий — объём. Для файлов на десятки тысяч строк чтение через ТабличныйДокумент может занять заметное время и потребовать много памяти, потому что создаётся полная модель документа со всеми оформлениями. ADO читает такие файлы быстрее, но требует установленного провайдера ACE OLEDB.
Как выбрать способ
Чтение через ТабличныйДокумент — универсальный способ
Объект ТабличныйДокумент умеет открывать файлы Excel напрямую методом Прочитать(). Это штатный механизм платформы, он не требует установленного Office и работает и на клиенте, и на сервере. Способ оптимален для типовой загрузки прайсов и справочных данных.
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать("C:\Данные\Прайс.xlsx", СпособЧтенияЗначенийТабличногоДокумента.Значение);
ВсегоСтрок = ТабДок.ВысотаТаблицы;
Для НомерСтроки = 2 По ВсегоСтрок Цикл // первая строка — заголовки
Артикул = ТабДок.Область(НомерСтроки, 1).Текст;
Наименование = ТабДок.Область(НомерСтроки, 2).Текст;
ЦенаТекст = ТабДок.Область(НомерСтроки, 3).Текст;
// дальше — поиск номенклатуры и создание документа
КонецЦикла;
Обратите внимание на параметр СпособЧтенияЗначенийТабличногоДокумента. Вариант «Значение» возвращает вычисленные значения ячеек, «Текст» — отображаемое представление с учётом формата ячейки. Для загрузки чисел и дат почти всегда нужен вариант «Значение», иначе сумма «1 234,56 ₽» придёт строкой с символом валюты.
После чтения данные доступны через область по номеру строки и колонки: Область(Строка, Колонка).Текст. Свойство ВысотаТаблицы даёт количество строк, ШиринаТаблицы — количество колонок. Если файл содержит несколько листов, Прочитать() по умолчанию загрузит первый; для выбора листа используйте вариант с указанием области или предварительно согласуйте с поставщиком файла, что данные всегда на первом листе.
Чтение на сервере и в веб-клиенте
На сервере файл сначала нужно туда передать. Типовая схема: на клиенте поместить файл во временное хранилище методом НачатьПомещениеФайла, на сервере получить двоичные данные, записать во временный файл через ПолучитьИмяВременногоФайла("xlsx") и прочитать его ТабличнымДокументом. После чтения временный файл удаляют.
В веб-клиенте прямой доступ к файловой системе пользователя закрыт, поэтому схема с временным хранилищем — единственная рабочая. Учитывайте, что большие файлы увеличивают трафик между клиентом и сервером.
Чтение через COM-объект Excel.Application
COM-подключение запускает настоящий Excel в фоне и даёт полный доступ к файлу: листы по именам, формулы, скрытые строки, форматирование. Это самый гибкий способ, но он работает только там, где установлен Microsoft Excel, и требует совпадения разрядности офиса и клиента 1С.
Попытка
Excel = Новый COMОбъект("Excel.Application");
Исключение
Сообщить("Excel не установлен или недоступен: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
Excel.Visible = Ложь;
Excel.DisplayAlerts = Ложь;
Книга = Excel.Workbooks.Open("C:\Данные\Прайс.xlsx");
Лист = Книга.Worksheets(1);
ВсегоСтрок = Лист.UsedRange.Rows.Count;
Для НомерСтроки = 2 По ВсегоСтрок Цикл
Артикул = СокрЛП(Лист.Cells(НомерСтроки, 1).Value);
Цена = Лист.Cells(НомерСтроки, 3).Value;
КонецЦикла;
Книга.Close(Ложь);
Excel.Quit();
Excel = Неопределено;
Критически важно завершать работу правильно: закрыть книгу, вызвать Quit() и обнулить переменную. Если этого не сделать, в диспетчере задач останутся зависшие процессы EXCEL.EXE, которые держат файлы и накапливаются при массовой загрузке. Оборачивайте работу с COM в Попытка/Исключение и завершайте Excel в секции исключения тоже.
Для ускорения чтения больших диапазонов вместо обращения к ячейкам по одной можно выгрузить весь UsedRange в массив: Данные = Лист.UsedRange.Value. Обход массива работает на порядок быстрее цикла по Cells.
Чтение через ADO: быстрый вариант для больших таблиц
ADO обращается к файлу Excel как к базе данных: лист становится таблицей, а данные выбираются SQL-подобным запросом. Способ требует установленного провайдера Microsoft.ACE.OLEDB (ставится с Office или отдельным дистрибутивом Access Database Engine) и подходит для больших однородных файлов.
Соединение = Новый COMОбъект("ADODB.Connection");
СтрокаПодключения = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Данные\Прайс.xlsx;"
+ "Extended Properties=""Excel 12.0 Xml;HDR=YES""";
Соединение.Open(СтрокаПодключения);
Набор = Новый COMОбъект("ADODB.Recordset");
Набор.Open("SELECT * FROM [Лист1$]", Соединение);
Пока НЕ Набор.EOF Цикл
Артикул = Набор.Fields(0).Value;
Набор.MoveNext();
КонецЦикла;
Набор.Close();
Соединение.Close();
Параметр HDR=YES означает, что первая строка — заголовки колонок. С ним удобно обращаться к полям по имени, но есть подводный камень: если в колонке смешаны числа и текст, драйвер определяет тип по первым строкам и может вернуть пустые значения для «неподходящих» ячеек. Лечится параметром IMEX=1 в строке подключения, который принудительно читает всё как текст.
Сравнение способов чтения Excel в 1С
Работает везде без Office, простой код. Медленнее на больших файлах, не пересчитывает формулы.
Полный доступ к файлу, листы и формулы. Требует установленный Excel, совпадение разрядности, риск зависших процессов.
Быстро на больших однородных таблицах, SQL-выборки. Требует провайдер, проблемы со смешанными типами данных.
Обработка данных после чтения: типы и проверки
Всё, что прочитано из Excel, по умолчанию — строка или число без гарантий. Перед загрузкой в базу каждое значение нужно привести к нужному типу и проверить. Числа приводите через ОписаниеТипов или функцию с обработкой исключения: строка «1 234,56» с неразрывным пробелом не преобразуется напрямую, пробелы нужно убрать.
Даты — отдельный источник ошибок. Excel хранит даты как числа, а пользователи вводят их в произвольном формате. Надёжный приём — попытаться распознать значение как дату, а при неудаче разобрать строку по шаблону «ДД.ММ.ГГГГ». Всегда проверяйте результат на разумность: дата 01.01.0001 означает, что разбор не удался.
Для ссылочных данных (номенклатура, контрагенты) ищите элементы по ключевым полям — артикулу, коду, ИНН — и фиксируйте строки, где поиск не удался. Хорошая практика: сначала прочитать весь файл в таблицу значений, показать пользователю результат сопоставления и только потом создавать документы. Это позволяет исправить данные до записи, а не отменять проведённые документы после.
Как проверить результат чтения
Совпадает с числом строк данных в файле (без заголовка)
Строк меньше — возможно, пустые строки в середине оборвали UsedRange
Суммы и количества распознаны как числа, итоги сходятся с файлом
Числа пришли строками с пробелами или обрезаны
Все даты в ожидаемом диапазоне
Появились даты 01.01.0001 или смещение на годы
Все артикулы/ИНН сопоставлены с базой
Есть несопоставленные строки — их нужно показать пользователю
Типичные ошибки и их причины
Ошибка «Ошибка при вызове конструктора (COMОбъект)» означает, что Excel не установлен, разрядность не совпадает или COM-регистрация повреждена. Проверяется установкой Excel на той же машине, где выполняется код — на сервере, а не на компьютере разработчика.
Ошибка «Файл не обнаружен» при чтении на сервере — классическая ситуация: путь «C:\Данные\...» существует на клиенте, но не на сервере. Решение — передача файла через временное хранилище, а не по сетевому пути.
Пустые значения вместо данных чаще всего означают одно из трёх: формулы не рассчитаны в файле, данные не на первом листе, либо при чтении через ADO сработало автоопределение типов. Диагностируйте, открыв файл в Excel вручную и проверив, что видно в ячейках и на каком листе лежат данные.
Проверка результата и границы самостоятельной работы
Минимальный контроль после загрузки: сверить количество загруженных строк с количеством строк в файле и сравнить 2–3 контрольные суммы (например, итог по колонке «Сумма») с итогом в Excel. Расхождение даже в одной строке — повод найти причину до продолжения работы.
Самостоятельно безопасно разрабатывать и отлаживать загрузку на копии базы. В рабочей базе любую новую обработку сначала запускайте в режиме «только чтение и показ данных», без записи документов. Если файл приходит от внешнего поставщика, учитывайте, что его структура может измениться без предупреждения — добавьте проверку наличия нужных колонок по заголовкам.
Если обработка будет использоваться регулярно и от неё зависят учётные данные, имеет смысл привлечь специалиста по 1С для рецензии кода: типовые риски — неявное создание дублей справочников, загрузка без контроля периодов и отсутствие журналирования ошибок.
- 1Передайте файл на сервер через временное хранилище или убедитесь, что путь доступен в месте выполнения кода
- 2Прочитайте файл через ТабличныйДокумент.Прочитать() со способом чтения «Значение»
- 3Обойдите строки начиная со второй, приведите значения к нужным типам
- 4Сопоставьте данные со справочниками и покажите пользователю таблицу результата
- 5После подтверждения создайте документы и сверьте количество строк и контрольные суммы
Частые вопросы
Можно ли прочитать xlsx без установленного Excel?
Да. Метод ТабличныйДокумент.Прочитать() работает с xlsx штатными средствами платформы и не требует Office. Это основной способ для серверов и веб-клиента. COM и ADO без установленного Excel или провайдера ACE работать не будут.
Почему вместо значений читаются пустые ячейки?
Чаще всего в ячейках формулы, которые не были рассчитаны при сохранении файла — 1С читает последнее сохранённое значение, а его нет. Откройте файл в Excel, пересохраните и прочитайте снова. Вторая причина — данные находятся не на первом листе.
Как прочитать конкретный лист книги Excel?
Через COM-объект лист выбирается по имени или индексу: Книга.Worksheets("Прайс"). При чтении через ADO имя листа указывается в запросе с символом доллара: [ИмяЛиста$]. ТабличныйДокумент по умолчанию читает первый лист, поэтому для многостраничных файлов удобнее COM.
Что делать с ошибкой создания COMОбъект("Excel.Application")?
Проверьте три вещи: установлен ли Microsoft Excel именно на той машине, где выполняется код (на сервере — при серверном вызове); совпадает ли разрядность Excel и клиента 1С; не заблокирован ли COM политиками безопасности. Если условия не выполняются, переходите на чтение через ТабличныйДокумент.
Как ускорить чтение большого файла на сотни тысяч строк?
Используйте ADO — он читает файл потоково, без построения модели документа. При COM-чтении выгружайте диапазон целиком в массив через UsedRange.Value вместо обращения к ячейкам по одной. Для ТабличногоДокумента ускорения почти нет — на очень больших файлах лучше предварительно конвертировать их в CSV.
Стоит ли конвертировать Excel в CSV перед загрузкой?
Для регулярных обменов — да, это упрощает и ускоряет загрузку: CSV читается построчно текстовым документом без ограничений по памяти. Минусы: нужно договориться о разделителе и кодировке, теряется информация о типах ячеек, а поставщик файла должен уметь выгружать CSV стабильно.
Что важно запомнить
Для большинства задач достаточно ТабличныйДокумент.Прочитать() — он работает везде и не требует Excel. COM даёт полный контроль, но требует установленный Office и аккуратного завершения процессов. ADO быстр на больших таблицах, но капризен к типам данных. В любом способе приводите значения к типам, проверяйте сопоставление со справочниками и сверяйте контрольные итоги после загрузки.