Как прочитать файл Excel в 1С через ТабличныйДокумент: пошагово с примерами
Содержание
Чтобы загрузить файл 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С найдёт объект: артикул, ИНН, код. Название товара — плохой ключ: «Бумага А4» и «Бумага A4» с латинской A — разные строки.
- Формат 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?
Прочитать переносит значения ячеек. Изображения товаров надёжнее передавать отдельными файлами с именем по артикулу и прикреплять к карточкам своей процедурой.