Загрузка данных из Excel в 1С 8.3: рабочие методы с примерами кода

· 10 мин

Содержание

Самый быстрый способ прочитать 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. Это важная деталь: в самом листе текст хранится не строкой, а ссылкой-индексом на элемент словаря строк. Поэтому алгоритм такой:

  1. Прочитать sharedStrings.xml объектом ЧтениеXML и собрать массив всех строковых значений по порядку.
  2. Прочитать sheet1.xml, перебирая ячейки (<c>); у ячейки с атрибутом t="s" значение внутри <v> — это индекс в массиве строк, у числовой ячейки — само число.
  3. Сопоставить индексы со словарём и собрать таблицу значений.

Способ требует больше кода, чем Прочитать(), зато не зависит ни от 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 повторяются из файла в файл. Найдите свой симптом и причину.

Диагностика: выберите симптом

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

Можно ли прочитать Excel на сервере 1С без установленного Excel?
Да. Метод ТабличныйДокумент.Прочитать() открывает .xls и .xlsx без Office, и этот способ работает на сервере. Разбор .xlsx как ZIP-архива тоже не требует Excel. А вот COM-объект и ADO без установленного Office или провайдера ACE не заработают.
Как прочитать не первый, а конкретный лист по имени?
Через COM лист берётся по имени: Книга.Sheets("Отчёт"). В ADO имя листа указывается в запросе: SELECT * FROM [Отчёт$]. Метод Прочитать() табличного документа читает активный лист целиком и выбор листа по имени не поддерживает.
Чем .xls отличается от .xlsx при чтении?
.xlsx — это ZIP с XML внутри, его можно разобрать штатными средствами платформы на любой ОС. .xls — бинарный формат, который без Excel или COM разобрать сложно. Для ADO разница в строке подключения: Excel 12.0 Xml для .xlsx и Excel 8.0 для .xls.
Почему число из Excel читается со сдвигом или как дата?
1С получает значение в том типе, в котором оно хранится в ячейке. Если в Excel формат ячейки «Дата», то и придёт дата. Чтобы получить ровно то, что видно на экране, читайте значение как текст и приводите тип сами через Число() или Дата().
Можно ли читать Excel в тонком или веб-клиенте?
Метод Прочитать() табличного документа доступен в тонком клиенте. COM-объект Excel.Application работает только в толстом клиенте под Windows. В веб-клиенте прямого доступа к COM нет — файл сначала помещают во временное хранилище и читают на сервере штатными средствами.