Загрузка данных из внешних файлов Excel является одной из самых частых задач, с которыми сталкивается разработчик 1С. Это может быть импорт прайс-листов, остатков товаров, справочников контрагентов или данных для формирования сложных отчетов. В данной статье мы подробно разберем основные методы работы с файлами Microsoft Excel, проанализируем их преимущества и недостатки, а также научимся обходить типовые ошибки при работе на сервере.
Классический способ взаимодействия с файлами Excel заключается в использовании механизма COM (Component Object Model). Этот метод позволяет управлять установленным в системе приложением Excel напрямую из кода 1С. Рассмотрим подробнее, как реализовать этот алгоритм. Прежде всего, необходимо убедиться, что на компьютере, где выполняется код (клиент или сервер), установлен Microsoft Excel.
Разберем по шагам процесс подключения к файлу:
// Создаем объект подключения
Попытка
ExcelПриложение = Новый COMОбъект("Excel.Application");
Исключение
Сообщить("Не удалось создать объект Excel. Возможно, Microsoft Excel не установлен.");
Возврат;
КонецПопытки;
// Открываем книгу
Книга = ExcelПриложение.Workbooks.Open(ПутьКФайлу);
Лист = Книга.Sheets(1); // Обращаемся к первому листу
Проанализируем ситуацию: использование COMОбъект дает полный доступ ко всем функциям Excel, включая форматирование, работу с формулами и макросами. Однако, этот метод является самым медленным. Выясним причину: каждое обращение к ячейке через Лист.Cells(Строка, Колонка).Value инициирует межпроцессное взаимодействие, что при больших объемах данных (более 10 000 строк) приводит к существенным задержкам.
Для оптимизации работы в рамках этого метода рекомендуется считывать данные областями. Посмотрим на пример:
// Считываем область данных в массив
ДанныеОбласти = Лист.Range(Лист.Cells(1, 1), Лист.Cells(КоличествоСтрок, КоличествоКолонок)).Value;
МассивДанных = ДанныеОбласти.Unload(); // Получаем двумерный массив
Если на сервере 1С не установлен Microsoft Excel или требуется кроссплатформенное решение, разберем метод использования встроенного объекта ТабличныйДокумент. Начиная с версии платформы 8.3.6, 1С умеет нативно открывать файлы формата .xlsx.
Рассмотрим алгоритм реализации этого способа:
ТабличныйДокумент.Прочитать(), указывая путь к файлу и тип файла СпособЧтенияЗначенийТабличногоДокумента.Значение.Проанализируем код для загрузки через ТабличныйДокумент:
ТабДок = Новый ТабличныйДокумент;
Попытка
ТабДок.Прочитать(ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Значение);
Исключение
Сообщить("Ошибка при чтении файла: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
КоличествоСтрок = ТабДок.ВысотаТаблицы;
КоличествоКолонок = ТабДок.ШиринаТаблицы;
Для НомерСтроки = 2 По КоличествоСтрок Цикл // Начинаем со второй строки, если первая - заголовок
Артикул = ТабДок.Область(НомерСтроки, 1).Текст;
Наименование = ТабДок.Область(НомерСтроки, 2).Текст;
Цена = Число(ТабДок.Область(НомерСтроки, 3).Текст);
// Дальнейшая логика создания объектов 1С
КонецЦикла;
Важный момент: данный метод работает значительно быстрее, чем COM, и не требует наличия стороннего ПО. Однако стоит учитывать, что при чтении очень больших файлов (сотни тысяч строк) объект ТабличныйДокумент может потреблять значительный объем оперативной памяти сервера.
Для максимально быстрой обработки файлов формата XML (из которых состоят файлы .xlsx) можно использовать ЧтениеXML, но это требует глубокого понимания структуры документа. Более простым и современным способом является использование специализированных библиотек или внешних компонент, которые работают напрямую с потоком данных файла.
Если задача стоит в загрузке данных на стороне сервера под управлением Linux, использование COM невозможно. В этом случае ТабличныйДокумент остается основным инструментом, а для работы с характеристиками пригодится загрузка списка значений доп.реквизита.
Разберем наиболее частые проблемы, с которыми сталкиваются программисты:
COMОбъект на стороне сервера под учетной записью службы 1С, необходимо настроить права в Component Services (DCOM Config) для объекта Microsoft Excel Application. Нужно разрешить запуск и активацию для пользователя, под которым работает служба 1C:Enterprise Server.COM используйте свойство Value, а не Text, чтобы получить типизированное значение. При работе с ТабличныйДокумент всегда проверяйте корректность преобразования типов с помощью функций Число() или Дата().excel.exe.Пример корректного завершения работы с COM-объектом:
Книга.Close(Ложь); // Закрываем без сохранения изменений
ExcelПриложение.Quit();
ExcelПриложение = Неопределено;
Выясним причину медленной загрузки данных. Зачастую проблема кроется в алгоритмах обработки. Рассмотрим правила эффективной загрузки:
Соответствие или ТаблицуЗначений, используя в качестве ключа Артикул или Код. Поиск в памяти Соответствие.Получить(Ключ) работает мгновенно по сравнению с запросом к базе внутри цикла.МенеджерЗаписи или набор записей с предварительным накоплением данных в таблице.Проанализируем пример использования кэширования номенклатуры:
КэшНоменклатуры = Новый Соответствие;
Запрос = Новый Запрос("ВЫБРАТЬ Ссылка, Артикул ИЗ Справочник.Номенклатура");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
КэшНоменклатуры.Вставить(Выборка.Артикул, Выборка.Ссылка);
КонецЦикла;
// В цикле загрузки из Excel:
СсылкаНаТовар = КэшНоменклатуры.Получить(АртикулИзФайла);
Если СсылкаНаТовар = Неопределено Тогда
// Создаем новый товар
КонецЕсли;
Подводя итог, выбор метода загрузки зависит от конкретных условий. Для большинства задач оптимальным является ТабличныйДокумент с кэшированием данных.