Разработка и Конфигурация · 13 мин
Как загрузить Excel в таблицу значений 1С
Разбираем способы загрузки данных из Excel в таблицу значений 1С: через ТабличныйДокумент и COM-объект. Готовый код, проверка результата и типичные ошибки.
Загрузка данных из Excel в таблицу значений — одна из самых частых задач при разработке и доработке конфигураций 1С. Такой приём используют при импорте номенклатуры, цен, остатков, контрагентов и любых других списков, которые пользователи ведут в электронных таблицах. Таблица значений в этом сценарии выступает промежуточным буфером: данные сначала считываются из файла, затем проверяются и только после этого записываются в справочники или документы.
Существует два основных способа прочитать файл Excel из кода 1С. Первый — через объект ТабличныйДокумент и его метод Прочитать(), который не требует установленного Excel на компьютере и работает на сервере. Второй — через COM-объект Excel.Application, который даёт доступ к формулам, форматам и нескольким листам, но требует установленного Microsoft Excel и обычно применяется только на клиенте.
Ниже разобраны оба подхода с готовым кодом, условиями выбора между ними, обработкой типовых ошибок и проверкой результата. Примеры написаны на встроенном языке 1С и подходят для управляемых форм, внешних обработок и серверных процедур.
Какой способ выбрать: ТабличныйДокумент или COM
Выбор метода зависит от трёх факторов: где выполняется код (клиент или сервер), установлен ли Excel на машине и какой формат файла нужно прочитать. Метод ТабличныйДокумент.Прочитать() поддерживает файлы XLSX и MXL без установленного офисного пакета, корректно работает в серверных процедурах и на Linux-сервере, поэтому подходит для большинства прикладных задач.
COM-подключение оправдано, когда нужно прочитать конкретный именованный лист, получить вычисленные значения формул, обработать файлы старого формата XLS со сложной структурой или учесть скрытые строки. Минус очевиден: на компьютере должен быть установлен Microsoft Excel, а при работе на сервере возникают проблемы с правами и «зависшими» процессами EXCEL.EXE.
Сравнение способов чтения Excel
Работает без установленного Excel, подходит для сервера и тонкого клиента. Ограничение: читает только значения ячеек, формулы возвращаются как результат или пусто.
Полный доступ к листам, формулам и форматам. Ограничение: требует установленный Excel, работает только на клиенте Windows, медленнее на больших файлах.
Применяются для очень больших файлов или потоковой обработки. Требуют отдельной установки и сопровождения.
Загрузка через ТабличныйДокумент: базовый код
Стандартный приём выглядит так: создаётся табличный документ, в него читается файл, затем методом ПолучитьОбласть() выделяется вся использованная область и через построитель запроса данные выгружаются в таблицу значений. Имена колонок при этом берутся из первой строки файла.
Процедура ЗагрузитьExcelВТаблицуЗначений(ИмяФайла) Экспорт
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ИмяФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);
Построитель = Новый ПостроительЗапроса;
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабДок.Область());
Построитель.Выполнить();
ТаблицаЗначений = Построитель.Результат.Выгрузить();
// Дальше — обход строк и обработка
Для Каждого СтрокаТЗ Из ТаблицаЗначений Цикл
// СтрокаТЗ.Код, СтрокаТЗ.Наименование и т.д.
КонецЦикла;
КонецПроцедуры
Параметр СпособЧтенияЗначенийТабличногоДокумента.Значение важен: он заставляет платформу вернуть вычисленные значения ячеек, а не текст формул. Если файл содержит формулы и прочитать его со способом «Текст», в таблицу попадут строки вида «=СУММ(A1:A10)», что сломает дальнейшую обработку.
Учтите, что построитель запроса формирует имена колонок по содержимому первой строки. Если в шапке есть пробелы, дефисы или кириллические символы, которые недопустимы в именах колонок, платформа заменит их или выдаст ошибку. Надёжнее читать данные построчно через обращение к областям ячеек, когда структура файла нестабильна.
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ИмяФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);
Построитель = Новый ПостроительЗапроса;
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабДок.Область());
Построитель.Выполнить();
ТЗ = Построитель.Результат.Выгрузить();Построчное чтение ячеек при нестабильной структуре файла
Когда файл готовят пользователи вручную, структура часто «плывёт»: появляются пустые строки, объединённые ячейки, промежуточные заголовки. В этом случае надёжнее обойти табличный документ построчно и самостоятельно заполнить таблицу значений с явным описанием колонок.
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Код", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(50)));
ТЗ.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(150)));
ТЗ.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2)));
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ИмяФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);
ВсегоСтрок = ТабДок.ВысотаТаблицы;
Для НомерСтроки = 2 По ВсегоСтрок Цикл // первая строка — шапка
Код = СокрЛП(ТабДок.Область(НомерСтроки, 1).Текст);
Если ПустаяСтрока(Код) Тогда
Продолжить; // пропускаем пустые строки
КонецЕсли;
НоваяСтрока = ТЗ.Добавить();
НоваяСтрока.Код = Код;
НоваяСтрока.Наименование = СокрЛП(ТабДок.Область(НомерСтроки, 2).Текст);
ТекстЦены = СтрЗаменить(ТабДок.Область(НомерСтроки, 3).Текст, " ", "");
НоваяСтрока.Цена = ?(ПустаяСтрока(ТекстЦены), 0, Число(ТекстЦены));
КонецЦикла;
Такой подход длиннее, но даёт полный контроль: вы сами решаете, как преобразовывать типы, что делать с пустыми строками и как реагировать на «мусор» в данных. Для загрузки цен и остатков, где ошибка в числе критична, именно построчное чтение считается безопасной практикой.
Загрузка через COM-объект Excel.Application
COM-подключение используют на толстом или тонком клиенте под Windows. Код открывает Excel в фоне, читает указанный лист и обязательно закрывает приложение, иначе в памяти останется процесс EXCEL.EXE, блокирующий файл.
Excel = Новый COMОбъект("Excel.Application");
Excel.Visible = Ложь;
Excel.DisplayAlerts = Ложь;
Книга = Excel.Workbooks.Open(ИмяФайла);
Лист = Книга.Worksheets(1);
ВсегоСтрок = Лист.UsedRange.Rows.Count;
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Наименование");
ТЗ.Колонки.Добавить("Цена");
Для НомерСтроки = 2 По ВсегоСтрок Цикл
СтрокаТЗ = ТЗ.Добавить();
СтрокаТЗ.Наименование = СокрЛП(Лист.Cells(НомерСтроки, 1).Value);
СтрокаТЗ.Цена = Лист.Cells(НомерСтроки, 2).Value;
КонецЦикла;
Книга.Close(Ложь);
Excel.Quit();
Excel = Неопределено;
Критически важно завершать работу связкой Книга.Close(Ложь), Excel.Quit() и обнулением переменной. Пропуск любого шага приводит к «зависшим» процессам Excel, которые накапливаются и мешают пользователям открывать файлы. Оборачивайте чтение в конструкцию Попытка...Исключение и закрывайте приложение в обоих ветках.
Проверка результата и типичные ошибки
После загрузки таблицу значений стоит проверить до записи данных в базу. Минимальный контроль: количество строк больше нуля, ключевые колонки заполнены, числовые поля действительно содержат числа. Если загрузка используется для записи в справочники или документы, делайте проверку в транзакции или выводите пользователю предварительный отчёт о сопоставлении.
Наиболее частые проблемы связаны не с кодом, а с самим файлом. Файл, открытый в Excel другим пользователем, может читаться в режиме только чтения или не читаться вовсе. Скрытые первые строки смещают нумерацию. Ячейки с датами могут прийти как числа в формате Excel (количество дней от базовой даты), и их нужно преобразовывать отдельно.
Как проверить результат загрузки
Совпадает с числом заполненных строк в файле минус шапка
Строк ноль или заметно меньше, чем в файле — проверьте ВысотаТаблицы и пустые строки
Числа и даты имеют правильный тип, а не строку
Числа хранятся как строки с пробелами — нужна очистка и преобразование
Совпадают с данными в Excel
Сдвиг на одну строку — неверно указана строка начала чтения
Особенности для управляемых форм и веб-клиента
В управляемом приложении файл нельзя просто прочитать по локальному пути в серверной процедуре: сервер не имеет доступа к диску пользователя. Стандартная схема — поместить файл во временное хранилище на клиенте методом НачатьПомещениеФайла, затем на сервере извлечь данные из хранилища во временный файл и уже его прочитать в табличный документ.
&НаСервере
Процедура ЗагрузитьНаСервере(АдресХранилища)
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилища);
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
ДвоичныеДанные.Записать(ИмяВременногоФайла);
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ИмяВременногоФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);
// ... дальнейшая обработка
УдалитьФайлы(ИмяВременногоФайла);
КонецПроцедуры
Для веб-клиента дополнительно потребуется расширение работы с файлами либо загрузка через диалог выбора файла браузера. В типовых конфигурациях часто уже есть готовые механизмы — например, обработки загрузки данных из табличного документа, которые решают задачу без программирования.
- 1На клиенте вызовите НачатьПомещениеФайла и получите адрес временного хранилища.
- 2Передайте адрес в серверную процедуру и извлеките двоичные данные.
- 3Сохраните данные во временный файл с расширением xlsx.
- 4Прочитайте файл в ТабличныйДокумент и выгрузите в таблицу значений.
- 5Проверьте количество строк и типы колонок перед записью в базу.
- 6Удалите временный файл и очистите хранилище.
Альтернативы: когда код не нужен
Если задача разовая или файлы имеют стабильную структуру, программная загрузка может не понадобиться. Во многих типовых конфигурациях есть встроенные инструменты импорта: загрузка номенклатуры и цен из табличного документа, универсальные обработки загрузки данных. Они позволяют сопоставить колонки файла полям объектов через интерфейс и сразу записать результат в базу.
Ещё один простой вариант — сохранить лист Excel в формате MXL (табличный документ 1С) через «Сохранить как» или скопировать данные напрямую в табличное поле формы, если объём небольшой. Для регулярных же загрузок с контролем качества данных собственная обработка с таблицей значений остаётся самым гибким решением.
Как выбрать подход
Часто задаваемые вопросы
Можно ли загрузить Excel в 1С без установленного Microsoft Excel?
Да. Метод ТабличныйДокумент.Прочитать() работает с файлами XLSX без офисного пакета, в том числе на сервере под Linux. Ограничение — читаются только значения ячеек, без доступа к формулам и настройкам листов.
Почему вместо чисел в таблицу попадают ошибки преобразования?
Чаще всего причина в неразрывных пробелах и символах валюты внутри чисел, которые Excel отображает, но хранит как часть текста. Перед вызовом Число() очищайте строку через СтрЗаменить от пробелов и лишних символов, а пустые значения заменяйте нулём.
Как прочитать не первый, а конкретный лист книги Excel?
Через ТабличныйДокумент выбор листа не поддерживается — читается активный лист. Если нужен конкретный лист, используйте COM-подключение: Excel.Workbooks.Open(Файл).Worksheets("ИмяЛиста"), либо заранее сохраните нужный лист отдельным файлом.
Что делать с датами, которые приходят как числа?
Excel хранит даты как количество дней от базовой точки. Если ТабличныйДокумент вернул число вместо даты, преобразуйте его: Дата = Дата(1899,12,30) + ЧислоИзExcel * 86400. При чтении со способом «Значение» платформа обычно распознаёт даты сама, но для пользовательских файлов это стоит проверять.
Почему серверная процедура не видит файл, который выбрал пользователь?
Сервер 1С работает на отдельной машине и не имеет доступа к локальным дискам клиента. Файл нужно сначала поместить во временное хранилище на клиенте, передать адрес в серверную процедуру, там извлечь двоичные данные и записать их во временный файл на сервере.
Как загрузить очень большой файл, если памяти не хватает?
ТабличныйДокумент загружает файл целиком, поэтому для файлов с сотнями тысяч строк подходит плохо. Варианты: попросить пользователей сохранять данные в CSV и читать его построчно через ЧтениеТекста, разбивать файл на части или использовать специализированные библиотеки чтения XLSX.
Что важно запомнить
Основной инструмент загрузки Excel в таблицу значений — ТабличныйДокумент с методом Прочитать() и построителем запроса; COM-подключение оставьте для случаев, когда нужны листы и формулы. Всегда проверяйте типы данных, очищайте числа от пробелов, закрывайте COM-объекты и помните, что сервер не видит файлы с клиентского компьютера.