При автоматизации бизнес-процессов мы часто сталкиваемся с необходимостью загрузки данных из внешних таблиц Excel. Это могут быть прайс-листы поставщиков, списки номенклатуры или табели учета рабочего времени. Раньше стандартом считалось использование COM-объектов (Excel.Application), однако этот метод имеет существенные недостатки: он требует наличия установленного пакета MS Office на сервере (что стоит денег и нагружает систему) и работает медленно.
В этой статье мы подробно разберем, как решить задачу загрузки файлов формата *.xlsx и *.xls, используя исключительно встроенные механизмы платформы 1С:Предприятие 8.3. Это решение работает быстрее, стабильнее и не требует покупки дополнительных лицензий на офисные пакеты. Рассмотрим два основных подхода, которые мы выделили на основе анализа опыта разработчиков.
Прежде чем перейти к коду, давайте выясним причину, по которой классический метод через COMОбъект уходит в прошлое:
Платформа 1С, начиная с версий 8.3.6, предоставляет нативные инструменты для чтения файлов Excel, которые мы и будем использовать.
Этот метод является самым универсальным и простым в реализации. Суть его заключается в том, что платформа 1С умеет "прочитать" файл Excel и загрузить его структуру в свой родной объект ТабличныйДокумент. После этого мы можем программно перебрать ячейки этого документа, как если бы это была обычная таблица 1С.
Рассмотрим алгоритм действий по шагам:
ТабличныйДокумент.Прочитать, указывая путь к файлу и способ определения типа файла.Посмотрим на пример кода, который реализует этот подход. Предположим, что файл загружается на сервере (например, передан через временное хранилище).
// Создаем объект табличного документа
ТабДок = Новый ТабличныйДокумент;
// Пытаемся прочитать файл.
// Важно: ПутьКФайлу должен быть доступен серверу 1С.
Попытка
ТабДок.Прочитать(ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Значение);
Исключение
Сообщить("Не удалось прочитать файл: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// Определяем количество строк для перебора
ВысотаТаблицы = ТабДок.ВысотаТаблицы;
// Запускаем цикл по строкам. Обычно первая строка - это шапка, поэтому начинаем со 2-й.
Для НомерСтроки = 2 По ВысотаТаблицы Цикл
// Получаем область ячейки по координатам (Строка, Колонка)
// Допустим, Артикул в 1-й колонке, а Цена во 2-й
АртикулЯчейка = ТабДок.Область(НомерСтроки, 1);
ЦенаЯчейка = ТабДок.Область(НомерСтроки, 2);
ТекАртикул = СокрЛП(АртикулЯчейка.Текст);
ТекЦена = ЦенаЯчейка.СодержитЗначение ? ЦенаЯчейка.Значение : 0;
// Здесь ваша логика обработки данных
// Например, поиск номенклатуры и запись цены
Если ЗначениеЗаполнено(ТекАртикул) Тогда
ОбработатьСтрокуПрайса(ТекАртикул, ТекЦена);
КонецЕсли;
КонецЦикла;
Важные нюансы этого метода:
Прочитать может потреблять достаточно много оперативной памяти, если файл Excel огромный (десятки тысяч строк).СпособЧтенияЗначенийТабличногоДокумента. Если выбрать вариант Текст, то все числа и даты будут прочитаны как строки. Вариант Значение пытается преобразовать типы данных в соответствующие типы 1С (Число, Дата).Иногда требуется не просто перебрать строки, а сразу свернуть данные или наложить отбор. В этом случае, загрузив данные в ТабличныйДокумент, мы можем воспользоваться ПостроительЗапроса, который умеет работать с табличным документом как с источником данных.
Разберем, как это можно реализовать для ускорения обработки:
// Загружаем Excel в ТабДок, как в предыдущем примере
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ПутьКФайлу);
// Создаем построитель запроса
Построитель = Новый ПостроительЗапроса;
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабДок.Область()); // Берем всю область
// Выполняем выборку
Построитель.Выполнить();
Выборка = Построитель.Результат.Выбрать();
Для Каждого Строка Из Выборка Цикл
// Обращение к колонкам по именам, которые сформировал построитель
// Обычно это "Column1", "Column2" и т.д., если в первой строке не было заголовков
КонецЦикла;
В процессе работы с загрузкой файлов мы можем столкнуться с рядом типовых проблем. Проанализируем их и найдем решения.
1. Ошибка "Файл занят другим процессом"
Если пользователь открыл файл в Excel и пытается его загрузить, 1С может выдать ошибку доступа.
Решение: Всегда копируйте загружаемый файл во временный каталог сервера перед чтением. Используйте функцию ПолучитьИмяВременногоФайла("xlsx").
2. Проблемы с типами данных
Часто в Excel цена записана как "1 200,00 р.", то есть с пробелами и символами валюты.
Решение: При чтении используйте строковую обработку. Используйте функцию СтрЗаменить для удаления неразрывных пробелов (код символа 160) и обычных пробелов перед преобразованием строки в число.
// Пример очистки цены от лишних символов
ЦенаСтрокой = СтрЗаменить(ЦенаСтрокой, Символ(160), ""); // Удаляем неразрывные пробелы
ЦенаСтрокой = СтрЗаменить(ЦенаСтрокой, " ", "");
ЦенаЧисло = Число(ЦенаСтрокой);
Описанный выше метод через ТабличныйДокумент полностью поддерживает работу на Linux-серверах 1С:Предприятие. Это делает его идеальным выбором для современных импортозамещенных инфраструктур. Вам не нужно устанавливать Wine или настраивать сложные библиотеки — все работает "из коробки".
Подводя итог нашему разбору, выделим главные рекомендации:
ТабличныйДокумент и его метод Прочитать().COMОбъект("Excel.Application") в новых разработках.XDTO пакеты для OpenXML, но это уже тема для более сложной статьи).Используя эти методы, вы создадите надежный и переносимый код, который не подведет при смене операционной системы сервера или обновлении офисного пакета.