Как исправить ошибку при чтении Excel в 1С 7.7 и корректно определить количество строк?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При работе с внешними COM-объектами в 1С 7.7 разработчики часто сталкиваются с неочевидными ошибками OLE. Одной из распространенных проблем является сбой вида {Документ...Форма.Модуль(378)}: : без текста ошибки при попытке считать значение ячейки. Разберем причины возникновения этой проблемы и проанализируем корректные варианты загрузки данных из Excel.

Причина возникновения ошибки OLE

Выясним, почему возникает данная ошибка. В исходном коде чтение выполнялось через активную область: Эксэл.ActiveSheet.Cells(НомерСтроки,1).Value. Использование свойств ActiveSheet, ActiveWorkbook или ActiveCell в COM-автоматизации часто приводит к сбоям по следующим причинам:

  1. Неопределенность контекста: Если Excel запускается в фоновом режиме (без отображения окна через Visible = 1), объект ActiveSheet может быть не инициализирован, из-за чего вызов методов возвращает пустую ошибку OLE.
  2. Зависание фоновых диалогов: При открытии файла Excel может выводить скрытые предупреждения (о защищенном виде, связях или формате), что блокирует доступ к активному листу.
  3. Сложные цепочки OLE-вызовов: Синтаксический анализатор 1С 7.7 нестабильно обрабатывает обращения с несколькими точками подряд к неявно полученным COM-объектам.

Шаг 1. Явное получение объектов книги и листа

Чтобы исключить сбои, обратимся напрямую к конкретной книге и первому листу Excel. Создание явных ссылок на объекты Workbooks и WorkSheets гарантирует стабильное чтение ячеек.

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


Перем ИмяФайла, ИмяКаталога;

Если Фс.ВыбратьФайл(0, ИмяФайла, ИмяКаталога, "Выберите файл", "Файлы Excel (*.xls) |*.xls") = 1 Тогда
    ТаблЗагрузки = СоздатьОбъект("ТаблицаЗначений");
    ТаблЗагрузки.НоваяКолонка("ТабНомер");
    ТаблЗагрузки.НоваяКолонка("ФИОСотрудн");
    ТаблЗагрузки.НоваяКолонка("СуммаКВыплате");
    
    Состояние("Открытие Excel...");
    Excel = СоздатьОбъект("Excel.Application");
    Excel.DisplayAlerts = 0; // Отключаем вывод предупреждающих сообщений Excel
    
    // Получаем явные объекты книги и листа
    Книга = Excel.Workbooks.Open(СокрЛП(ИмяКаталога + ИмяФайла));
    Лист = Книга.WorkSheets(1);
    
    // Чтение данных из первой строки
    ТаблЗагрузки.НоваяСтрока();
    ТаблЗагрузки.ТабНомер      = Строка(Лист.Cells(2, 1).Value);
    ТаблЗагрузки.ФИОСотрудн    = Строка(Лист.Cells(2, 2).Value);
    ТаблЗагрузки.СуммаКВыплате = Число(Лист.Cells(2, 3).Value);
    
    // Закрываем книгу и корректно завершаем процесс Excel
    Книга.Close();
    Excel.Quit();
    Excel = 0;
КонецЕсли;

Шаг 2. Динамическое определение количества строк и колонок

Перебор строк в фиксированном цикле (например, По 255) является плохой практикой. Проанализируем способы, позволяющие автоматически узнать точное количество заполненных строк и колонок на листе.

Способ 1. Использование SpecialCells(11)

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


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

Для НомерСтроки = 2 По ВсегоСтрок Цикл
    ТаблЗагрузки.НоваяСтрока();
    ТаблЗагрузки.ТабНомер      = Строка(Лист.Cells(НомерСтроки, 1).Value);
    ТаблЗагрузки.ФИОСотрудн    = Строка(Лист.Cells(НомерСтроки, 2).Value);
    ТаблЗагрузки.СуммаКВыплате = Число(Лист.Cells(НомерСтроки, 3).Value);
КонецЦикла;

Способ 2. Использование CurrentRegion

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

ВсегоСтрок = Лист.Cells(1, 1).CurrentRegion.Rows.Count;

Полезные рекомендации при работе с Excel в 1С 7.7

  1. Завершение процессов: Обязательно вызывайте метод Excel.Quit() и обнуляйте переменную COM-объекта (Excel = 0; или Excel = "";). В противном случае процесс EXCEL.EXE останется в памяти Windows и заблокирует повторные открытия файла.
  2. Альтернативные свойства ячеек: Если требуется получить строковое представление ячейки в том виде, как оно отформатировано в самом Excel (например, даты или числа с разделителями), используйте свойство Text вместо Value: ЗначениеСтроки = Лист.Cells(НомерСтроки, 1).Text;
← На главную