Работа с Excel-файлами в 1С:Предприятие — одна из самых востребованных задач при обмене данными. Бухгалтеры присылают прайс-листы в .xls, логисты — отчёты по доставке, а аналитики — сводные таблицы для импорта. При этом стандартные механизмы платформы не поддерживают прямой импорт Excel без дополнительных инструментов. В этой статье разберём все актуальные способы чтения .xls/.xlsx — от встроенных возможностей до внешних компонент, с примерами кода и разбором типичных ошибок.

Многие пользователи ошибочно полагают, что для работы с Excel в 1С обязательно нужен Microsoft Office или дорогостоящие компоненты. На самом деле есть как минимум 5 альтернативных методов — от бесплатных до профессиональных. Выбор зависит от версии платформы, объёма данных и требований к производительности. Например, для разового импорта небольшого прайса подойдёт COM-объект, а для автоматической обработки тысяч строк лучше использовать ADODB или специализированные библиотеки.

В статье вы найдёте:

  • 🔹 Сравнение всех методов по скорости и надёжности
  • 🔹 Пошаговые инструкции с готовым кодом для копирования
  • 🔹 Разбор ошибок (от "Файл не найден" до "Не удаётся создать OLE-объект")
  • 🔹 Советы по оптимизации для больших файлов (100 000+ строк)
📊 Какой способ чтения Excel вы используете в 1С?
Встроенные методы (ЗагрузкаДанныхИзТабличногоДокумента)
COM-объект (Excel.Application)
ADODB Connection
Внешние компоненты (OneScript.XLS и др.)
Ещё не пробовал

1. Встроенные методы 1С: ЗагрузкаДанныхИзТабличногоДокумента

Самый простой способ — использовать стандартную процедуру ЗагрузкаДанныхИзТабличногоДокумента(), которая доступна в 1С:Предприятие 8.3 (начиная с версии 8.3.10). Этот метод не требует установки дополнительных компонент и работает напрямую с файлами .xls и .xlsx.

Основные плюсы:

  • 🔸 Не нужны внешние библиотеки — всё встроено в платформу
  • 🔸 Поддерживает форматирование (цвета, шрифты, объединённые ячейки)
  • 🔸 Простой синтаксис — подходит для новичков

Пример кода для чтения файла и вывода данных в таблицу значений:


// Создаём объект табличного документа

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

// Загружаем файл Excel

ТабДок.Прочитать("C:\price_list.xlsx");

// Создаём таблицу значений для результата

ТЗ = Новый ТаблицаЗначений;

ТЗ.Колонки.Добавить("Номенклатура");

ТЗ.Колонки.Добавить("Цена");

ТЗ.Колонки.Добавить("Количество");

// Загружаем данные из Excel в ТЗ

ЗагрузкаДанныхИзТабличногоДокумента(ТЗ, ТабДок, Ложь);

// Выводим результат

Сообщить(ТЗ.Количество() + " строк загружено успешно!");

⚠️ Внимание: Метод ЗагрузкаДанныхИзТабличногоДокумента() имеет ограничение на размер файла — при попытке загрузить документ более 50 МБ возможны ошибки выделения памяти. Для больших файлов используйте ADODB или внешние компоненты.

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

ТабДок.Прочитать("C:\report.xlsx", ТипФайлаТабличногоДокумента.XLSX);

// Выбираем лист по имени

ТабДок.АктивныйЛист = ТабДок.Листы.НайтиПоИмени("Прайс");

// Устанавливаем область чтения (например, A1:D100)

ТабДок.Область("A1:D100").Выделить();

💡

Если Excel-файл защищён паролем, сначала откройте его вручную в Microsoft Excel, снимите защиту и сохраните без пароля. Встроенные методы 1С не поддерживают работу с защищёнными книгами.

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

Если встроенные методы не подходят (например, из-за сложной структуры файла), можно подключиться к Microsoft Excel напрямую через COM-объект. Этот способ требует установленного MS Office на компьютере, но даёт полный контроль над данными.

Преимущества метода:

  • 📊 Полный доступ к API Excel (формулы, сводные таблицы, макросы)
  • 📊 Поддержка всех форматов (.xls, .xlsx, .csv)
  • 📊 Возможность записи (не только чтение, но и редактирование файлов)

Пример кода для чтения данных с первого листа:

Попытка

// Создаём COM-объект Excel

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

// Открываем книгу (видимость = Ложь для фона)

Книга = Excel.Workbooks.Open("C:\data\report.xlsx");

Лист = Книга.Worksheets(1); // Первый лист

// Читаем диапазон A1:C10

Данные = Лист.Range("A1:C10").Value;

// Закрываем Excel

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

Excel.Quit();

// Преобразуем данные в таблицу значений

ТЗ = Новый ТаблицаЗначений;

Для Каждого Строка Из Данные Цикл

НоваяСтрока = ТЗ.Добавить();

НоваяСтрока.Номенклатура = Строка[1];

НоваяСтрока.Цена = Строка[2];

НоваяСтрока.Количество = Строка[3];

КонецЦикла;

Сообщить("Данные загружены: " + ТЗ.Количество() + " строк");

Исключение

Сообщить(ОписаниеОшибки());

КонецПопытки;

⚠️ Внимание: При работе с Excel.Application в фоновом режиме (Visible = False) возможны зависания процесса. Всегда явно закрывайте объекты через Quit() и освобождайте память с помощью ОсвободитьОбъект():

ОсвободитьОбъект(Лист);

ОсвободитьОбъект(Книга);

ОсвободитьОбъект(Excel);

Если при создании COM-объекта возникает ошибка "Не удаётся создать OLE-объект", проверьте:

  • 🔧 Установлен ли Microsoft Office (версия не ниже 2007)
  • 🔧 Запущена ли 1С от имени администратора (для регистрации библиотек)
  • 🔧 Разрешения на доступ к COM-объектам в настройках Windows
Что делать, если Excel висит в процессах после работы?

Если после выполнения кода в Диспетчере задач остаётся процесс EXCEL.EXE, значит объекты не были корректно освобождены. Используйте этот код для принудительного завершения:

Попытка

WMI = Новый COMОбъект("WbemScripting.SWbemLocator");

Сервис = WMI.ConnectServer(".", "root\cimv2");

Запрос = Сервис.ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'excel.exe'");

Для Каждого Процесс Из Запрос Цикл

Процесс.Terminate();

КонецЦикла;

Исключение

Сообщить("Не удалось завершить процессы Excel: " + ОписаниеОшибки());

КонецПопытки;

3. Использование ADODB Connection для высокой производительности

Для обработки больших файлов (от 10 000 строк) оптимально использовать ADODB Connection — технологию доступа к данным через OLE DB-провайдер. Этот метод в 3–5 раз быстрее, чем COM-объект, и не требует запуска Excel.

Как это работает:

  • 🚀 Прямое подключение к файлу как к базе данных
  • 🚀 Поддержка SQL-запросов (можно фильтровать данные при чтении)
  • 🚀 Минимальное потребление памяти

Пример кода для чтения файла .xlsx через ADODB:

Попытка

// Создаём соединение

Соединение = Новый COMОбъект("ADODB.Connection");

// Строки подключения для разных форматов

Если ПраваяСтрока(ИмяФайла, 4) = "xlsx" Тогда

строкаСоединения = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ИмяФайла + ";Extended Properties=""Excel 12.0 Xml;HDR=YES""";

Иначе // для .xls

строкаСоединения = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + ИмяФайла + ";Extended Properties=""Excel 8.0;HDR=YES""";

КонецЕсли;

Соединение.Open(строкаСоединения);

// Выполняем запрос (читаем лист "Прайс")

Запрос = Новый COMОбъект("ADODB.Recordset");

Запрос.Open("SELECT * FROM [Прайс$]", Соединение);

// Преобразуем в таблицу значений

ТЗ = Новый ТаблицаЗначений;

Пока Не Запрос.EOF Цикл

НоваяСтрока = ТЗ.Добавить();

Для Инд = 0 По Запрос.Fields.Count - 1 Цикл

ТЗ.Колонки.Добавить(Запрос.Fields(Инд).Name);

НоваяСтрока[Запрос.Fields(Инд).Name] = Запрос.Fields(Инд).Value;

КонецЦикла;

Запрос.MoveNext();

КонецЦикла;

Сообщить("Загружено " + ТЗ.Количество() + " строк");

Исключение

Сообщить(ОписаниеОшибки());

КонецПопытки;

Ключевые параметры строки подключения:

Параметр Описание Пример значения
Provider Провайдер OLE DB Microsoft.ACE.OLEDB.12.0 (для .xlsx)
Extended Properties Формат файла и настройки Excel 12.0 Xml;HDR=YES (первая строка — заголовки)
HDR Использовать первую строку как имена колонок YES или NO
IMEX Режим импорта/экспорта (для смешанных данных) 1 (чтение)
⚠️ Внимание: Для работы с Microsoft.ACE.OLEDB.12.0 на компьютере должен быть установлен Microsoft Access Database Engine (бесплатный пакет от Microsoft). Скачать можно с официального сайта (выбирайте версию x86, даже если у вас 64-битная система!).

Установить Microsoft Access Database Engine (x86)|Проверить права на доступ к файлу Excel|Убедиться, что файл не открыт в другом приложении|Создать резервную копию файла (на случай ошибок)-->

4. Внешние компоненты: OneScript.XLS, Aspose.Cells, Gembox

Если стандартные методы не подходят (например, нужно работать с .xlsb или сложными формулами), стоит рассмотреть внешние компоненты. Они платные, но предлагают расширенные возможности:

Популярные решения:

  • 📦 OneScript.XLS — бесплатная библиотека для OneScript, поддерживает чтение/запись, форматирование, графики
  • 📦 Aspose.Cells — профессиональный инструмент с поддержкой .xls, .xlsx, .csv, ODS
  • 📦 Gembox.Spreadsheet — лёгкая альтернатива с простым API
  • 📦 EPPlus (только для .xlsx) — оптимизирован для больших файлов

Пример использования OneScript.XLS:

// Подключаем библиотеку (предварительно скачайте OneScript.XLS)

ПодключитьВнешнююКомпоненту("C:\1C\v8\OneScript.XLS.dll");

XLS = Новый XLSДокумент;

// Открываем файл

XLS.Открыть("C:\data\report.xlsx");

// Получаем первый лист

Лист = XLS.Листы[0];

// Читаем ячейку A1

ЗначениеA1 = Лист.Ячейка("A1").Значение;

// Читаем диапазон A1:C10 в таблицу значений

ТЗ = Лист.ПрочитатьДиапазон("A1:C10");

// Закрываем файл

XLS.Закрыть();

Сравнение компонент по ключевым параметрам:

Компонента Бесплатная Поддержка .xls Поддержка .xlsx Производительность
OneScript.XLS Да Да Да Средняя
Aspose.Cells Нет Да Да Высокая
Gembox.Spreadsheet Условно-бесплатная Да Да Высокая
EPPlus Да (для некоммерческого использования) Нет Да Очень высокая
⚠️ Внимание: При использовании внешних компонент убедитесь, что они совместимы с вашей версией 1С:Предприятие (x86 или x64). Например, Aspose.Cells требует регистрации DLL через regsvr32.

5. Чтение Excel как XML (для форматов .xlsx)

Файлы .xlsx на самом деле представляют собой ZIP-архивы с XML-данными внутри. Этот метод позволяет читать Excel без внешних библиотек, но требует разархивирования файла и парсинга XML.

Когда это актуально:

  • 📁 Нет доступа к COM-объектам (например, в Linux-версии 1С)
  • 📁 Нужно минимальное потребление ресурсов
  • 📁 Файл имеет строгую структуру (без объединённых ячеек)

Пример кода для чтения .xlsx как XML:

// 1. Разархивируем файл (используем 7-Zip или встроенные средства)

ЗипФайл = Новый ЧтениеZipФайла("C:\data\report.xlsx");

ЗипФайл.Открыть();

// 2. Извлекаем файл sharedStrings.xml (содержит текстовые значения)

ТекстXML = ЗипФайл.Прочитать("xl\sharedStrings.xml");

// 3. Извлекаем лист (например, sheet1.xml)

ТекстЛиста = ЗипФайл.Прочитать("xl\worksheets\sheet1.xml");

ЗипФайл.Закрыть();

// 4. Парсим XML (используем XDTO или XPath)

XMLДокумент = Новый ЧтениеXML;

XMLДокумент.ОткрытьСтроку(ТекстЛиста);

// Пример: читаем ячейки из первой строки

СписокЯчеек = XMLДокумент.ПрочитатьПотомков("row[c=1]");

Для Каждого Ячейка Из СписокЯчеек Цикл

Сообщить(Ячейка.Атрибуты.Найти("r").Значение + ": " + Ячейка.ВнутреннийТекст);

КонецЦикла;

Структура .xlsx как ZIP-архива:

  • 📄 xl/workbook.xml — структура книги
  • 📄 xl/worksheets/sheet*.xml — данные листов
  • 📄 xl/sharedStrings.xml — текстовые значения
  • 📄 xl/styles.xml — стили ячеек
⚠️ Внимание: Этот метод не подходит для файлов .xls (старый формат Excel 97–2003). Также он чувствителен к изменениям структуры XML, которые могут возникнуть в новых версиях Excel.
💡

Чтение Excel как XML — самый универсальный способ для кроссплатформенных решений (например, для 1С на Linux), но требует глубокого понимания структуры файла.

6. Обработка ошибок и оптимизация производительности

При работе с Excel в 1С чаще всего возникают следующие ошибки:

Ошибка Причина Решение
Не удаётся создать OLE-объект Не установлен MS Office или нет прав Установить Office или использовать ADODB
Файл используется другим процессом Файл открыт в Excel или другой программе Закрыть файл или использовать копию
Недостаточно памяти Слишком большой файл для встроенных методов Использовать ADODB или внешние компоненты
Неверный формат файла Повреждённый файл или неверное расширение Открыть и пересохранить файл в Excel

Советы по оптимизации:

  • Читайте данные порциями (например, по 1000 строк за раз)
  • Отключайте обновление экрана при работе с COM-объектом:
Excel.ScreenUpdating = Ложь;
  • Используйте SQL-запросы в ADODB для фильтрации данных на этапе чтения:
Запрос.Open("SELECT * FROM [Лист1$A1:C100] WHERE F2 > 1000", Соединение);
  • Для повторяющихся операций кэшируйте данные в ТаблицуЗначений

Пример оптимизированного чтения больших файлов через ADODB:

// Читаем данные пакетами по 5000 строк

НачальнаяСтрока = 1;

РазмерПакета = 5000;

ТЗ = Новый ТаблицаЗначений;

Пока Истина Цикл

Запрос = Новый COMОбъект("ADODB.Recordset");

ТекстЗапроса = "SELECT * FROM [Лист1$A" + НачальнаяСтрока + ":Z" + (НачальнаяСтрока + РазмерПакета - 1) + "]";

Запрос.Open(ТекстЗапроса, Соединение);

Если Запрос.EOF Тогда

Прервать; // Данные закончились

КонецЕсли;

// Обрабатываем пакет

Пока Не Запрос.EOF Цикл

НоваяСтрока = ТЗ.Добавить();

НоваяСтрока.Артикул = Запрос.Fields("F1").Value;

НоваяСтрока.Цена = Запрос.Fields("F2").Value;

Запрос.MoveNext();

КонецЦикла;

НачальнаяСтрока = НачальнаяСтрока + РазмерПакета;

Сообщить("Обработано " + ТЗ.Количество() + " строк...");

КонецЦикла;

7. Альтернативные форматы: CSV и JSON как промежуточный вариант

Если работа с Excel вызывает сложности, рассмотрите возможность конвертации файлов в промежуточные форматы:

  • 📑 CSV — простой текстовый формат, поддерживается 1С "из коробки"
  • 📑 JSON — удобен для обмена данными с веб-сервисами
  • 📑 XML — подходит для структурированных данных

Пример чтения CSV-файла в 1С:

Текст = Новый ЧтениеТекста("C:\data\price_list.csv", КодировкаТекста.UTF8);

ТЗ = Новый ТаблицаЗначений;

ТЗ.Колонки.Добавить("Номенклатура");

ТЗ.Колонки.Добавить("Цена");

ТЗ.Колонки.Добавить("Количество");

// Пропускаем заголовок

Текст.ПрочитатьСтроку();

// Читаем данные

Пока Не Текст.KонецФайла() Цикл

Строка = Текст.ПрочитатьСтроку();

Данные = РазложитьСтрокуВМассивПодстрок(Строка, ";");

НоваяСтрока = ТЗ.Добавить();

НоваяСтрока.Номенклатура = Данные[0];

НоваяСтрока.Цена = Число(Данные[1]);

НоваяСтрока.Количество = Число(Данные[2]);

КонецЦикла;

Для конвертации .xlsx в .csv можно использовать:

  • 🔄 Excel (Сохранить как → CSV)
  • 🔄 Python-скрипт с библиотекой pandas
  • 🔄 Онлайн-конвертеры (например, Convertio)
⚠️ Внимание: При конвертации в CSV теряется форматирование, формулы и данные из нескольких листов. Всегда проверяйте результат на корректность!

FAQ: Частые вопросы по работе с Excel в 1С

🔹 Как прочитать Excel-файл на сервере 1С без установленного Office?

Используйте ADODB (требует Microsoft Access Database Engine) или внешние компоненты (например, Aspose.Cells). Также можно развернуть решение на основе OneScript.XLS или читать .xlsx как XML.

Если сервер работает под Linux, единственный надёжный вариант — конвертация в CSV/JSON до загрузки в 1С.

🔹 Почему при чтении через COM-объект русские буквы отображаются как "?????"?

Проблема связана с кодировкой. Решения:

  1. Укажите явную кодировку при чтении: Текст = Новый ЧтениеТекста(..., КодировкаТекста.UTF8);
  2. Сохраните файл Excel в формате CSV (UTF-8).
  3. Используйте ADODB с параметром IMEX=1 в строке подключения.
🔹 Можно ли прочитать защищённый паролем Excel-файл?

Встроенные методы 1С не поддерживают работу с защищёнными файлами. Варианты:

  • Снять защиту вручную в Excel и сохранить без пароля.
  • Использовать внешние компоненты (например, Aspose.Cells поддерживает пароли).
  • Для .xlsx можно вручную разархивировать файл, удалить xl/worksheets/sheet1.xml.rels (где хранится хэш пароля), и заново запаковать в ZIP.

⚠️ Внимание: удаление защиты может нарушить целостность данных!

🔹 Как ускорить чтение файла с 50 000 строк?

Оптимизация для больших файлов:

  1. Используйте ADODB с пакетным чтением (по 5000–10 000 строк за запрос).
  2. Отключите ненужные колонки в запросе: SELECT F1, F3 FROM [Лист1$].
  3. Читайте данные в ТаблицуЗначений без лишних преобразований.
  4. Для .xlsx рассмотрите чтение через XML (но это сложнее в реализации).

Пример оптимизированного запроса:

Запрос.Open("SELECT F1 AS Артикул, F2 AS Цена FROM [Лист1$A1:B50000] WHERE F2 > 0", Соединение);
🔹 Почему после чтения Excel-файла в 1С даты отображаются как числа (например, 44197)?

Excel хранит даты в виде чисел (количество дней с 1 января 1900 года). Чтобы преобразовать:

Функция ExcelДатаВ1С(ExcelДата)

Возврат Дата(1899, 12, 30) + Число(ExcelДата) + 1;

КонецФункции;

Пример использования:

ДатаПостав