При работе с внешними COM-объектами в 1С 7.7 разработчики часто сталкиваются с неочевидными ошибками OLE. Одной из распространенных проблем является сбой вида {Документ...Форма.Модуль(378)}: : без текста ошибки при попытке считать значение ячейки. Разберем причины возникновения этой проблемы и проанализируем корректные варианты загрузки данных из Excel.
Выясним, почему возникает данная ошибка. В исходном коде чтение выполнялось через активную область: Эксэл.ActiveSheet.Cells(НомерСтроки,1).Value. Использование свойств ActiveSheet, ActiveWorkbook или ActiveCell в COM-автоматизации часто приводит к сбоям по следующим причинам:
Visible = 1), объект ActiveSheet может быть не инициализирован, из-за чего вызов методов возвращает пустую ошибку OLE.Чтобы исключить сбои, обратимся напрямую к конкретной книге и первому листу 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;
КонецЕсли;
Перебор строк в фиксированном цикле (например, По 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.Quit() и обнуляйте переменную COM-объекта (Excel = 0; или Excel = "";). В противном случае процесс EXCEL.EXE останется в памяти Windows и заблокирует повторные открытия файла.Text вместо Value:
ЗначениеСтроки = Лист.Cells(НомерСтроки, 1).Text;