При разработке механизмов загрузки данных в 1С часто возникает задача чтения файлов формата Microsoft Excel (.xls, .xlsx). Классический подход, использовавшийся годами, подразумевал работу через OLE-автоматизацию и создание COM-объекта Excel.Application. Однако этот метод имеет существенные недостатки: он требует наличия установленного MS Office на сервере, работает медленно и, самое главное, совершенно неприменим в серверных средах под управлением ОС Linux, где технологии COM/OLE недоступны. В таких случаях на помощь приходит универсальная загрузка из Excel, которая позволяет импортировать данные в справочники без лишних зависимостей.
В этой статье мы подробно разберем, как реализовать чтение Excel-файлов средствами самой платформы 1С:Предприятие 8.3, используя нативные механизмы, которые работают быстро, кроссплатформенно и не требуют установки стороннего софта. Для тех, кому необходимо поддерживать множество расширений, включая старые форматы и CSV, подойдет комплексный инструмент для импорта данных.
Рассмотрим ситуацию, когда при попытке выполнить код загрузки на сервере мы получаем ошибку создания COM-объекта или класс не зарегистрирован. Это происходит потому, что серверный процесс 1С не имеет доступа к офисным библиотекам или работает в среде, где их нет.
Для решения этой задачи платформа 1С предоставляет мощный встроенный объект — ТабличныйДокумент. Начиная с версии 8.3.6, методы чтения этого объекта были существенно доработаны и позволяют корректно открывать файлы форматов Excel напрямую.
Преимущества использования Табличного Документа:
Разберем по шагам алгоритм чтения файла. Наша задача — загрузить файл с диска в память 1С и прочитать значения ячеек. Если вы только начинаете разработку собственного механизма, за основу можно взять этот шаблон простой обработки загрузки из excel.
Сначала нам необходимо создать экземпляр объекта и прочитать файл. Обратите внимание, что мы явно можем не указывать тип файла, платформа попытается определить его автоматически, но для надежности лучше это контролировать.
// Создаем новый экземпляр табличного документа
ТабДок = Новый ТабличныйДокумент;
// Пытаемся прочитать файл.
// Важно: ПутьКФайлу должен быть доступен серверному процессу 1С.
Попытка
ТабДок.Прочитать(ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Значение);
Исключение
// Обрабатываем ошибку, если файл занят или формат неверен
ЗаписьЖурналаРегистрации("ЗагрузкаExcel", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
Возврат;
КонецПопытки;
В данном примере мы использовали параметр СпособЧтенияЗначенийТабличногоДокумента.Значение. Это позволяет сразу получить типизированные данные (числа, даты, булево), а не только строковые представления, что избавляет от необходимости дополнительного преобразования типов.
После того как файл загружен в объект ТабличныйДокумент, данные становятся доступны через коллекции областей или ячеек. Рассмотрим наиболее универсальный способ перебора строк и колонок. Для быстрой отладки и визуализации данных часто применяется портативная обработка чтения файла в таблицу или дерево значений, позволяющая сразу увидеть структуру прочитанного файла.
Предположим, мы знаем, что данные начинаются с первой строки и первой колонки. Определим количество строк, содержащих данные, с помощью свойства ВысотаТаблицы.
КоличествоСтрок = ТабДок.ВысотаТаблицы;
Для НомерСтроки = 1 По КоличествоСтрок Цикл
// Получаем область ячейки по координатам (Строка, Колонка)
// Читаем первую колонку (например, Артикул)
ОбластьАртикул = ТабДок.Область(НомерСтроки, 1);
Артикул = СокрЛП(ОбластьАртикул.Текст);
// Читаем вторую колонку (например, Цена)
ОбластьЦена = ТабДок.Область(НомерСтроки, 2);
// Свойство СодержитЗначение показывает, есть ли в ячейке типизированные данные
Если ОбластьЦена.СодержитЗначение Тогда
Цена = ОбластьЦена.Значение;
Иначе
// Если значения нет, пробуем преобразовать текст
Попытка
Цена = Число(ОбластьЦена.Текст);
Исключение
Цена = 0;
КонецПопытки;
КонецЕсли;
// Далее выполняем логику обработки полученных данных
// Например, поиск номенклатуры или создание документа
КонецЦикла;
Посмотрим на важные нюансы этого кода. Мы используем метод Область(R, C) для доступа к конкретной ячейке. Это эффективный способ. Также мы проверяем свойство СодержитЗначение. Это критически важно, так как в Excel ячейка может иметь формат "Текст", но содержать число. Использование свойства Текст вернет строковое представление, в то время как Значение вернет чистое число или дату.
Проанализируем возможные подводные камни. Метод ТабличныйДокумент.Прочитать() загружает весь файл целиком в оперативную память сервера. При работе с огромными прайс-листами (сотни тысяч строк) это может привести к значительному потреблению RAM. Если вам требуется обрабатывать все листы книги Excel одновременно, лучше использовать решение типа загрузка файлов Excel и CSV, которая умеет работать с коллекциями листов.
Если вы сталкиваетесь с файлами большого объема, рекомендуем рассмотреть следующие стратегии:
ЧтениеXML, что гораздо экономичнее к памяти.Однако для большинства типовых задач (файлы до 10-20 тысяч строк) использование встроенного ТабличныйДокумент является стандартом де-факто и наиболее надежным решением.
Разберем несколько ошибок, которые могут возникнуть в процессе:
Ошибка "Файл занят другим процессом"
Убедитесь, что файл не открыт в Excel у пользователя или не заблокирован антивирусом. В коде 1С перед чтением полезно проверить существование файла методом НайтиФайлы.
Некорректное определение последней строки
Иногда ВысотаТаблицы возвращает 1000000, хотя данных всего 10 строк. Это случается, если в Excel было применено форматирование ко всему листу. В таком случае в цикле чтения следует добавить условие прерывания (Прервать), если встретилось, например, 5 пустых строк подряд.
СчетчикПустых = 0;
Для НомерСтроки = 1 По ТабДок.ВысотаТаблицы Цикл
ТекстЯчейки = СокрЛП(ТабДок.Область(НомерСтроки, 1).Текст);
Если ПустаяСтрока(ТекстЯчейки) Тогда
СчетчикПустых = СчетчикПустых + 1;
Если СчетчикПустых > 5 Тогда Прервать; КонецЕсли;
Иначе
СчетчикПустых = 0;
// Обработка данных
КонецЕсли;
КонецЦикла;
Мы выяснили, что для чтения Excel файлов в современной платформе 1С 8.3 не требуется использование устаревших и небезопасных COM-объектов. Метод ТабличныйДокумент.Прочитать() является кроссплатформенным, быстрым и удобным инструментом, который закрывает 95% потребностей бизнеса по загрузке данных из таблиц. Используйте приведенные выше примеры кода как шаблон для создания своих обработок загрузки.