Разработка и Конфигурация · 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
Подходит для клиентских загрузок на 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Определите окружение выполнения: клиент с Excel или сервер без Office — от этого зависит способ чтения
- 2Прочитайте файл в массив структур, отделив чтение от записи в базу
- 3Проверьте обязательные колонки и типы данных, соберите список ошибок по строкам
- 4Выполните поиск или создание элементов справочников по ключевым полям
- 5Запишите данные в транзакции, при ошибке откатите и покажите журнал проблемных строк
- 6Сверьте контрольные итоги: количество загруженных строк и суммы с исходным файлом
Проверка результата и контроль качества
Минимальный контроль — сравнение количества строк в файле и количества созданных/обновлённых объектов. Для прайсов и накладных полезно считать контрольные суммы: итог по колонке «Сумма» в файле должен совпасть с итогом загруженных данных в пределах округления.
Собирайте ошибки по каждой строке в таблицу значений с номером строки и описанием проблемы («не найден контрагент с ИНН …», «не число в колонке Цена») и показывайте её пользователю после загрузки. Молчаливый пропуск строк — главный источник расхождений, которые обнаруживаются неделями позже.
Как проверить результат загрузки
Совпадает с числом строк данных в файле (без заголовка)
Меньше — строки пропущены без сообщений об ошибках
Даты в правильном столетии, числа без сдвига разрядов
Даты вида 01.01.0001 или цены, увеличенные в 100 раз из-за разделителя
Повторная загрузка того же файла не создаёт новых элементов
Каждый запуск плодит дубли справочника
После COM-загрузки в диспетчере задач не осталось EXCEL.EXE
Процессы накапливаются после каждого запуска
Типичные ошибки и ограничения
Самая частая проблема COM-варианта — ошибка создания объекта «Excel.Application» на 64-разрядном сервере или там, где Office не установлен. Вторая — попытка читать файл по локальному пути клиента в серверной процедуре. Третья — смешение форматов: файл с расширением xlsx по факту оказывается переименованным xls, и платформа отказывается его читать.
Отдельная группа ошибок связана с данными: числа, сохранённые в Excel как текст, даты в американском формате, объединённые ячейки в шапке, скрытые листы. Все эти случаи нужно обрабатывать явно: проверять тип значения, нормализовать строки перед поиском и читать именно тот лист, который содержит данные.
Для регулярных загрузок удобно вынести настройку соответствия колонок в табличную часть обработки или регистр сведений, а не прошивать в код. Когда поставщик поменяет шаблон файла, пользователь скорректирует настройку сам, без доработки конфигурации.
Альтернативы самописной обработке
В типовых конфигурациях (УТ, ERP, Бухгалтерия) есть встроенные механизмы загрузки из табличного документа и обработки «Загрузка данных из файла» для номенклатуры, цен и контрагентов — для разовых задач их достаточно. В БСП существует подсистема обмена данными, а для сложных регулярных интеграций часто применяют промежуточный формат CSV: Excel-файл пересохраняют в CSV, а CSV читается построчно простым кодом без ограничений по окружению.
Самописная программная загрузка оправдана, когда нужна нестандартная логика: многоуровневая проверка данных, создание связанных объектов, агрегация строк, работа по расписанию. В остальных случаях начинайте с типовых средств — они уже содержат сопоставление колонок и журнал ошибок.
Что важно запомнить
На клиенте с установленным Office читайте Excel через COM-объект и обязательно завершайте процесс; на сервере и без Office — через ТабличныйДокумент.Прочитать(), но только для xlsx. Отделяйте чтение от записи, пишите в транзакции, ищите элементы по ключевым полям и всегда сверяйте контрольные итоги с исходным файлом.
Частые вопросы
Можно ли загружать Excel на сервере 1С под Linux?
Да, но только через ТабличныйДокумент.Прочитать() — COM-объект Excel на Linux недоступен. Файл должен быть в формате xlsx (или ods), старый xls потребуется предварительно конвертировать.
Почему при чтении даты получаются числа или неверные значения?
Excel хранит даты как числа, а при чтении текста формат зависит от региональных настроек. Читайте значения ячеек, а не отображаемый текст, либо явно разбирайте строку даты с известным форматом и проверяйте результат на разумный диапазон.
Как загрузить файл, если пользователь работает в веб-клиенте?
На клиенте вызовите помещение файла во временное хранилище (НачатьПомещениеФайлаВХранилище), передайте адрес хранилища в серверную процедуру, там сохраните данные во временный файл и прочитайте его табличным документом.
Что делать с большими файлами на десятки тысяч строк?
Чтение через ТабличныйДокумент потребляет заметный объём памяти. Для очень больших файлов пересохраните данные в CSV и читайте построчно текстовым документом — это существенно экономнее по памяти и быстрее.
Как избежать дублей при повторной загрузке одного файла?
Ищите существующие элементы по уникальным ключам (артикул, ИНН, код) и обновляйте их вместо создания новых. Для документов храните признак загруженного файла (имя, хеш, номер) и проверяйте его перед созданием.
Нужна ли транзакция при загрузке справочника?
Для справочников допустима построчная запись с журналом ошибок — это удобнее при частично «грязных» файлах. Транзакция обязательна для документов и связанных наборов данных, где частичная запись оставит базу в несогласованном состоянии.