Загрузка данных из Excel в 1С 8.3: рабочие методы с примерами кода
Содержание
Самый быстрый способ прочитать Excel в 1С 8.3 — метод Прочитать() табличного документа: он открывает файлы .xls и .xlsx без установленного Excel и работает как на клиенте, так и на сервере. Если нужен полный контроль над книгой (несколько листов, форматы ячеек, формулы) — данные из Excel загружают через COM-объект Excel.Application.
Методов чтения несколько, и рабочий выбор зависит от трёх вещей: стоит ли на машине Microsoft Excel, крутится ли база на сервере под Linux и какого размера файл. Разберём пять способов — от встроенного в платформу до разбора .xlsx вручную — с кодом и границами применимости каждого.
Все примеры написаны под платформу 8.3 (интерфейс «Такси»). Код на встроенном языке 1С работает и в толстом, и — где это оговорено — в тонком клиенте.
Какой способ чтения Excel выбрать
Прежде чем писать код, сопоставьте условия. Таблица показывает, какой метод подходит под вашу среду.
| Способ | Нужен Excel на машине | Работает на сервере под Linux | Скорость на больших файлах | Когда брать |
|---|---|---|---|---|
Метод Прочитать() табличного документа | Нет | Да (8.3.x) | Средняя | Разовая загрузка, простая структура данных |
COM-объект Excel.Application | Да | Нет | Низкая (по ячейкам) | Сложные книги, несколько листов, Windows |
| ADO через OLEDB | Нет (нужен провайдер ACE) | Нет | Высокая | Чтение запросом SELECT, выборка по условию |
Разбор .xlsx как архива | Нет | Да | Высокая | Сервер под Linux, большие объёмы, нет Excel |
| Готовая обработка загрузки | Зависит | Зависит | Зависит | Типовая конфигурация, загрузка справочников |
Правило простое: для разовой загрузки берите встроенный Прочитать(), для регулярного обмена на сервере — разбор .xlsx или CSV. COM-объект оставляйте для случаев, где без самого Excel не обойтись.
На сервере 1С под Linux COM-объект Windows недоступен в принципе. Если база живёт на Linux, сразу исключайте способы с Excel.Application и ADO — остаётся встроенный Прочитать() или разбор .xlsx.
Способ 1. Метод Прочитать() табличного документа — без Excel
Это штатный механизм платформы. Объект ТабличныйДокумент умеет читать .xls, .xlsx и .mxl напрямую, Microsoft Excel при этом ставить не нужно.
Код читает первый лист целиком и переносит значения в таблицу значений:
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать("C:\temp\data.xlsx");
Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Колонка1");
Таблица.Колонки.Добавить("Колонка2");
Таблица.Колонки.Добавить("Колонка3");
// Пропускаем первую строку, если это шапка
Для НомерСтроки = 2 По ТабДок.ВысотаТаблицы Цикл
НоваяСтрока = Таблица.Добавить();
НоваяСтрока.Колонка1 = ТабДок.Область(НомерСтроки, 1).Текст;
НоваяСтрока.Колонка2 = ТабДок.Область(НомерСтроки, 2).Текст;
НоваяСтрока.Колонка3 = ТабДок.Область(НомерСтроки, 3).Текст;
КонецЦикла;
Ключевые свойства: ВысотаТаблицы — число строк с данными, ШиринаТаблицы — число колонок. Метод Область(Строка, Колонка) возвращает одну ячейку, а .Текст — её содержимое строкой.
Если нужно именно число или дата, а не строка, читайте файл со способом чтения значений:
ТабДок.Прочитать("C:\temp\data.xlsx",
СпособЧтенияЗначенийТабличногоДокумента.Значение);
// теперь .Значение вернёт число/дату, а не текст
Сумма = ТабДок.Область(2, 3).Значение;
Плюсы метода: не требует Excel, работает на сервере, код короткий. Минус: весь документ грузится в память целиком, поэтому на книгах в сотни тысяч строк способ начинает упираться в оперативку.
Способ 2. Чтение Excel через COM-объект
Классический вариант для Windows, когда Excel установлен. Через COM вы получаете доступ ко всему объектному API Excel: листы по имени, форматы ячеек, объединённые диапазоны.
Эксель = Новый COMОбъект("Excel.Application");
Эксель.Visible = Ложь;
Эксель.DisplayAlerts = Ложь;
Книга = Эксель.Workbooks.Open("C:\temp\data.xlsx");
Лист = Книга.Sheets(1);
Диапазон = Лист.UsedRange;
ВсегоСтрок = Диапазон.Rows.Count;
Для НомерСтроки = 2 По ВсегоСтрок Цикл
Контрагент = Лист.Cells(НомерСтроки, 1).Value;
Сумма = Лист.Cells(НомерСтроки, 3).Value;
// ... обработка значений
КонецЦикла;
Книга.Close(Ложь);
Эксель.Quit();
Эксель = Неопределено;
Свойство UsedRange даёт реально заполненный диапазон, Rows.Count — количество строк в нём. Лист можно взять по номеру Sheets(1) или по имени Sheets("Выгрузка").
Обязательно закрывайте книгу и вызывайте Quit(), иначе процесс EXCEL.EXE останется висеть в памяти. При пакетной обработке десятков файлов такие «хвосты» быстро съедают сервер.
Главное ограничение: COM работает только на Windows и только там, где физически стоит Excel. Под сервером 1С, запущенным как служба, COM часто недоступен — служба крутится под системной учётной записью без доступа к Office. Поэтому COM-способ — это, как правило, клиентская машина пользователя, а не серверный обмен.
Ещё один нюанс: обращение к ячейкам по одной (Cells(i, j).Value) — медленная операция, каждый вызов идёт через COM-мост. На больших файлах чтение всего UsedRange.Value одним обращением в массив работает в разы быстрее перебора ячеек.
Способ 3. Подключение к Excel через ADO и OLEDB
ADO читает книгу Excel как базу данных: лист становится таблицей, а строки выбираются SQL-запросом. Excel при этом ставить не обязательно — нужен OLEDB-провайдер Microsoft.ACE.OLEDB.12.0 (входит в Access Database Engine) той же разрядности, что и платформа 1С.
Соединение = Новый COMОбъект("ADODB.Connection");
СтрокаПодключения =
"Provider=Microsoft.ACE.OLEDB.12.0;"
+ "Data Source=C:\temp\data.xlsx;"
+ "Extended Properties=""Excel 12.0 Xml;HDR=YES"";";
Соединение.Open(СтрокаПодключения);
Набор = Новый COMОбъект("ADODB.Recordset");
Набор.Open("SELECT * FROM [Лист1$]", Соединение);
Пока НЕ Набор.EOF() Цикл
Контрагент = Набор.Fields("Контрагент").Value;
Сумма = Набор.Fields("Сумма").Value;
Набор.MoveNext();
КонецЦикла;
Набор.Close();
Соединение.Close();
Параметр HDR=YES говорит, что первая строка — заголовки колонок, и тогда к полям можно обращаться по имени. Имя листа в запросе пишется с долларом и в квадратных скобках: [Лист1$]. Для старого формата .xls в строке подключения указывают Excel 8.0 вместо Excel 12.0 Xml.
Сильная сторона ADO — можно выбрать только нужные строки и колонки запросом, не перебирая весь лист. Слабая — требует установленного провайдера ACE нужной разрядности, что не всегда есть на машине пользователя, и, как любой COM, не работает под Linux.
Способ 4. Разбор xlsx как архива — для сервера под Linux
Файл .xlsx — это обычный ZIP-архив с XML внутри. Когда база работает на сервере под Linux, а Excel и COM недоступны, этот способ остаётся самым надёжным: платформа умеет и распаковывать ZIP, и читать XML штатно.
Сначала распаковываем файл встроенным объектом ЧтениеZipФайла:
ПутьРаспаковки = ПолучитьИмяВременногоФайла();
СоздатьКаталог(ПутьРаспаковки);
Чтение = Новый ЧтениеZipФайла("/tmp/data.xlsx");
Чтение.ИзвлечьВсе(ПутьРаспаковки,
РежимВосстановленияПутейФайловZIP.Восстанавливать);
Чтение.Закрыть();
После распаковки данные листов лежат в xl/worksheets/sheet1.xml, а текстовые значения вынесены в отдельный словарь xl/sharedStrings.xml. Это важная деталь: в самом листе текст хранится не строкой, а ссылкой-индексом на элемент словаря строк. Поэтому алгоритм такой:
- Прочитать
sharedStrings.xmlобъектомЧтениеXMLи собрать массив всех строковых значений по порядку. - Прочитать
sheet1.xml, перебирая ячейки (<c>); у ячейки с атрибутомt="s"значение внутри<v>— это индекс в массиве строк, у числовой ячейки — само число. - Сопоставить индексы со словарём и собрать таблицу значений.
Способ требует больше кода, чем Прочитать(), зато не зависит ни от Excel, ни от операционной системы и экономно расходует память — файл можно читать потоково. Это рабочий вариант для регулярных серверных обменов, где установка Office исключена.
Если структура файла фиксированная и строк очень много, чаще проще договориться на выгрузку в CSV — его парсинг на порядок проще разбора XML. Про CSV — в разделе про большие файлы.
Способ 5. Готовые механизмы загрузки в типовых конфигурациях
Писать код нужно не всегда. В типовых конфигурациях (БП 3.0, ЗУП 3.1, УТ 11) часть загрузок из Excel уже реализована, и для разовой задачи это самый безопасный путь.
Что есть из коробки:
- 📥 Загрузка номенклатуры, контрагентов и цен из внешнего файла — в карточках и списках соответствующих справочников есть команды загрузки из табличного документа.
- 📥 Загрузка банковских выписок и платёжных документов — в разделе, где ведётся банк и касса.
- 📥 Универсальная внешняя обработка «Загрузка данных из табличного документа» — отдельный файл
.epf, который сопоставляет колонки Excel с реквизитами любого объекта базы и подходит, когда встроенной загрузки под ваш объект нет.
Чтобы найти встроенную загрузку, откройте форму списка нужного справочника и ищите в командной панели команду с иконкой загрузки или пункт в меню «Ещё». Если конкретной кнопки нет, подключается универсальная внешняя обработка через меню Файл → Открыть (для варианта с открытием файла обработки) либо регистрируется в списке дополнительных обработок.
Внешние обработки запускайте только из проверенного источника. Чужой .epf исполняется с правами пользователя и может изменить данные в базе. Перед массовой загрузкой в рабочую базу сделайте резервную копию.
Готовые механизмы снимают с вас разбор форматов и сопоставление колонок, но негибки: нестандартную структуру файла или сложную логику проверки через них не реализуешь — тогда возвращаемся к коду.
Большие файлы и формат CSV: что ускоряет чтение
На файлах в десятки и сотни тысяч строк выбор метода решает всё. Несколько приёмов, которые реально ускоряют чтение.
Не читайте по ячейке через COM. Каждое обращение Cells(i, j).Value — отдельный вызов через COM-мост. Чтение всего диапазона UsedRange.Value одним обращением в массив быстрее построчного перебора в разы.
Ограничивайте диапазон. Если нужны три колонки из тридцати — читайте только их. В ADO это делается запросом SELECT, в COM — явными границами диапазона, а не всем листом.
Для регулярного обмена просите CSV. Текстовый .csv читается потоково, строка за строкой, с минимальным расходом памяти и без всяких зависимостей от Excel:
Чтение = Новый ЧтениеТекста("/tmp/data.csv", КодировкаТекста.UTF8);
Строка = Чтение.ПрочитатьСтроку();
Пока Строка <> Неопределено Цикл
Поля = СтрРазделить(Строка, ";", Ложь);
Контрагент = Поля[0];
Сумма = Поля[2];
Строка = Чтение.ПрочитатьСтроку();
КонецЦикла;
Чтение.Закрыть();
CSV выигрывает у Excel по скорости и памяти, но теряет типы данных и форматирование — всё приходит текстом, числа и даты нужно приводить вручную через Число() и Дата(). Для выгрузки «плоской» таблицы это обычно и не мешает.
Отдельно следите за кодировкой: выгруженный из Excel CSV часто идёт в Windows-1251, а не в UTF-8. Укажете не ту кодировку при чтении — получите кириллицу «кракозябрами».
Типичные ошибки при чтении Excel
Большинство сбоев при загрузке из Excel повторяются из файла в файл. Найдите свой симптом и причину.
Прочитать() табличного документа или разбор .xlsx как архива.1cv8 (32 или 64 бита).Quit(). Всегда завершайте работу: Книга.Close(Ложь); Эксель.Quit(); Эксель = Неопределено;..Текст без способа «Значение») или заранее задайте в Excel текстовый формат колонки.Windows-1251 — укажите её в Новый ЧтениеТекста(Путь, КодировкаТекста.ANSI) или перекодируйте файл в UTF-8.Прочитать() или разбор .xlsx как ZIP-архива.Частые вопросы
Можно ли прочитать Excel на сервере 1С без установленного Excel?
ТабличныйДокумент.Прочитать() открывает .xls и .xlsx без Office, и этот способ работает на сервере. Разбор .xlsx как ZIP-архива тоже не требует Excel. А вот COM-объект и ADO без установленного Office или провайдера ACE не заработают.Как прочитать не первый, а конкретный лист по имени?
Книга.Sheets("Отчёт"). В ADO имя листа указывается в запросе: SELECT * FROM [Отчёт$]. Метод Прочитать() табличного документа читает активный лист целиком и выбор листа по имени не поддерживает.Чем .xls отличается от .xlsx при чтении?
.xlsx — это ZIP с XML внутри, его можно разобрать штатными средствами платформы на любой ОС. .xls — бинарный формат, который без Excel или COM разобрать сложно. Для ADO разница в строке подключения: Excel 12.0 Xml для .xlsx и Excel 8.0 для .xls.Почему число из Excel читается со сдвигом или как дата?
Число() или Дата().Можно ли читать Excel в тонком или веб-клиенте?
Прочитать() табличного документа доступен в тонком клиенте. COM-объект Excel.Application работает только в толстом клиенте под Windows. В веб-клиенте прямого доступа к COM нет — файл сначала помещают во временное хранилище и читают на сервере штатными средствами.