К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как программно загрузить данные из Excel в 1С

Как программно загрузить данные из Excel в 1С: чтение через COM-объект и табличный документ, примеры кода, обработка ошибок и типичные проблемы.

Программная загрузка из Excel в 1С нужна, когда штатной обработки «Загрузка данных из табличного документа» недостаточно: файл приходит регулярно, структура колонок фиксирована, а данные нужно сразу проверять, преобразовывать и записывать в справочники или документы. В таком случае чтение файла выполняется кодом на встроенном языке 1С, а логика сопоставления колонок и контроль качества данных закладываются разработчиком.

Существует два основных подхода: чтение через COM-объект Excel.Application (работает только там, где установлен Microsoft Excel) и чтение через объект «ТабличныйДокумент» платформы (работает без установленного Office, в том числе на сервере под Linux). Выбор зависит от окружения, формата файла и требований к производительности.

Ниже разобраны оба способа с примерами кода, типичными ошибками и способами проверки результата. Материал ориентирован на разработчиков и продвинутых пользователей, которые дорабатывают типовые конфигурации или пишут собственные внешние обработки.

Выбор способа чтения файла

Первый способ — автоматизация через COM: 1С создаёт объект Excel.Application, открывает книгу и построчно читает ячейки. Этот метод понимает все форматы Excel (xls, xlsx, xlsm), корректно обрабатывает формулы и форматы, но требует установленного Microsoft Excel на той машине, где выполняется код. На сервере 1С под Linux или в базе, где загрузка выполняется регламентным заданием без Excel, этот путь неприменим.

Второй способ — чтение через объект ТабличныйДокумент с методом Прочитать(). Платформа сама разбирает файл xlsx (а также mxl, ods и ряд других форматов) без внешних программ. Способ работает на сервере, в тонком и веб-клиенте, не зависит от лицензий Office. Ограничение: старый бинарный формат xls платформа не читает — файл нужно предварительно пересохранить в xlsx.

Сравнение способов чтения Excel

COM-объект Excel.Application

Подходит для клиентских загрузок на Windows с установленным Office. Читает xls и xlsx, но медленнее и требует корректного завершения процесса Excel.

ТабличныйДокумент.Прочитать()

Подходит для серверных и фоновых загрузок, не требует Office. Ограничение: не читает старый формат xls.

Внешние библиотеки и сервисы

Оправданы при нестандартных форматах или очень больших файлах, но добавляют зависимость и требуют отдельного сопровождения.

Загрузка через COM-объект Excel

Чтение через COM выполняется на клиенте (или на сервере Windows с установленным Excel). Код создаёт приложение Excel, открывает книгу, перебирает строки листа и обязательно закрывает приложение, иначе в памяти остаются «зависшие» процессы EXCEL.EXE.

Функция ПрочитатьExcelЧерезCOM(ПутьКФайлу)

Данные = Новый Массив;

Excel = Новый COMОбъект("Excel.Application");

Excel.Visible = Ложь;

Excel.DisplayAlerts = Ложь;

Попытка

Книга = Excel.Workbooks.Open(ПутьКФайлу);

Лист = Книга.Sheets(1);

ПоследняяСтрока = Лист.Cells(Лист.Rows.Count, 1).End(-4162).Row; // xlUp

Для НомерСтроки = 2 По ПоследняяСтрока Цикл

Строка = Новый Структура;

Строка.Вставить("Номенклатура", СокрЛП(Лист.Cells(НомерСтроки, 1).Value));

Строка.Вставить("Цена", Лист.Cells(НомерСтроки, 2).Value);

Данные.Добавить(Строка);

КонецЦикла;

Книга.Close(Ложь);

Исключение

Excel.Quit();

ВызватьИсключение "Ошибка чтения файла: " + ОписаниеОшибки();

КонецПопытки;

Excel.Quit();

Возврат Данные;

КонецФункции

Обратите внимание на три момента. Во-первых, определение последней строки через End(xlUp) надёжнее, чем UsedRange, который иногда захватывает пустые отформатированные строки. Во-вторых, Excel.Quit() должен выполняться и в ветке ошибки, иначе процесс останется в памяти. В-третьих, значения ячеек приходят с типами Excel: даты — как даты COM, числа — как числа, поэтому перед записью в 1С их нужно приводить к нужным типам.

Загрузка через ТабличныйДокумент без Excel

Этот способ предпочтителен для серверных и регламентных загрузок. Файл помещается во временное хранилище или сохраняется на диск сервера, затем читается в табличный документ, из которого данные извлекаются через область ячеек.

Функция ПрочитатьExcelБезCOM(ПутьКФайлу)

Данные = Новый Массив;

ТабДок = Новый ТабличныйДокумент;

ТабДок.Прочитать(ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Значение);

Высота = ТабДок.ВысотаТаблицы;

Для НомерСтроки = 2 По Высота Цикл

Имя = ТабДок.Область(НомерСтроки, 1).Текст;

Если ПустаяСтрока(Имя) Тогда

Продолжить;

КонецЕсли;

Строка = Новый Структура;

Строка.Вставить("Номенклатура", СокрЛП(Имя));

Строка.Вставить("Цена", ТабДок.Область(НомерСтроки, 2).Текст);

Данные.Добавить(Строка);

КонецЦикла;

Возврат Данные;

КонецФункции

СпособЧтенияЗначенийТабличногоДокумента.Значение возвращает вычисленные значения ячеек, а Текст — отображаемое представление. Для дат и чисел безопаснее работать со значениями, но на практике часто читают текст и затем преобразуют его функциями Дата() и Число() с обработкой исключений, потому что формат отображения в файле может отличаться от ожидаемого.

Если загрузка запускается из тонкого или веб-клиента, файл сначала передаётся на сервер: на клиенте вызывается НачатьПомещениеФайлаВХранилище (или помещение через диалог выбора файла), а серверная процедура сохраняет данные из хранилища во временный файл и читает его. Прямой путь к файлу клиента на сервере недоступен — это частая причина ошибки «файл не найден».

Сопоставление колонок и запись в базу

Жёстко прошивать номера колонок в коде удобно только при стабильном шаблоне. Если поставщики периодически меняют порядок столбцов, надёжнее читать первую строку как заголовок и строить соответствие «имя колонки → номер» по словарю синонимов: «Номенклатура», «Товар», «Наименование» — одна и та же логическая колонка.

Запись в базу выполняйте в транзакции, особенно при загрузке документов из нескольких строк: либо загружается весь файл, либо ничего. Для справочников допустима построчная фиксация с журналированием ошибок — тогда одна «битая» строка не отменяет загрузку остальных. Поиск существующих элементов ведите по однозначным ключам: коду, артикулу, ИНН, а не по наименованию — наименования в файлах часто отличаются пробелами и регистром.

Порядок действий при типовой загрузке
  1. 1
    Определите окружение выполнения: клиент с Excel или сервер без Office — от этого зависит способ чтения
  2. 2
    Прочитайте файл в массив структур, отделив чтение от записи в базу
  3. 3
    Проверьте обязательные колонки и типы данных, соберите список ошибок по строкам
  4. 4
    Выполните поиск или создание элементов справочников по ключевым полям
  5. 5
    Запишите данные в транзакции, при ошибке откатите и покажите журнал проблемных строк
  6. 6
    Сверьте контрольные итоги: количество загруженных строк и суммы с исходным файлом

Проверка результата и контроль качества

Минимальный контроль — сравнение количества строк в файле и количества созданных/обновлённых объектов. Для прайсов и накладных полезно считать контрольные суммы: итог по колонке «Сумма» в файле должен совпасть с итогом загруженных данных в пределах округления.

Собирайте ошибки по каждой строке в таблицу значений с номером строки и описанием проблемы («не найден контрагент с ИНН …», «не число в колонке Цена») и показывайте её пользователю после загрузки. Молчаливый пропуск строк — главный источник расхождений, которые обнаруживаются неделями позже.

Контрольные точки

Как проверить результат загрузки

Количество строк
Норма

Совпадает с числом строк данных в файле (без заголовка)

Тревожный признак

Меньше — строки пропущены без сообщений об ошибках

Даты и числа
Норма

Даты в правильном столетии, числа без сдвига разрядов

Тревожный признак

Даты вида 01.01.0001 или цены, увеличенные в 100 раз из-за разделителя

Дубли элементов
Норма

Повторная загрузка того же файла не создаёт новых элементов

Тревожный признак

Каждый запуск плодит дубли справочника

Процессы Excel
Норма

После COM-загрузки в диспетчере задач не осталось EXCEL.EXE

Тревожный признак

Процессы накапливаются после каждого запуска

Типичные ошибки и ограничения

Самая частая проблема COM-варианта — ошибка создания объекта «Excel.Application» на 64-разрядном сервере или там, где Office не установлен. Вторая — попытка читать файл по локальному пути клиента в серверной процедуре. Третья — смешение форматов: файл с расширением xlsx по факту оказывается переименованным xls, и платформа отказывается его читать.

Отдельная группа ошибок связана с данными: числа, сохранённые в Excel как текст, даты в американском формате, объединённые ячейки в шапке, скрытые листы. Все эти случаи нужно обрабатывать явно: проверять тип значения, нормализовать строки перед поиском и читать именно тот лист, который содержит данные.

Типичные ошибки
01
Чтение файла по клиентскому пути на сервере — ошибка «файл не найден»; передавайте файл через временное хранилище
02
Отсутствие Excel.Quit() при исключении — накопление процессов и утечка памяти
03
Поиск элементов справочника по наименованию — дубли из-за различий в пробелах и регистре
04
Запись без транзакции — частично загруженный документ при сбое на середине файла
05
Молчаливый пропуск строк с ошибками — расхождения данных без объяснений
Для регулярных загрузок удобно вынести настройку соответствия колонок в табличную часть обработки или регистр сведений, а не прошивать в код. Когда поставщик поменяет шаблон файла, пользователь скорректирует настройку сам, без доработки конфигурации.
ПЗ
Практическое замечание

Альтернативы самописной обработке

В типовых конфигурациях (УТ, ERP, Бухгалтерия) есть встроенные механизмы загрузки из табличного документа и обработки «Загрузка данных из файла» для номенклатуры, цен и контрагентов — для разовых задач их достаточно. В БСП существует подсистема обмена данными, а для сложных регулярных интеграций часто применяют промежуточный формат CSV: Excel-файл пересохраняют в CSV, а CSV читается построчно простым кодом без ограничений по окружению.

Самописная программная загрузка оправдана, когда нужна нестандартная логика: многоуровневая проверка данных, создание связанных объектов, агрегация строк, работа по расписанию. В остальных случаях начинайте с типовых средств — они уже содержат сопоставление колонок и журнал ошибок.

Итог

Что важно запомнить

На клиенте с установленным Office читайте Excel через COM-объект и обязательно завершайте процесс; на сервере и без Office — через ТабличныйДокумент.Прочитать(), но только для xlsx. Отделяйте чтение от записи, пишите в транзакции, ищите элементы по ключевым полям и всегда сверяйте контрольные итоги с исходным файлом.

Частые вопросы

Можно ли загружать Excel на сервере 1С под Linux?

Да, но только через ТабличныйДокумент.Прочитать() — COM-объект Excel на Linux недоступен. Файл должен быть в формате xlsx (или ods), старый xls потребуется предварительно конвертировать.

Почему при чтении даты получаются числа или неверные значения?

Excel хранит даты как числа, а при чтении текста формат зависит от региональных настроек. Читайте значения ячеек, а не отображаемый текст, либо явно разбирайте строку даты с известным форматом и проверяйте результат на разумный диапазон.

Как загрузить файл, если пользователь работает в веб-клиенте?

На клиенте вызовите помещение файла во временное хранилище (НачатьПомещениеФайлаВХранилище), передайте адрес хранилища в серверную процедуру, там сохраните данные во временный файл и прочитайте его табличным документом.

Что делать с большими файлами на десятки тысяч строк?

Чтение через ТабличныйДокумент потребляет заметный объём памяти. Для очень больших файлов пересохраните данные в CSV и читайте построчно текстовым документом — это существенно экономнее по памяти и быстрее.

Как избежать дублей при повторной загрузке одного файла?

Ищите существующие элементы по уникальным ключам (артикул, ИНН, код) и обновляйте их вместо создания новых. Для документов храните признак загруженного файла (имя, хеш, номер) и проверяйте его перед созданием.

Нужна ли транзакция при загрузке справочника?

Для справочников допустима построчная запись с журналом ошибок — это удобнее при частично «грязных» файлах. Транзакция обязательна для документов и связанных наборов данных, где частичная запись оставит базу в несогласованном состоянии.