Предыстория.
В один из дней мне поступила проблема с загрузкой данных из Excel. Тот факт, что загрузка занимала много времени (несколько часов) – не был крайне критичным. Проблема была в том, что обработка загрузки начала завершаться ошибкой (не кода 1С).
Я приступил к выяснению подробностей на своём рабочем ПК. При выполнении обработки ПК завис. Я сделал предположение, что ПК завис из-за перегрева процессора, что потом и подтвердилось. Обработка загрузки из Excel практически на 100% загрузила все 4 ядра процессора. Я заменил вентилятор на процессоре, с помощью отладки выяснил, какая часть кода нагружает процессор. Выяснилось, что обращение к Excel.
Из-за чего возникла проблема.
Что делает Excel, когда на книгу устанавливаешь пароль? Шифрует файл. При загрузке данных из такого файла, каждый раз, при обращении к данным, этот файл дешифруется, что и нагружает процессор.
Решение.
Я перепробовал множество вариантов, и один из вариантов был успешным. Суть заключается в следующем: сохранить файл обмена во временном каталоге, сняв при этом пароль. После загрузки удалить временный файл. Ниже приведен пример кода.
Состояние("Декодирование файла");
ВременныйФайлЭксельПуть = КаталогВременныхФайлов() + "Импорт.xls";
ВременныйФайлЭксель = Новый Файл(ВременныйФайлЭксельПуть);
Если ВременныйФайлЭксель.Существует() Тогда
Попытка
УдалитьФайлы(ВременныйФайлЭксельПуть);
Исключение
Сообщить("Не удалось удалить временный файл.");
Возврат;
КонецПопытки;
КонецЕсли;
Эксель = Новый COMОбъект("Excel.Application");
Эксель.Workbooks.Open(ВыбФайл,0, 0, 1, ПарольНаЧтение, ПарольНаЗапись);
Эксель.Workbooks(1).SaveAs(ВременныйФайлЭксельПуть,18,"","");
Эксель.WorkBooks.Close();
Эксель = Неопределено;
Состояние("Получение данных из Excel");
//код загрузки из Excel
УдалитьФайлы(ВременныйФайлЭксельПуть);
Данные из Excel я загружаю при помощи объекта ADODB, описание работы с данным объектом есть в других статьях на сайте.
В результате загрузка из файла Excel стала занимать около одной минуты.