Как прочитать файл Excel в 1С через ТабличныйДокумент: пошагово с примерами

· 11 мин

Содержание

Чтобы загрузить файл Excel в 1С 8.3, создайте объект ТабличныйДокумент и вызовите его метод Прочитать(ИмяФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение). Платформа сама разбирает xlsx и xls: установленный Excel не нужен, код работает и на сервере под Linux. Дальше остаётся пройти по строкам и ячейкам и записать данные в справочник, документ или регистр.

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

Какими способами загрузить Excel в 1С

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

СпособКогда подходитОграничения
Метод ТабличныйДокумент.ПрочитатьВнешняя обработка или доработка конфигурации, регулярные загрузкиНужно писать код
Файл → Открыть в пользовательском режимеПосмотреть файл, скопировать фрагментДанные в базу не попадают
Команда «Загрузить» в типовой конфигурацииТовары в документ, номенклатура в справочникТолько объекты, которые предусмотрели разработчики
Универсальная обработка загрузки из табличного документаРазовая загрузка в справочник или табличную часть без программированияНастраивать колонки руками на каждую загрузку
COM-объект Excel.ApplicationСтарый код, нужен доступ к формулам и форматированиюТолько Windows, нужен установленный Excel, медленно

Для новой разработки берите Прочитать. COM-подключение к Excel в 8.3 — это наследие: оно зависает при скрытых диалогах Excel, оставляет процессы EXCEL.EXE в памяти и не работает на сервере под Linux.

Загрузка без программирования

Если задача разовая, код может и не понадобиться:

  • 📂 Открыть файл в 1С. В главном меню (кнопка с тремя полосками слева вверху) выберите Файл → Открыть и укажите xlsx. Файл откроется как табличный документ 1С. Его можно сохранить в формате mxl или скопировать фрагмент.
  • 📦 Команда «Загрузить» в БП 3.0. В табличной части «Товары» документов поступления и реализации, а также в списке номенклатуры есть команда загрузки из файла (в части релизов она спрятана в меню «Ещё»). Откроется форма-таблица: вставьте в неё данные из Excel через буфер обмена и сопоставьте колонки.
  • 🧰 Универсальная обработка «Загрузка данных из табличного документа» — внешняя обработка, которую подключают через Файл → Открыть. Она умеет загружать в справочники, табличные части и регистры сведений, колонки сопоставляются вручную.

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

Подготовка файла Excel перед загрузкой в 1С

Половина проблем при чтении решается ещё в Excel. Перед загрузкой проверьте файл по короткому списку:

  1. Одна строка шапки. Названия колонок — в первой строке, без объединённых ячеек и многоуровневых заголовков.
  2. Данные с первой колонки. Без пустых колонок слева и пустых строк между шапкой и данными.
  3. Один лист с данными. Нужная таблица — на первом листе, лишние листы лучше удалить.
  4. Без итоговых строк. Строка «Итого» внизу превратится в товар с названием «Итого».
  5. Ключ сопоставления. Колонка, по которой 1С найдёт объект: артикул, ИНН, код. Название товара — плохой ключ: «Бумага А4» и «Бумага A4» с латинской A — разные строки.
  6. Формат xlsx. Если файл пришёл в старом xls или с паролем, откройте его в Excel и сохраните заново как «Книга Excel (*.xlsx)» без пароля.

💡 Формулы в ячейках не мешают: платформа берёт значение, которое Excel сохранил в файле при последнем пересчёте. Но если xlsx сформировала сторонняя программа, сохранённых значений может не быть — тогда ячейки придут пустыми. Лечится так: открыть файл в Excel и пересохранить.

Как загрузить Excel в табличный документ кодом: пошагово

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

Шаг 1. Выбор файла и передача на сервер

На клиенте у формы нет доступа к файловой системе сервера, поэтому файл помещают во временное хранилище:

&НаКлиенте
Процедура ЗагрузитьИзExcel(Команда)
	Оповещение = Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтотОбъект);
	НачатьПомещениеФайла(Оповещение, , , Истина, УникальныйИдентификатор);
КонецПроцедуры

&НаКлиенте
Процедура ПослеПомещенияФайла(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
	Если Не Результат Тогда
		Возврат; // пользователь закрыл диалог
	КонецЕсли;
	Расширение = Новый Файл(ВыбранноеИмяФайла).Расширение; // ".xlsx" или ".xls"
	ЗагрузитьНаСервере(Адрес, Расширение);
КонецПроцедуры

Четвёртый параметр Истина открывает диалог выбора файла. Асинхронный вызов через оповещение работает и в веб-клиенте, где модальные окна запрещены.

Шаг 2. Чтение файла в ТабличныйДокумент

Метод Прочитать принимает путь к файлу, поэтому двоичные данные из хранилища сначала записываются во временный файл. Расширение сохраняем исходное — по нему платформа понимает формат:

&НаСервере
Процедура ЗагрузитьНаСервере(Адрес, Расширение)
	ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);
	ИмяФайла = ПолучитьИмяВременногоФайла(Сред(Расширение, 2));
	ДвоичныеДанные.Записать(ИмяФайла);

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

	ТаблицаДанных = ТабличныйДокументВТаблицу(ТабДок);
	ЗаписатьДанные(ТаблицаДанных);
КонецПроцедуры

Шаг 3. Текст или значение: что выбрать

Второй параметр Прочитать определяет, что окажется в ячейках:

РежимЧто получитеКогда брать
СпособЧтенияЗначенийТабличногоДокумента.ТекстСтроку в том виде, как она показана в Excel: 1 250,50, 15.03.2025Нужен только текст: артикулы, наименования
СпособЧтенияЗначенийТабличногоДокумента.ЗначениеТипизированное значение: число 1250.5, дата 15.03.2025Суммы, количества, даты

Указывайте режим явно, не надейтесь на значение по умолчанию. В режиме «Значение» у ячейки доступны оба свойства: Значение с типизированными данными и Текст с представлением.

Разбор структуры Excel: шапка, колонки и таблица значений

Обращаться к ячейкам по жёстким номерам колонок — Область(Стр, 3, Стр, 3) — ненадёжно. Контрагент добавит колонку «Примечание» в начало, и цена окажется в поле количества. Правильнее найти колонки по названиям в шапке, а данные сложить в ТаблицаЗначений.

Карта колонок по шапке

&НаСервере
Функция ТабличныйДокументВТаблицу(ТабДок)
	// какие колонки ищем: имя колонки в 1С -> название в шапке Excel
	Нужные = Новый Соответствие;
	Нужные.Вставить("Артикул", "артикул");
	Нужные.Вставить("Количество", "количество");
	Нужные.Вставить("Цена", "цена");

	НомераКолонок = Новый Соответствие;
	Для НомерКолонки = 1 По ТабДок.ШиринаТаблицы Цикл
		Заголовок = НРег(СокрЛП(ТабДок.Область(1, НомерКолонки, 1, НомерКолонки).Текст));
		Для Каждого Элемент Из Нужные Цикл
			Если Заголовок = Элемент.Значение Тогда
				НомераКолонок.Вставить(Элемент.Ключ, НомерКолонки);
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;

	Для Каждого Элемент Из Нужные Цикл
		Если НомераКолонок[Элемент.Ключ] = Неопределено Тогда
			ВызватьИсключение СтрШаблон("В шапке файла нет колонки «%1»", Элемент.Значение);
		КонецЕсли;
	КонецЦикла;

	Результат = Новый ТаблицаЗначений;
	Результат.Колонки.Добавить("НомерСтроки", Новый ОписаниеТипов("Число"));
	Результат.Колонки.Добавить("Артикул", Новый ОписаниеТипов("Строка"));
	Результат.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));
	Результат.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));

	Для НомерСтроки = 2 По ТабДок.ВысотаТаблицы Цикл
		Артикул = СокрЛП(Ячейка(ТабДок, НомерСтроки, НомераКолонок["Артикул"]).Текст);
		Если ПустаяСтрока(Артикул) Тогда
			Продолжить; // пустая строка в середине или хвост файла
		КонецЕсли;
		НоваяСтрока = Результат.Добавить();
		НоваяСтрока.НомерСтроки = НомерСтроки;
		НоваяСтрока.Артикул = Артикул;
		НоваяСтрока.Количество = ЧислоИзЯчейки(Ячейка(ТабДок, НомерСтроки, НомераКолонок["Количество"]));
		НоваяСтрока.Цена = ЧислоИзЯчейки(Ячейка(ТабДок, НомерСтроки, НомераКолонок["Цена"]));
	КонецЦикла;

	Возврат Результат;
КонецФункции

&НаСервере
Функция Ячейка(ТабДок, НомерСтроки, НомерКолонки)
	Возврат ТабДок.Область(НомерСтроки, НомерКолонки, НомерСтроки, НомерКолонки);
КонецФункции

Сравнение заголовков через НРег и СокрЛП прощает «Цена », «ЦЕНА» и случайный пробел в конце. Колонку НомерСтроки храним, чтобы в протоколе ошибок указать пользователю строку файла, а не строку таблицы значений.

Размеры таблицы

  • ВысотаТаблицы — номер последней заполненной строки, ШиринаТаблицы — последней заполненной колонки.
  • Если в Excel когда-то заполняли ячейку в строке 50 000, а потом стёрли, высота может оказаться больше реальных данных. Поэтому проверка на пустой ключ в цикле обязательна.
  • Скрытые строки и колонки Excel читаются наравне с видимыми. Фильтр автофильтра на загрузку не влияет.

Типы данных, даты, числа и кодировки при чтении Excel

Даже в режиме «Значение» ячейка не всегда приходит нужного типа. Если в Excel число записано как текст (зелёный треугольник в углу ячейки), в 1С вы получите строку. Отсюда правило: число и дату всегда приводите функцией-помощником.

Числа

&НаСервере
Функция ЧислоИзЯчейки(Область)
	Если Область.СодержитЗначение И ТипЗнч(Область.Значение) = Тип("Число") Тогда
		Возврат Область.Значение;
	КонецЕсли;
	Текст = СокрЛП(Область.Текст);
	Текст = СтрЗаменить(Текст, " ", "");
	Текст = СтрЗаменить(Текст, Символы.НПП, ""); // неразрывный пробел-разделитель разрядов
	Текст = СтрЗаменить(Текст, ",", ".");
	Если ПустаяСтрока(Текст) Тогда
		Возврат 0;
	КонецЕсли;
	Попытка
		Возврат Число(Текст);
	Исключение
		Возврат 0;
	КонецПопытки;
КонецФункции

Неразрывный пробел — частый гость в выгрузках из банков и маркетплейсов. Обычный СтрЗаменить(Текст, " ", "") его не убирает, и Число() падает с ошибкой преобразования.

⚠️ Возврат нуля при ошибке удобен, но опасен: товар загрузится с нулевой ценой без единого сообщения. В рабочей обработке добавьте такую строку в протокол ошибок.

Даты

Дата в Excel хранится как порядковый номер дня. Если ячейка отформатирована как число, вместо 15.03.2025 придёт 45731. Перевод в дату 1С: Дата(1899, 12, 30) + 45731 * 86400. Проверим на известной точке: номер 45658 соответствует 01.01.2025.

&НаСервере
Функция ДатаИзЯчейки(Область)
	Если Область.СодержитЗначение И ТипЗнч(Область.Значение) = Тип("Дата") Тогда
		Возврат Область.Значение;
	КонецЕсли;
	Текст = СокрЛП(Область.Текст);
	Если ПустаяСтрока(Текст) Тогда
		Возврат Дата(1, 1, 1);
	КонецЕсли;
	Части = СтрРазделить(Лев(Текст, 10), ".");
	Попытка
		Если Части.Количество() = 3 Тогда // формат ДД.ММ.ГГГГ
			Возврат Дата(Число(Части[2]), Число(Части[1]), Число(Части[0]));
		КонецЕсли;
		Возврат Дата(1899, 12, 30) + Число(Текст) * 86400; // номер дня Excel
	Исключение
		Возврат Дата(1, 1, 1);
	КонецПопытки;
КонецФункции

Строки и коды

  • 🔢 Артикулы и коды с ведущими нулями («00125») в режиме «Значение» могут прийти числом 125. Для таких колонок берите свойство Текст, а не Значение.
  • 🔤 Длинные номера (ИНН, штрихкоды) в Excel, отформатированные как число, превращаются в 4,6071E+12. Исправлять нужно в самом файле: формат ячеек «Текстовый» и повторный ввод.

Кодировки и CSV

Для xlsx кодировка не важна: внутри это архив XML-файлов в UTF-8. Кодировка становится проблемой, когда вместо Excel присылают CSV. Excel в русской локали сохраняет обычный CSV в Windows-1251 с разделителем «;», а вариант «CSV UTF-8» — в UTF-8 с меткой BOM.

Чтение = Новый ЧтениеТекста(ИмяФайла, "windows-1251"); // для «CSV UTF-8» укажите КодировкаТекста.UTF8
Строка = Чтение.ПрочитатьСтроку();
Пока Строка <> Неопределено Цикл
	Поля = СтрРазделить(Строка, ";", Истина);
	// Поля[0] — первая колонка, Поля[1] — вторая и т. д.
	Строка = Чтение.ПрочитатьСтроку();
КонецЦикла;
Чтение.Закрыть();

Если вместо кириллицы видите Товар, файл в UTF-8, а читаете его как 1251. Если видите Òîâàð — наоборот. Учтите и то, что простое деление по «;» ломается, когда точка с запятой встречается внутри значения в кавычках. Для таких файлов надёжнее попросить у отправителя xlsx.

Запись загруженных данных в базу

Таблица значений — промежуточный этап. Финальный шаг — найти или создать объекты и записать их. Пример для обновления цены в реквизите справочника по артикулу:

&НаСервере
Процедура ЗаписатьДанные(ТаблицаДанных)
	Ошибки = Новый Массив;
	Для Каждого Строка Из ТаблицаДанных Цикл
		Ссылка = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", Строка.Артикул);
		Если Ссылка.Пустая() Тогда
			Ошибки.Добавить(СтрШаблон("Строка %1: артикул %2 не найден",
				Формат(Строка.НомерСтроки, "ЧГ=0"), Строка.Артикул));
			Продолжить;
		КонецЕсли;
		// дальше — запись цены, количества и т. п. в нужный объект вашей конфигурации
	КонецЦикла;
	Для Каждого ТекстОшибки Из Ошибки Цикл
		Сообщение = Новый СообщениеПользователю;
		Сообщение.Текст = ТекстОшибки;
		Сообщение.Сообщить();
	КонецЦикла;
КонецПроцедуры

Формат(..., "ЧГ=0") убирает разделитель разрядов: без него строка 1250 в сообщении превратится в «1 250». Для нескольких тысяч строк поиск НайтиПоРеквизиту в цикле работает медленно. Быстрее одним запросом получить все артикулы из файла и их ссылки, передав таблицу значений в запрос как параметр.

Автоматическая загрузка Excel и сохранение результата

Когда файл приходит каждый день — прайс поставщика, остатки склада, отчёт маркетплейса — ручной выбор файла надоедает. Загрузку можно поставить на расписание.

Регламентное задание

Если конфигурация дорабатывается, создайте в Конфигураторе регламентное задание с процедурой в общем модуле. Процедура читает папку обмена на сервере:

Процедура ЗагрузкаПрайсовПоРасписанию() Экспорт
	Файлы = НайтиФайлы("\\fileserver\obmen\prices", "*.xlsx");
	Для Каждого Файл Из Файлы Цикл
		ТабДок = Новый ТабличныйДокумент;
		ТабДок.Прочитать(Файл.ПолноеИмя, СпособЧтенияЗначенийТабличногоДокумента.Значение);
		// разбор и запись — те же функции, что и в интерактивной загрузке
		ПереместитьФайл(Файл.ПолноеИмя, "\\fileserver\obmen\prices\archive\" + Файл.Имя);
	КонецЦикла;
КонецПроцедуры

Для типовой конфигурации без изменения кода подходит механизм дополнительных обработок: в разделе Администрирование → Печатные формы, отчёты и обработки подключите внешнюю обработку как дополнительную и включите для её команды расписание.

Задание выполняется от имени пользователя, под которым работает служба сервера 1С, а не от вашего. Именно у этой учётной записи должны быть права на чтение и запись сетевой папки. Это частая причина того, что вручную загрузка проходит, а по расписанию — нет.

Сохранение протокола

Протокол загрузки удобно отдать тем же табличным документом. Соберите в ТабличныйДокумент строки с ошибками и запишите его в Excel:

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

Пользователь откроет протокол в Excel, исправит строки и загрузит повторно только их. Перемещение обработанного файла в архив защищает от повторной загрузки того же прайса.

Ошибки при чтении Excel в 1С и как их устранить

Диагностика: выберите симптом

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

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

Нужно ли устанавливать Excel на сервер 1С, чтобы читать xlsx?
Нет. Метод Прочитать табличного документа разбирает файл средствами платформы. Excel нужен только для старого способа через COM-объект.
Можно ли прочитать Excel в тонком клиенте без передачи файла на сервер?
Объект ТабличныйДокумент доступен и на клиенте, но запись в базу всё равно идёт на сервере. Проще сразу передать файл через временное хранилище и читать его там.
Как загрузить в 1С сразу несколько листов книги Excel?
Надёжнее всего разнести листы по отдельным файлам или собрать данные на одном листе с колонкой-признаком. Код загрузки при этом не меняется.
Можно ли загрузить в 1С картинки из Excel?
Метод Прочитать переносит значения ячеек. Изображения товаров надёжнее передавать отдельными файлами с именем по артикулу и прикреплять к карточкам своей процедурой.
Чем табличный документ лучше загрузки через ADO и драйвер ACE?
ADO требует установленного драйвера Microsoft Access Database Engine нужной разрядности и работает только в Windows. Табличный документ не зависит от внешних компонентов.