К статье
Практический материал

Разработка и Конфигурация · 12 мин

Как в 1С программно открыть файл Excel

Как программно открыть файл Excel из 1С: подключение через COM-объект, чтение через ADO, обработка ошибок, работа на сервере и типовые проблемы с примерами кода.

Задача программно открыть файл Excel из 1С возникает при загрузке прайсов, выгрузке отчётов, обмене данными с контрагентами и миграции справочников. Встроенный язык 1С не имеет собственного «родного» механизма работы с форматом .xlsx, поэтому на практике применяют несколько подходов: COM-автоматизацию через установленный Microsoft Excel, чтение через ADO без запуска Excel, работу через табличный документ 1С и сторонние библиотеки.

Выбор способа зависит от окружения: есть ли на компьютере установленный Excel, где выполняется код — на клиенте или на сервере, какого объёма файл и нужно ли только читать данные или также форматировать и сохранять книгу. Ниже разобраны основные методы с рабочими примерами кода, типичными ошибками и способами проверки результата.

Какие способы открытия Excel существуют в 1С

Универсального «лучшего» метода нет — у каждого подхода есть условия применения и ограничения. COM-автоматизация даёт полный доступ ко всем возможностям Excel: форматирование, формулы, макросы, сводные таблицы. Но она требует установленного Microsoft Excel той же разрядности, что и процесс 1С, и работает медленно на больших файлах.

Чтение через ADO (ActiveX Data Objects) позволяет обращаться к листу Excel как к таблице базы данных и выполнять SQL-запросы. Excel при этом не запускается, что удобно на сервере. Метод ТабличныйДокумент.Прочитать подходит для файлов, которые 1С способна интерпретировать, и не требует внешних компонентов, но возможности форматирования ограничены.

Сравнение вариантов

COM Excel.Application

Полный контроль над книгой, но нужен установленный Excel, совпадение разрядности и медленная работа на больших файлах

ADO + OLE DB

Быстрое чтение данных без запуска Excel, подходит для сервера, но только чтение табличных данных без форматирования

ТабличныйДокумент.Прочитать

Не требует внешних программ, работает везде, но поддержка форматов и формул ограничена

Открытие файла через COM-объект Excel.Application

Базовый сценарий выглядит так: создаётся COM-объект, отключается отображение окна, открывается книга по полному пути, выполняются действия, затем книга закрывается, а приложение завершается. Пример кода:

ФайлExcel = "C:\Данные\Прайс.xlsx";

Попытка

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

Исключение

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

Возврат;

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

Попытка

Excel.Visible = Ложь;

Excel.DisplayAlerts = Ложь;

Книга = Excel.Workbooks.Open(ФайлExcel);

Лист = Книга.Worksheets(1);

ЗначениеЯчейки = Лист.Cells(1, 1).Value;

Сообщить("A1 = " + ЗначениеЯчейки);

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

Excel.Quit();

Исключение

Сообщить("Ошибка работы с файлом: " + ОписаниеОшибки());

Попытка

Excel.Quit();

Исключение

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

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

Обратите внимание на три момента. Во-первых, создание объекта обёрнуто в отдельную попытку — если Excel не установлен, ошибка возникнет именно здесь. Во-вторых, свойство DisplayAlerts = Ложь подавляет диалоги Excel (запросы на сохранение, перезапись), которые в фоновом режиме повесят процесс. В-третьих, вызов Excel.Quit() обязателен: без него в памяти остаются невидимые процессы EXCEL.EXE, которые накапливаются и блокируют файлы.

Чтение диапазона данных

Построчное чтение через Cells медленное, потому что каждое обращение — отдельный COM-вызов. Для ускорения определяют последнюю заполненную строку и читают в цикле с минимумом обращений:

Лист = Книга.Worksheets(1);

ПоследняяСтрока = Лист.Cells(Лист.Rows.Count, 1).End(-4162).Row; // xlUp

Для НомерСтроки = 2 По ПоследняяСтрока Цикл

Артикул = Лист.Cells(НомерСтроки, 1).Value;

Цена = Лист.Cells(НомерСтроки, 3).Value;

// ... обработка данных

КонецЦикла;

Константа -4162 — это числовое значение xlUp, которое позволяет найти последнюю заполненную ячейку снизу вверх. Использование числовых литералов вместо именованных констант Excel — стандартная практика в 1С, так как перечисления Excel в COM-контексте недоступны.

Чтение файла через ADO без запуска Excel

ADO подключается к файлу Excel как к источнику данных через провайдер OLE DB. Для современных файлов .xlsx используется Microsoft ACE OLEDB, для старых .xls — Jet OLEDB. Лист воспринимается как таблица, имя которой записывается с символом доллара в квадратных скобках.

СтрокаПодключения =

"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ФайлExcel +

";Extended Properties=""Excel 12.0 Xml;HDR=YES""";

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

Соединение.Open(СтрокаПодключения);

Выборка = Соединение.Execute("SELECT * FROM [Лист1$]");

Пока Не Выборка.EOF Цикл

Сообщить(Выборка.Fields(0).Value);

Выборка.MoveNext();

КонецЦикла;

Соединение.Close();

Параметр HDR=YES указывает, что первая строка содержит заголовки колонок. Если заголовков нет, установите HDR=NO — тогда поля получат служебные имена F1, F2 и так далее. Учтите ограничение: провайдер определяет тип данных колонки по первым строкам, поэтому смешанные данные (числа и текст в одной колонке) могут читаться с потерями — часть значений вернётся как NULL.

Открытие файла через табличный документ 1С

Метод ТабличныйДокумент.Прочитать умеет загружать файлы Excel без внешних компонентов. Это самый простой способ, если нужно получить содержимое ячеек и не требуется сложная логика Excel:

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

Попытка

ТабДок.Прочитать(ФайлExcel, СпособЧтенияЗначенийТабличногоДокумента.Значение);

Исключение

Сообщить("Не удалось прочитать файл: " + ОписаниеОшибки());

Возврат;

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

Для НомерСтроки = 1 По ТабДок.ВысотаТаблицы Цикл

Значение = ТабДок.Область(НомерСтроки, 1).Текст;

// ... обработка

КонецЦикла;

Метод работает и на клиенте, и на сервере, не оставляет висящих процессов и не требует установленного Office. Ограничения: формулы возвращаются как вычисленные значения или текст, сложное форматирование и макросы игнорируются, очень большие файлы могут читаться медленно и потреблять много памяти.

Порядок действий при выборе метода
  1. 1
    Определите, где выполняется код: на клиенте или на сервере
  2. 2
    Проверьте, установлен ли Excel и совпадает ли разрядность с процессом 1С
  3. 3
    Если нужно только читать табличные данные — используйте ADO или ТабличныйДокумент.Прочитать
  4. 4
    Если нужно форматировать, считать формулы или сохранять книгу — используйте COM Excel.Application
  5. 5
    Обязательно оберните работу в Попытка/Исключение и закройте книгу и приложение
  6. 6
    Проверьте результат на копии файла, а не на рабочем документе

Работа на сервере и в фоновых заданиях

Главная ловушка серверного сценария — файл должен быть доступен с сервера 1С, а не с компьютера пользователя. Путь вида C:\Документы\прайс.xlsx на сервере укажет на локальный диск сервера. Поэтому файл сначала передают на сервер через временное хранилище: на клиенте вызывают НачатьПомещениеФайла, получают адрес хранилища, на сервере извлекают данные через ПолучитьИзВременногоХранилища и записывают во временный файл.

// На сервере

ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилища);

ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");

ДвоичныеДанные.Записать(ИмяВременногоФайла);

// далее открываем ИмяВременногоФайла выбранным способом

Второй момент — интерактивные операции. В фоновом задании нельзя показывать диалоги выбора файла и сообщения пользователю: все пути и параметры должны быть переданы заранее, а ошибки писаться в журнал регистрации через ЗаписьЖурналаРегистрации.

При массовой загрузке прайсов через COM полезно отключать пересчёт формул: Excel.Calculation = -4135 (xlCalculationManual) перед открытием книги заметно ускоряет работу с тяжёлыми файлами. После завершения верните автоматический режим.
ПЗ
Практическое замечание

Типичные ошибки и их устранение

Ошибка «Недопустимая строка с указанием класса» при создании COMОбъект означает, что Excel не установлен или разрядность не совпадает: 32-разрядный клиент 1С не увидит 64-разрядный Excel и наоборот. Решение — установить подходящую версию Office или перейти на ADO/ТабличныйДокумент.

Ошибка «файл занят другим процессом» возникает, если книга открыта у пользователя или осталась захваченной предыдущим зависшим процессом EXCEL.EXE. Проверьте диспетчер задач и завершите лишние процессы. В коде всегда вызывайте Close и Quit в ветке исключения, чтобы не плодить такие процессы.

Если через ADO часть значений читается пустыми, причина почти всегда в смешанных типах колонки. Обходные пути — добавить в строку подключения IMEX=1 или привести данные в файле к единому формату.

Типичные ошибки
01
Не вызван Excel.Quit() — в памяти копятся невидимые процессы EXCEL.EXE и блокируют файлы
02
Использование локального пути клиента в серверном коде — файл не находится, ошибка доступа
03
Чтение миллиона ячеек через Cells в цикле — обработка занимает часы из-за COM-вызовов
04
Отсутствие DisplayAlerts = Ложь — скрытый диалог Excel подвешивает фоновое задание
05
Игнорирование разрядности — COM и ACE требуют совпадения битности с процессом 1С

Проверка результата и безопасная отладка

Отлаживайте обработку на копии файла: если код записывает данные в книгу, ошибка в логике может испортить оригинал прайса или отчёта. Включите временно Excel.Visible = Истина — визуально видно, какой лист открылся и куда попадают данные. После отладки верните Ложь.

Контрольные точки после выполнения: файл закрыт (его можно открыть и переименовать), в диспетчере задач не осталось лишних процессов EXCEL.EXE, количество загруженных строк совпадает с ожидаемым, значения контрольных ячеек совпадают с источником. Для загрузок в базу полезно считать контрольные суммы — например, итог по колонке цен до и после переноса.

Контрольные точки

Как проверить результат

Процессы Excel после выполнения кода
Норма

Новых процессов EXCEL.EXE не осталось

Тревожный признак

Висят невидимые процессы — Quit не сработал

Доступность файла
Норма

Файл открывается и переименовывается без ошибок

Тревожный признак

Файл заблокирован процессом

Загруженные данные
Норма

Число строк и контрольные значения совпадают с файлом

Тревожный признак

Пустые значения в смешанных колонках или нехватка строк

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

Можно ли открыть Excel на сервере 1С под Linux?

COM-объект Excel.Application и ADO с OLE DB работают только в Windows. На Linux-сервере используйте ТабличныйДокумент.Прочитать, внешние компоненты по технологии Native API или предварительную конвертацию файла в CSV на стороне клиента.

Как открыть файл Excel, защищённый паролем?

При открытии через COM передайте пароль параметром метода Open: Excel.Workbooks.Open(Путь, , , , "Пароль"). Через ADO и ТабличныйДокумент зашифрованные файлы обычно не читаются — пароль придётся снять заранее.

Почему код работает на клиенте, но падает на сервере?

Наиболее вероятные причины: на сервере не установлен Excel или провайдер ACE, файл лежит на локальном диске клиента и недоступен серверу, либо у учётной записи службы сервера 1С нет прав на каталог с файлом.

Как ускорить чтение большого файла через COM?

Отключите обновление экрана, пересчёт формул и обработку событий, читайте данные не по одной ячейке, а массивом через свойство Value двумерного диапазона Range. Для очень больших файлов быстрее пересохранить данные в CSV и загрузить текстовый файл.

Можно ли создать новый файл Excel из 1С, а не открыть существующий?

Да. Через COM используйте Excel.Workbooks.Add() вместо Open, заполните ячейки и сохраните методом SaveAs с указанием пути и формата. Через ТабличныйДокумент заполните области и вызовите Записать с типом файла XLSX.

Что делать, если Excel не установлен ни у пользователя, ни на сервере?

Используйте ТабличныйДокумент.Прочитать для чтения и Записать для сохранения в формате XLSX. Альтернатива — попросить поставщика данных выгружать CSV: текстовый формат читается встроенными средствами 1С без каких-либо внешних компонентов.

Итог

Что важно запомнить

Для полного контроля над книгой используйте COM Excel.Application и обязательно закрывайте приложение через Quit. Для быстрого чтения данных без Excel применяйте ADO или ТабличныйДокумент.Прочитать. На сервере передавайте файл через временное хранилище, избегайте COM без необходимости и проверяйте отсутствие зависших процессов после выполнения.