Как прочитать информацию из Excel файла в 1С?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

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

Способ 1: Использование COM-объекта (Excel.Application)

Это классический метод, который позволяет полностью управлять приложением Microsoft Excel. Он дает максимальную гибкость: вы можете не только читать значения, но и выполнять макросы, пересчитывать формулы и работать со сложным форматированием. Однако этот способ требует наличия установленного Microsoft Office на том компьютере (или сервере), где выполняется код.

Рассмотрим пример кода, который открывает файл и считывает данные из ячеек:


// Создаем объект приложения
Попытка
    Excel = Новый COMОбъект("Excel.Application");
Исключение
    Сообщить("Excel не установлен на данном компьютере!");
    Возврат;
КонецПопытки;

// Открываем книгу
Попытка
    ПутьКФайлу = "C:\mydata\file.xlsx";
    Книга = Excel.Workbooks.Open(ПутьКФайлу);
Исключение
    Excel.Quit();
    Сообщить("Не удалось открыть файл: " + ПутьКФайлу);
    Возврат;
КонецПопытки;

// Выбираем первый лист
Лист = Книга.WorkSheets(1);

// Определяем границы заполненной области
ВсегоСтрок = Лист.Cells.SpecialCells(11).Row;
ВсегоКолонок = Лист.Cells.SpecialCells(11).Column;

Для НомерСтроки = 1 По ВсегоСтрок Цикл
    Для НомерКолонки = 1 По ВсегоКолонок Цикл
        // Чтение значения из ячейки
        Значение = Лист.Cells(НомерСтроки, НомерКолонки).Value;
        // Здесь выполняется логика обработки данных
    КонецЦикла;
КонецЦикла;

// Обязательно закрываем приложение и обнуляем переменные
Книга.Close(Ложь);
Excel.Quit();
Excel = Неопределено;

Важный момент: Обратите внимание на использование SpecialCells(11). Константа 11 в объектной модели Excel соответствует xlCellTypeLastCell — последней ячейке, в которой есть данные или форматирование. Это позволяет быстро определить размер таблицы.

Способ 2: Загрузка через Табличный документ (без COM)

Если вам нужно просто прочитать данные без сложной логики Excel, лучше воспользоваться встроенным методом 1С Прочитать() для объекта ТабличныйДокумент. Этот метод работает быстрее и не требует наличия установленного Microsoft Office, что особенно критично для современных серверов на Linux.

Разберем, как это реализовать:


ТабДок = Новый ТабличныйДокумент;
Попытка
    // Метод Прочитать понимает форматы .xlsx и .xls
    ТабДок.Прочитать("C:\temp\data.xlsx");
Исключение
    Сообщить("Ошибка чтения файла: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

// Теперь перебираем строки и колонки табличного документа
ВсегоСтрок = ТабДок.ВысотаТаблицы;
ВсегоКолонок = ТабДок.ШиринаТаблицы;

Для Стр = 1 По ВсегоСтрок Цикл
    Для Кол = 1 По ВсегоКолонок Цикл
        ТекстЯчейки = ТабДок.Область(Стр, Кол).Текст;
        // Обработка данных...
    КонецЦикла;
КонецЦикла;

Этот метод значительно стабильнее, так как не создает лишних процессов в операционной системе и не зависит от настроек DCOM.

Анализ ошибки: Значение не является значением объектного типа (Cells)

В процессе обсуждения на форуме возникла ошибка: Значение не является значением объектного типа (Cells). Проанализируем причину. Она заключается в попытке обращения к свойству Cells напрямую у объекта Excel.Application, в то время как это свойство принадлежит объекту WorkSheet (Лист).

Типичная ошибка: разработчик инициализирует приложение Excel = ПолучитьCOMОбъект(,"Excel.Application"), но забывает открыть книгу (Workbook) и выбрать лист. Чтобы избежать этой ошибки, всегда соблюдайте иерархию объектов: Application -> Workbook -> Worksheet -> Range/Cells.

Особенности работы в фоновых (регламентных) заданиях

Если ваш код должен запускаться по расписанию на сервере, вы можете столкнуться с ошибкой инициализации COM-объекта. Выясним основные причины и способы их решения:

  1. Права службы 1С: По умолчанию служба "Агент сервера 1С:Предприятия" запускается от имени системной учетной записи (например, USR1CV8). У этой записи часто нет прав на запуск приложений Office и доступа к папкам. Как показал опыт участников форума, решение заключается в создании специального пользователя в домене с необходимыми правами и запуске службы 1С от его имени.
  2. Настройка DCOM: Требуется запустить dcomcnfg.exe, найти компонент Microsoft Excel Application и на вкладке "Удостоверение" указать конкретного пользователя.
  3. Отсутствие папок профиля: Excel требует наличия папки Desktop в профиле пользователя, под которым запускается служба. Для 64-битных систем создайте папку вручную по адресу: C:\Windows\SysWOW64\config\systemprofile\Desktop.

Оптимизация: Массовое чтение данных (UsedRange)

Построчное чтение тысяч ячеек через COM — это очень медленная операция, так как каждое обращение к Cells(i, j) требует времени на взаимодействие между процессами 1С и Excel. Чтобы ускорить работу в десятки раз, рекомендуется использовать выгрузку всей области данных в массив.

Рассмотрим, как это сделать:


// Получаем сразу все данные листа в виде двумерного массива
ДанныеМассивом = Лист.UsedRange.Value.Выгрузить();

// Теперь работаем с обычным массивом 1С, что на порядки быстрее
ВсегоСтрок = ДанныеМассивом.Количество();
Если ВсегоСтрок > 0 Тогда
    ВсегоКолонок = ДанныеМассивом[0].Количество();
    
    Для ИндексСтроки = 0 По ВсегоСтрок - 1 Цикл
        Для ИндексКолонки = 0 По ВсегоКолонок - 1 Цикл
            Значение = ДанныеМассивом[ИндексСтроки][ИндексКолонки];
        КонецЦикла;
    КонецЦикла;
КонецЕсли;

Резюме: Если вы работаете на платформе выше 8.3.6 и вам нужно просто прочитать данные — выбирайте ТабличныйДокумент. Если же требуется сложная работа с файлом (формулы, форматы), используйте COM-объект, но не забывайте о правильной иерархии объектов и закрытии процессов excel.exe после завершения работы.

← На главную