Как загрузить данные из Excel в 1С без установленного Microsoft Office?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При автоматизации бизнес-процессов мы часто сталкиваемся с необходимостью загрузки данных из внешних таблиц Excel. Это могут быть прайс-листы поставщиков, списки номенклатуры или табели учета рабочего времени. Раньше стандартом считалось использование COM-объектов (Excel.Application), однако этот метод имеет существенные недостатки: он требует наличия установленного пакета MS Office на сервере (что стоит денег и нагружает систему) и работает медленно.

В этой статье мы подробно разберем, как решить задачу загрузки файлов формата *.xlsx и *.xls, используя исключительно встроенные механизмы платформы 1С:Предприятие 8.3. Это решение работает быстрее, стабильнее и не требует покупки дополнительных лицензий на офисные пакеты. Рассмотрим два основных подхода, которые мы выделили на основе анализа опыта разработчиков.

Почему стоит отказаться от COM-объектов?

Прежде чем перейти к коду, давайте выясним причину, по которой классический метод через COMОбъект уходит в прошлое:

  1. Лицензирование: Установка MS Office на сервер 1С требует соблюдения лицензионной политики Microsoft, что может быть затратно.
  2. Стабильность: Зависшие процессы Excel могут "съедать" оперативную память сервера.
  3. Кроссплатформенность: COM-объекты Windows не будут работать, если ваш сервер 1С развернут на Linux.

Платформа 1С, начиная с версий 8.3.6, предоставляет нативные инструменты для чтения файлов Excel, которые мы и будем использовать.

Решение №1: Чтение через Табличный Документ

Этот метод является самым универсальным и простым в реализации. Суть его заключается в том, что платформа 1С умеет "прочитать" файл Excel и загрузить его структуру в свой родной объект ТабличныйДокумент. После этого мы можем программно перебрать ячейки этого документа, как если бы это была обычная таблица 1С.

Рассмотрим алгоритм действий по шагам:

  1. Создаем новый экземпляр объекта ТабличныйДокумент.
  2. Используем метод Прочитать, указывая путь к файлу и способ определения типа файла.
  3. Обходим строки и колонки полученного документа в цикле.

Посмотрим на пример кода, который реализует этот подход. Предположим, что файл загружается на сервере (например, передан через временное хранилище).


// Создаем объект табличного документа
ТабДок = Новый ТабличныйДокумент;

// Пытаемся прочитать файл. 
// Важно: ПутьКФайлу должен быть доступен серверу 1С.
Попытка
    ТабДок.Прочитать(ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Значение);
Исключение
    Сообщить("Не удалось прочитать файл: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

// Определяем количество строк для перебора
ВысотаТаблицы = ТабДок.ВысотаТаблицы;

// Запускаем цикл по строкам. Обычно первая строка - это шапка, поэтому начинаем со 2-й.
Для НомерСтроки = 2 По ВысотаТаблицы Цикл
    
    // Получаем область ячейки по координатам (Строка, Колонка)
    // Допустим, Артикул в 1-й колонке, а Цена во 2-й
    АртикулЯчейка = ТабДок.Область(НомерСтроки, 1);
    ЦенаЯчейка    = ТабДок.Область(НомерСтроки, 2);
    
    ТекАртикул = СокрЛП(АртикулЯчейка.Текст);
    ТекЦена    = ЦенаЯчейка.СодержитЗначение ? ЦенаЯчейка.Значение : 0;
    
    // Здесь ваша логика обработки данных
    // Например, поиск номенклатуры и запись цены
    Если ЗначениеЗаполнено(ТекАртикул) Тогда
        ОбработатьСтрокуПрайса(ТекАртикул, ТекЦена);
    КонецЕсли;
    
КонецЦикла;

Важные нюансы этого метода:

Решение №2: Использование построителя запроса (для продвинутых случаев)

Иногда требуется не просто перебрать строки, а сразу свернуть данные или наложить отбор. В этом случае, загрузив данные в ТабличныйДокумент, мы можем воспользоваться ПостроительЗапроса, который умеет работать с табличным документом как с источником данных.

Разберем, как это можно реализовать для ускорения обработки:


// Загружаем Excel в ТабДок, как в предыдущем примере
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ПутьКФайлу);

// Создаем построитель запроса
Построитель = Новый ПостроительЗапроса;
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабДок.Область()); // Берем всю область

// Выполняем выборку
Построитель.Выполнить();
Выборка = Построитель.Результат.Выбрать();

Для Каждого Строка Из Выборка Цикл
    // Обращение к колонкам по именам, которые сформировал построитель
    // Обычно это "Column1", "Column2" и т.д., если в первой строке не было заголовков
КонецЦикла;

Частые ошибки и способы их исправления

В процессе работы с загрузкой файлов мы можем столкнуться с рядом типовых проблем. Проанализируем их и найдем решения.

1. Ошибка "Файл занят другим процессом"

Если пользователь открыл файл в Excel и пытается его загрузить, 1С может выдать ошибку доступа. Решение: Всегда копируйте загружаемый файл во временный каталог сервера перед чтением. Используйте функцию ПолучитьИмяВременногоФайла("xlsx").

2. Проблемы с типами данных

Часто в Excel цена записана как "1 200,00 р.", то есть с пробелами и символами валюты. Решение: При чтении используйте строковую обработку. Используйте функцию СтрЗаменить для удаления неразрывных пробелов (код символа 160) и обычных пробелов перед преобразованием строки в число.


// Пример очистки цены от лишних символов
ЦенаСтрокой = СтрЗаменить(ЦенаСтрокой, Символ(160), ""); // Удаляем неразрывные пробелы
ЦенаСтрокой = СтрЗаменить(ЦенаСтрокой, " ", ""); 
ЦенаЧисло   = Число(ЦенаСтрокой);

Работа на Linux серверах

Описанный выше метод через ТабличныйДокумент полностью поддерживает работу на Linux-серверах 1С:Предприятие. Это делает его идеальным выбором для современных импортозамещенных инфраструктур. Вам не нужно устанавливать Wine или настраивать сложные библиотеки — все работает "из коробки".

Выводы

Подводя итог нашему разбору, выделим главные рекомендации:

Используя эти методы, вы создадите надежный и переносимый код, который не подведет при смене операционной системы сервера или обновлении офисного пакета.

← На главную