Загрузка таблиц Excel в 1С:Предприятие 8.3 — от кнопки «Загрузить» до своей обработки

· 10 мин

Содержание

Выгрузить данные из Excel в 1С можно четырьмя путями. Разовый список товаров или контрагентов загружают штатной командой «Загрузить» прямо в списке справочника или в табличной части документа. Регулярный обмен с поставщиком лучше вынести во внешнюю обработку , которая читает .xlsx встроенным объектом ТабличныйДокумент. COM-доступ к Excel и ADO оставляют для особых случаев, а CSV — когда файл приходит из чужой системы и Excel под рукой нет.

Всё описанное относится к платформе 8.3 и интерфейсу «Такси». Механизм чтения файла общий для платформы, а штатная команда загрузки есть только в типовых конфигурациях на БСП.

Какой способ загрузки из Excel выбрать

Сначала определитесь с инструментом: от этого зависит, как готовить файл.

СпособКогда подходитЧто нужноОграничения
Штатная команда «Загрузить»Разово: номенклатура, контрагенты, строки накладнойТиповая конфигурация на БСП (БП 3.0, УТ 11, ЗУП 3.1)Только те объекты, где команда есть
ТабличныйДокумент.Прочитать()Регулярная загрузка, своя логика, сервер без ExcelПлатформа 8.3, права на внешние обработкиЧитает значения, а не формулы
COM Excel.ApplicationНужно работать с книгой как с объектом: листы, форматы, скрытые строкиУстановленный Excel, только WindowsМедленно, зависшие процессы EXCEL.EXE
ADO (Microsoft.ACE.OLEDB)Большой лист, нужен SQL-отбор строкДрайвер Access Database Engine той же разрядности, что и 1СТипы колонок драйвер угадывает по первым строкам
CSV через ЧтениеТекстаФайл из другой программы, Linux-серверНичего, кроме платформыКодировка, разделители, кавычки внутри полей
Что вы загружаете?

Как подготовить таблицу Excel к загрузке в 1С

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

  1. Оставьте одну строку заголовков в самом верху. Шапку бланка, логотип и пустые строки над таблицей удалите.
  2. Разъедините объединённые ячейки. Объединение превращает значение в пустоту для всех строк, кроме первой.
  3. Уберите итоговые строки «Всего», промежуточные итоги и группировки.
  4. Формулы замените значениями: Копировать → Специальная вставка → Значения. Так вы увидите ровно то, что прочитает 1С.
  5. Проверьте ключевую колонку: артикул, ИНН или код. По ней 1С будет искать существующие элементы.
  6. Сохраните файл в .xlsx. Старый .xls читается не всеми способами.

Отдельно о типах данных:

  • 🔢 Числа как текст. Зелёный треугольник в углу ячейки — признак того, что сумма записана строкой. Часто внутри неразрывный пробел вместо разделителя разрядов.
  • 📅 Даты. Дата должна быть датой Excel, а не строкой «12.03.25». Проверить просто: выровненное по правому краю значение — дата, по левому — текст.
  • 0️⃣ Ведущие нули. ИНН, начинающийся с нуля, и артикулы вроде 00125 Excel превращает в число и теряет нули. Задайте колонке текстовый формат до вставки данных.
  • 🔤 Лишние пробелы. «Ромашка ООО » и «Ромашка ООО» для 1С — разные строки. Функция СЖПРОБЕЛЫ в Excel или СокрЛП в коде решает проблему.

Добавьте в файл колонку с номером строки. Когда 1С сообщит «ошибка в строке 418», вы найдёте её за секунду, даже если таблица отсортирована иначе.

Штатная загрузка из табличного документа в типовых конфигурациях

В конфигурациях на Библиотеке стандартных подсистем (БП 3.0, УТ 11, КА 2, ЗУП 3.1) механизм загрузки встроен. Отдельная обработка для типовых сценариев не нужна.

Загрузка в справочник

  1. Откройте список справочника, например Справочники → Товары и услуги → Номенклатура.
  2. Найдите в командной панели кнопку «Загрузить» (если её не видно — в меню «Ещё»).
  3. Откроется форма с пустой таблицей. Скопируйте диапазон из Excel и вставьте его через Ctrl+V либо загрузите файл кнопкой выбора файла.
  4. Сопоставьте колонки: для каждой колонки укажите, какой реквизит 1С она заполняет (наименование, артикул, единица измерения, ставка НДС).
  5. Выберите, что делать с найденными элементами: только создавать новые или ещё и обновлять существующие.
  6. Посмотрите итоговую таблицу. Программа помечает строки: новый элемент, найден существующий, ошибка.
  7. Нажмите кнопку завершения загрузки.

Загрузка в табличную часть документа

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

Перед загрузкой с обновлением существующих элементов сделайте резервную копию базы. Отменить массовую перезапись реквизитов одной кнопкой нельзя.

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

Чтение xlsx кодом: ТабличныйДокумент и универсальные коллекции

Это основной способ для программиста. Объект ТабличныйДокумент в платформе 8.3 умеет открыть .xlsx без установленного Excel, в том числе на сервере под Linux.

Главная тонкость клиент-серверного варианта: файл лежит на компьютере пользователя, а код записи в базу работает на сервере. Поэтому файл сначала передают через временное хранилище.

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

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

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

	ТабДок = Новый ТабличныйДокумент;
	ТабДок.Прочитать(ИмяФайла);
	УдалитьФайлы(ИмяФайла);

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

	Для НомерСтроки = 2 По ТабДок.ВысотаТаблицы Цикл
		Артикул = СокрЛП(ТекстЯчейки(ТабДок, НомерСтроки, 1));
		Если ПустаяСтрока(Артикул) Тогда
			Продолжить;
		КонецЕсли;
		Строка = Данные.Добавить();
		Строка.НомерСтроки = НомерСтроки;
		Строка.Артикул = Артикул;
		Строка.Наименование = СокрЛП(ТекстЯчейки(ТабДок, НомерСтроки, 2));
		Строка.Цена = СтрокаВЧисло(ТекстЯчейки(ТабДок, НомерСтроки, 3));
	КонецЦикла;

	ЗаписатьДанные(Данные);
КонецПроцедуры

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

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

Почему сначала ТаблицаЗначений, а не запись в базу прямо в цикле:

  • ✅ данные можно проверить целиком до записи: дубли артикулов, пустые цены;
  • ✅ таблицу легко показать пользователю на форме для подтверждения;
  • ✅ поиск существующих элементов делается одним запросом по всем артикулам, а не тысячей обращений к базе.

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

Импорт через COM-соединение с Excel и ADO

COM: Excel как объект

Через COMОбъект 1С управляет настоящим Excel: открывает книгу, перебирает листы, читает ячейки. Нужно это редко — например, когда надо пропускать скрытые строки или читать конкретный именованный лист.

Excel = Новый COMОбъект("Excel.Application");
Excel.DisplayAlerts = Ложь;
Попытка
	Книга = Excel.Workbooks.Open(ИмяФайла);
	Лист = Книга.Worksheets(1);
	ВсегоСтрок = Лист.UsedRange.Rows.Count;
	Для НомерСтроки = 2 По ВсегоСтрок Цикл
		Артикул = Лист.Cells(НомерСтроки, 1).Value;
		Цена = Лист.Cells(НомерСтроки, 3).Value;
		// обработка строки
	КонецЦикла;
	Книга.Close(Ложь);
Исключение
	ТекстОшибки = ОписаниеОшибки();
КонецПопытки;
Excel.Quit();

Что знает практик про этот способ:

  • 🐢 Каждое обращение к Cells — вызов между процессами. 10 000 строк по 5 колонок — 50 000 вызовов, загрузка растягивается на минуты.
  • 🧟 Если код упал до Excel.Quit(), в диспетчере задач остаётся висеть EXCEL.EXE. Поэтому Quit() вынесен за пределы Попытка.
  • 🖥️ Excel должен стоять там, где выполняется код. Запускать его на сервере 1С Microsoft не рекомендует: автоматизация Office под службой работает нестабильно.

ADO: лист как таблица базы данных

Драйвер Access Database Engine позволяет читать лист Excel SQL-запросом. Это быстрее COM и не требует самого Excel.

Соединение = Новый COMОбъект("ADODB.Connection");
Соединение.Open("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ИмяФайла
	+ ";Extended Properties=""Excel 12.0 Xml;HDR=YES;IMEX=1""");
Выборка = Новый COMОбъект("ADODB.Recordset");
Выборка.Open("SELECT * FROM [Лист1$]", Соединение);
Пока НЕ Выборка.EOF Цикл
	Артикул = Выборка.Fields(0).Value;
	Выборка.MoveNext();
КонецЦикла;
Выборка.Close();
Соединение.Close();
  • HDR=YES — первая строка считается заголовками.
  • IMEX=1 — смешанные колонки читаются как текст. Без него драйвер может вернуть пустоту там, где в числовой колонке встретился текст.
  • Разрядность драйвера должна совпадать с разрядностью клиента или сервера 1С. 64-битный сервер с 32-битным драйвером выдаст ошибку «поставщик не зарегистрирован».

Загрузка через CSV и текстовый файл

Когда файл формирует другая программа или сервер 1С работает под Linux, проще всего попросить CSV. В Excel это Файл → Сохранить как → CSV UTF-8 (разделитель — запятая) или обычный CSV, который в русской локали сохраняется с точкой с запятой и в кодировке Windows-1251.

Чтение = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF8);
Чтение.ПрочитатьСтроку(); // заголовок пропускаем
Строка = Чтение.ПрочитатьСтроку();
Пока Строка <> Неопределено Цикл
	Поля = СтрРазделить(Строка, ";", Истина);
	Если Поля.Количество() >= 3 Тогда
		Артикул = СокрЛП(Поля[0]);
		Наименование = СокрЛП(Поля[1]);
		Цена = Поля[2];
	КонецЕсли;
	Строка = Чтение.ПрочитатьСтроку();
КонецЦикла;
Чтение.Закрыть();

Подводные камни CSV:

  • 🔣 Кодировка. Кракозябры вместо кириллицы — файл в Windows-1251, а читается как UTF-8. Укажите вторым параметром "windows-1251".
  • ✂️ Разделитель внутри значения. Наименование «Болт М8; оцинкованный» разобьётся на две колонки. Excel берёт такие значения в кавычки, а СтрРазделить про кавычки не знает. Для грязных данных пишите разбор с учётом кавычек или переходите на .xlsx.
  • 🔢 Дробная часть. В русском CSV разделитель дроби — запятая, поэтому та же функция СтрокаВЧисло из предыдущего раздела нужна и здесь.

Ошибки и журнал загрузки: как не потерять ни одной строки

Тихая загрузка, после которой «часть товаров куда-то делась», хуже честной ошибки. Каждая строка должна закончиться одним из трёх исходов: создана, обновлена, отклонена с причиной.

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

Процедура ЗаписатьОшибку(НомерСтроки, Текст)
	ЗаписьЖурналаРегистрации("ЗагрузкаИзExcel", УровеньЖурналаРегистрации.Ошибка, , ,
		СтрШаблон("Строка %1: %2", Формат(НомерСтроки, "ЧГ=0"), Текст));
КонецПроцедуры

Пример условный: цена здесь только проверяется, а куда её записывать (регистр цен, документ установки цен), зависит от конфигурации.

Что даёт такая схема:

  • 📒 ошибки видны в Администрирование → Обслуживание → Журнал регистрации с отбором по событию «ЗагрузкаИзExcel»;
  • 🔁 одна битая строка не останавливает загрузку остальных;
  • 📊 пользователь сразу видит итог и знает, сколько строк перепроверить.

Если нужна загрузка «всё или ничего» — например, строки накладной, — оборачивайте запись в НачатьТранзакцию() / ЗафиксироватьТранзакцию(), а в Исключение вызывайте ОтменитьТранзакцию(). Для справочника на десятки тысяч позиций одна большая транзакция, наоборот, вредна: она долго держит блокировки и мешает работать другим пользователям.

НайтиПоРеквизиту вернёт первый найденный элемент. Если в базе уже есть два товара с одним артикулом, обновится случайный из них. Перед массовой загрузкой проверьте справочник на дубли.

Своя внешняя обработка для регулярной загрузки

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

Создание

  1. В Конфигураторе: Файл → Новый → Внешняя обработка.
  2. Добавьте форму, на неё — команду «Загрузить» и табличное поле для предпросмотра данных.
  3. В модуль формы перенесите процедуры чтения файла и записи.
  4. Сохраните файл .epf.

Подключение к типовой конфигурации

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

Для регистрации в модуле объекта обработки нужна экспортная функция СведенияОВнешнейОбработке:

Функция СведенияОВнешнейОбработке() Экспорт
	ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
	ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
	ПараметрыРегистрации.Версия = "1.0";
	Команда = ПараметрыРегистрации.Команды.Добавить();
	Команда.Представление = "Загрузка прайса из Excel";
	Команда.Идентификатор = "ЗагрузкаПрайса";
	Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
	Возврат ПараметрыРегистрации;
КонецФункции

После регистрации обработка появляется в разделе «Дополнительные обработки» того раздела, который вы укажете при размещении. Пользователю остаётся выбрать файл и нажать одну кнопку.

Обработка готова к работе пользователей
Выполнено: 0 / 5

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

Почему 1С не видит данные со второго листа книги?
Простые способы чтения берут первый лист. Перенесите нужный лист на первое место в книге или читайте его по имени через COM или ADO ([ИмяЛиста$]).
Можно ли загрузить из Excel картинки товаров?
Через ТабличныйДокумент и CSV — нет, они читают только значения ячеек. Надёжнее хранить в Excel имя файла картинки и загружать изображения из папки отдельным шагом.
Загрузка из Excel работает в веб-клиенте и в облаке?
Да, если файл передаётся через временное хранилище, а читается на сервере ТабличнымДокументом. COM-способы в веб-клиенте и на Linux-сервере не работают.
Сколько строк выдерживает загрузка за раз?
Десятки тысяч строк через ТабличныйДокумент — обычная нагрузка. Узкое место — запись объектов в базу, а не чтение файла. Большой справочник разбейте на порции по несколько тысяч строк.
Excel показывает 1 250,50, а в 1С загрузилось 1250,5 или пусто — почему?
Пусто — значит число пришло текстом с неразрывным пробелом или в чужом формате. Очистите строку от пробелов и замените запятую на точку перед Число(), как в функции СтрокаВЧисло выше.