В современной разработке на платформе 1С:Предприятие 8.3 часто возникает задача импорта данных из электронных таблиц Microsoft Excel. Традиционный метод с использованием COMОбъект("Excel.Application") постепенно уходит в прошлое. Это связано с тем, что COM-технология работает только в среде Windows, требует установленного Microsoft Office на сервере и часто вызывает проблемы с производительностью и утечками памяти. В рамках данной статьи мы разберем, как реализовать чтение файлов .xlsx кроссплатформенными методами, доступными непосредственно в платформе 1С, или использовать готовый инструмент для импорта данных из форматов xls, xlsx и многих других.
Начиная с версии платформы 8.3.6, разработчики 1С добавили встроенную поддержку чтения файлов формата Office Open XML (xlsx) через объект ТабличныйДокумент. Этот метод является наиболее предпочтительным, так как он работает как на Windows, так и на Linux, не требуя стороннего программного обеспечения. Для быстрой реализации этой задачи разработчики часто используют шаблон простой обработки загрузки из excel.
Рассмотрим подробнее пошаговый алгоритм загрузки данных. Сначала нам необходимо инициализировать объект и вызвать метод Прочитать. Проанализируем пример кода:
&НаСервере
Функция ПрочитатьФайлExcelНаСервере(ПутьКФайлу)
ТабДок = Новый ТабличныйДокумент;
Попытка
ТабДок.Прочитать(ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Значение);
Исключение
Сообщить("Ошибка при чтении файла: " + ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
Возврат ТабДок;
КонецФункции
В данном примере мы используем параметр СпособЧтенияЗначенийТабличногоДокумента.Значение. Это важный момент: он позволяет считывать именно типизированные данные (числа, даты), а не просто текст, который отображается в ячейке.
После того как файл успешно прочитан в объект ТабличныйДокумент, нам нужно перебрать его строки и колонки, чтобы перенести информацию в коллекцию данных (например, в ТаблицаЗначений) или сразу создать объекты в базе. В случаях, когда файл содержит многостраничную структуру, удобно использовать механизм загрузки файлов Excel и CSV, который автоматически считывает все листы книги в коллекцию таблиц значений.
Для определения размеров таблицы мы используем свойства ВысотаТаблицы и ШиринаТаблицы. Посмотрим на пример реализации обхода:
Процедура ОбработатьДанныеExcel(ТабДок)
КоличествоСтрок = ТабДок.ВысотаТаблицы;
КоличествоКолонок = ТабДок.ШиринаТаблицы;
// Предположим, первая строка содержит заголовки
Для НомерСтроки = 2 По КоличествоСтрок Цикл
Артикул = ТабДок.Область(НомерСтроки, 1).Текст;
Наименование = ТабДок.Область(НомерСтроки, 2).Текст;
Цена = ТабДок.Область(НомерСтроки, 3).ТекущийОбъект; // Получаем значение, а не текст
Если ЗначениеЗаполнено(Артикул) Тогда
// Логика создания или поиска номенклатуры
ЗаписатьДанныеВБазу(Артикул, Наименование, Цена);
КонецЕсли;
КонецЦикла;
КонецПроцедуРы
Обратите внимание на использование метода Область(). Мы обращаемся к конкретной ячейке по координатам (строка, колонка). Использование свойства Текст вернет строковое представление, в то время как работа с объектом области может дать доступ к более сложным свойствам оформления, если это необходимо.
Проанализируем преимущества использования встроенных средств платформы:
excel.exe через COM.Однако существуют и определенные нюансы. Например, при чтении очень больших массивов информации стоит применять специальный подход к пакетной загрузке большого количества данных с фиксацией ошибок на каждом шаге. Это поможет избежать переполнения памяти, так как ТабличныйДокумент загружает модель документа целиком.
Разберем ситуацию, когда в Excel колонке хранятся даты или числа с плавающей точкой. При использовании ТабличныйДокумент важно понимать, как 1С интерпретирует типы данных Excel. Кроме простого чтения, иногда возникает необходимость провести сравнение двух Excel документов по ключевому полю, чтобы выявить расхождения в типах и значениях до их записи в базу.
Для надежности рекомендуется всегда проверять тип полученного значения с помощью функции ТипЗнч() или явно приводить типы, чтобы избежать ошибок при записи в справочники или документы 1С.
ЗначениеИзЯчейки = ТабДок.Область(НомерСтроки, КолонДата).Значение;
Если ТипЗнч(ЗначениеИзЯчейки) = Тип("Дата") Тогда
ДатаДокумента = ЗначениеИзЯчейки;
Иначе
ДатаДокумента = ТекущаяДата(); // Значение по умолчанию
КонецЕсли;
Мы рассмотрели основной и наиболее эффективный способ работы с файлами Excel в среде 1С. Использование ТабличныйДокумент позволяет отказаться от устаревших COM-технологий, обеспечивая высокую скорость и стабильность работы системы. При проектировании механизмов загрузки всегда учитывайте объем входных данных и среду исполнения (клиент или сервер), отдавая предпочтение серверным процедурам для минимизации передачи данных между слоями системы.