Загрузка таблиц Excel в 1С:Предприятие 8.3 — от кнопки «Загрузить» до своей обработки
Содержание
Выгрузить данные из 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С. - Проверьте ключевую колонку: артикул, ИНН или код. По ней 1С будет искать существующие элементы.
- Сохраните файл в
.xlsx. Старый.xlsчитается не всеми способами.
Отдельно о типах данных:
- 🔢 Числа как текст. Зелёный треугольник в углу ячейки — признак того, что сумма записана строкой. Часто внутри неразрывный пробел вместо разделителя разрядов.
- 📅 Даты. Дата должна быть датой Excel, а не строкой «12.03.25». Проверить просто: выровненное по правому краю значение — дата, по левому — текст.
- 0️⃣ Ведущие нули. ИНН, начинающийся с нуля, и артикулы вроде
00125Excel превращает в число и теряет нули. Задайте колонке текстовый формат до вставки данных. - 🔤 Лишние пробелы. «Ромашка ООО » и «Ромашка ООО» для 1С — разные строки. Функция
СЖПРОБЕЛЫв Excel илиСокрЛПв коде решает проблему.
Добавьте в файл колонку с номером строки. Когда 1С сообщит «ошибка в строке 418», вы найдёте её за секунду, даже если таблица отсортирована иначе.
Штатная загрузка из табличного документа в типовых конфигурациях
В конфигурациях на Библиотеке стандартных подсистем (БП 3.0, УТ 11, КА 2, ЗУП 3.1) механизм загрузки встроен. Отдельная обработка для типовых сценариев не нужна.
Загрузка в справочник
- Откройте список справочника, например
Справочники → Товары и услуги → Номенклатура. - Найдите в командной панели кнопку «Загрузить» (если её не видно — в меню «Ещё»).
- Откроется форма с пустой таблицей. Скопируйте диапазон из Excel и вставьте его через
Ctrl+Vлибо загрузите файл кнопкой выбора файла. - Сопоставьте колонки: для каждой колонки укажите, какой реквизит 1С она заполняет (наименование, артикул, единица измерения, ставка НДС).
- Выберите, что делать с найденными элементами: только создавать новые или ещё и обновлять существующие.
- Посмотрите итоговую таблицу. Программа помечает строки: новый элемент, найден существующий, ошибка.
- Нажмите кнопку завершения загрузки.
Загрузка в табличную часть документа
В документах поступления, реализации и заказах команда загрузки стоит над табличной частью «Товары». Порядок тот же: вставили данные, сопоставили колонки, проверили, перенесли. Товары ищутся по артикулу, штрихкоду или наименованию.
Перед загрузкой с обновлением существующих элементов сделайте резервную копию базы. Отменить массовую перезапись реквизитов одной кнопкой нельзя.
Если команды «Загрузить» в нужном списке нет, проверьте релиз конфигурации и права пользователя. В старых релизах и сильно доработанных конфигурациях механизма может не быть — тогда переходите к внешней обработке.
Чтение 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»; - 🔁 одна битая строка не останавливает загрузку остальных;
- 📊 пользователь сразу видит итог и знает, сколько строк перепроверить.
Если нужна загрузка «всё или ничего» — например, строки накладной, — оборачивайте запись в НачатьТранзакцию() / ЗафиксироватьТранзакцию(), а в Исключение вызывайте ОтменитьТранзакцию(). Для справочника на десятки тысяч позиций одна большая транзакция, наоборот, вредна: она долго держит блокировки и мешает работать другим пользователям.
НайтиПоРеквизиту вернёт первый найденный элемент. Если в базе уже есть два товара с одним артикулом, обновится случайный из них. Перед массовой загрузкой проверьте справочник на дубли.
Своя внешняя обработка для регулярной загрузки
Когда один и тот же файл приходит каждую неделю, код из разделов выше собирают во внешнюю обработку. Конфигурацию при этом менять не нужно — обновления типовой продолжат ставиться без конфликтов.
Создание
- В Конфигураторе:
Файл → Новый → Внешняя обработка. - Добавьте форму, на неё — команду «Загрузить» и табличное поле для предпросмотра данных.
- В модуль формы перенесите процедуры чтения файла и записи.
- Сохраните файл
.epf.
Подключение к типовой конфигурации
Чтобы обработку не открывать каждый раз через Файл → Открыть, зарегистрируйте её в справочнике дополнительных обработок: Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки. Если пункт неактивен, включите там же флажок использования дополнительных отчётов и обработок.
Для регистрации в модуле объекта обработки нужна экспортная функция СведенияОВнешнейОбработке:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
ПараметрыРегистрации.Версия = "1.0";
Команда = ПараметрыРегистрации.Команды.Добавить();
Команда.Представление = "Загрузка прайса из Excel";
Команда.Идентификатор = "ЗагрузкаПрайса";
Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
Возврат ПараметрыРегистрации;
КонецФункции
После регистрации обработка появляется в разделе «Дополнительные обработки» того раздела, который вы укажете при размещении. Пользователю остаётся выбрать файл и нажать одну кнопку.
Частые вопросы
Почему 1С не видит данные со второго листа книги?
[ИмяЛиста$]).Можно ли загрузить из Excel картинки товаров?
ТабличныйДокумент и CSV — нет, они читают только значения ячеек. Надёжнее хранить в Excel имя файла картинки и загружать изображения из папки отдельным шагом.Загрузка из Excel работает в веб-клиенте и в облаке?
ТабличнымДокументом. COM-способы в веб-клиенте и на Linux-сервере не работают.Сколько строк выдерживает загрузка за раз?
ТабличныйДокумент — обычная нагрузка. Узкое место — запись объектов в базу, а не чтение файла. Большой справочник разбейте на порции по несколько тысяч строк.Excel показывает 1 250,50, а в 1С загрузилось 1250,5 или пусто — почему?
Число(), как в функции СтрокаВЧисло выше.