Работа с внешними данными — одна из самых частых задач разработчика 1С. Файлы Excel остаются основным форматом обмена информацией между контрагентами и внутренними отделами. В данной статье мы подробно разберем, как прочитать данные из файла .xls или .xlsx, проанализируем типичные ошибки при использовании COM-соединения и выясним, как правильно настроить сервер для работы с Excel в фоновых заданиях.
Это классический метод, который позволяет полностью управлять приложением 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 — последней ячейке, в которой есть данные или форматирование. Это позволяет быстро определить размер таблицы.
Если вам нужно просто прочитать данные без сложной логики Excel, лучше воспользоваться встроенным методом 1С Прочитать() для объекта ТабличныйДокумент. Этот метод работает быстрее и не требует наличия установленного Microsoft Office, что особенно критично для современных серверов на Linux.
Разберем, как это реализовать:
ТабДок = Новый ТабличныйДокумент;
Попытка
// Метод Прочитать понимает форматы .xlsx и .xls
ТабДок.Прочитать("C:\temp\data.xlsx");
Исключение
Сообщить("Ошибка чтения файла: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// Теперь перебираем строки и колонки табличного документа
ВсегоСтрок = ТабДок.ВысотаТаблицы;
ВсегоКолонок = ТабДок.ШиринаТаблицы;
Для Стр = 1 По ВсегоСтрок Цикл
Для Кол = 1 По ВсегоКолонок Цикл
ТекстЯчейки = ТабДок.Область(Стр, Кол).Текст;
// Обработка данных...
КонецЦикла;
КонецЦикла;
Этот метод значительно стабильнее, так как не создает лишних процессов в операционной системе и не зависит от настроек DCOM.
В процессе обсуждения на форуме возникла ошибка: Значение не является значением объектного типа (Cells). Проанализируем причину. Она заключается в попытке обращения к свойству Cells напрямую у объекта Excel.Application, в то время как это свойство принадлежит объекту WorkSheet (Лист).
Типичная ошибка: разработчик инициализирует приложение Excel = ПолучитьCOMОбъект(,"Excel.Application"), но забывает открыть книгу (Workbook) и выбрать лист. Чтобы избежать этой ошибки, всегда соблюдайте иерархию объектов: Application -> Workbook -> Worksheet -> Range/Cells.
Если ваш код должен запускаться по расписанию на сервере, вы можете столкнуться с ошибкой инициализации COM-объекта. Выясним основные причины и способы их решения:
USR1CV8). У этой записи часто нет прав на запуск приложений Office и доступа к папкам. Как показал опыт участников форума, решение заключается в создании специального пользователя в домене с необходимыми правами и запуске службы 1С от его имени.dcomcnfg.exe, найти компонент Microsoft Excel Application и на вкладке "Удостоверение" указать конкретного пользователя.Desktop в профиле пользователя, под которым запускается служба. Для 64-битных систем создайте папку вручную по адресу: C:\Windows\SysWOW64\config\systemprofile\Desktop.Построчное чтение тысяч ячеек через COM — это очень медленная операция, так как каждое обращение к Cells(i, j) требует времени на взаимодействие между процессами 1С и Excel. Чтобы ускорить работу в десятки раз, рекомендуется использовать выгрузку всей области данных в массив.
Рассмотрим, как это сделать:
// Получаем сразу все данные листа в виде двумерного массива
ДанныеМассивом = Лист.UsedRange.Value.Выгрузить();
// Теперь работаем с обычным массивом 1С, что на порядки быстрее
ВсегоСтрок = ДанныеМассивом.Количество();
Если ВсегоСтрок > 0 Тогда
ВсегоКолонок = ДанныеМассивом[0].Количество();
Для ИндексСтроки = 0 По ВсегоСтрок - 1 Цикл
Для ИндексКолонки = 0 По ВсегоКолонок - 1 Цикл
Значение = ДанныеМассивом[ИндексСтроки][ИндексКолонки];
КонецЦикла;
КонецЦикла;
КонецЕсли;
Резюме: Если вы работаете на платформе выше 8.3.6 и вам нужно просто прочитать данные — выбирайте ТабличныйДокумент. Если же требуется сложная работа с файлом (формулы, форматы), используйте COM-объект, но не забывайте о правильной иерархии объектов и закрытии процессов excel.exe после завершения работы.