Переносим данные из Excel в 1С: от кнопки до кода
Содержание
Данные из Excel в 1С загружают четырьмя разными путями. Пользователю хватает встроенной команды «Загрузить данные
из файла» в списке справочника — кода там нет вообще. Разработчику нужен COM-объект Excel.Application или подключение через ADODB, а на сервере без Office выручает разбор файла .xlsx как набора XML.
Способ зависит от трёх вещей: разовая это загрузка или регулярная, установлен ли на машине Microsoft Office и куда переносим данные — в типовой справочник или в собственный документ. Ниже — каждый способ с конкретными путями меню и примерами кода, который читает значения ячеек целиком, а не обрывается на середине.
Excel.Application — читаете ячейки напрямую из кода.ADODB и SQL-запрос к листу..xlsx как XML или встроенные средства платформы.Встроенная загрузка без единой строки кода
Типовые конфигурации на базе Библиотеки стандартных подсистем (БП 3.0, УТ 11, ЗУП 3.1 и другие) умеют принимать Excel без обработок. Механизм называется «Загрузка данных из файла» и работает для справочников, которые его поддерживают, — в первую очередь Номенклатура и Контрагенты.
Порядок действий в БП 3.0:
- Откройте список справочника:
Справочники → Номенклатура. - В командной панели списка нажмите
Загрузить(в части релизов команда спрятана в группуЕщё). - Укажите файл
.xlsx,.xls,.odsили.mxl. - Сопоставьте колонки файла с реквизитами справочника — программа покажет таблицу «колонка Excel → реквизит 1С».
- Проверьте предпросмотр и нажмите
Загрузить данные.
Механизм сам находит строку с заголовками, предлагает варианты сопоставления и подсвечивает строки, которые не удалось распознать. Новые позиции он создаёт, а по совпадению наименования или артикула — обновляет существующие.
Если нужной команды «Загрузить» в списке нет, справочник её просто не поддерживает. Тогда переходите к универсальной обработке или коду.
Тот же механизм доступен в облачной 1С (сервис 1cfresh): встроенная загрузка там работает, потому что исполняется средствами самой платформы, а не внешним Excel.
Универсальная обработка «Загрузка из табличного документа»
Когда данные нужно перенести в документ, в регистр или в справочник без кнопки «Загрузить», берут универсальную внешнюю обработку. Самая известная — «Загрузка данных из табличного документа» (файл с расширением .epf). Она идёт в комплекте с ИТС и умеет заливать значения в любой объект конфигурации.
Как подключить и запустить:
- Получите файл обработки с диска ИТС или из поставки.
- В режиме 1С:Предприятие:
Файл → Открытьи выберите.epf, либо зарегистрируйте её черезАдминистрирование → Печатные формы, отчёты и обработки → Дополнительные отчёты и обработки. - В обработке укажите объект-приёмник (например, справочник
Номенклатураили документПоступлениеТоваровУслуг). - Загрузите табличный документ из файла Excel — или скопируйте диапазон прямо из Excel и вставьте в поле обработки через
Ctrl+V. - Настройте соответствие колонок реквизитам и запустите загрузку.
Главный плюс — гибкость: можно заполнять табличные части документов, подбирать значения по нескольким реквизитам сразу, задавать значения по умолчанию для незаполненных колонок.
Внешние обработки запускаются с полными правами. Берите .epf только из доверенного источника и проверяйте перед загрузкой в рабочую базу. В облачной 1С запуск произвольных обработок ограничен безопасным режимом.
Чтение Excel через COM-объект
Если загрузка — часть вашей доработки и код выполняется на Windows с установленным Excel, самый прямой путь — автоматизация через COM. Платформа создаёт внешнее приложение Excel и читает ячейки по координатам.
Эксель = Новый COMОбъект("Excel.Application");
Эксель.Visible = Ложь;
Попытка
Книга = Эксель.Workbooks.Open(ПутьКФайлу);
Лист = Книга.WorkSheets(1);
ВсегоСтрок = Лист.UsedRange.Row + Лист.UsedRange.Rows.Count - 1;
// первая строка — заголовки, данные с 2-й
Для НомерСтроки = 2 По ВсегоСтрок Цикл
Наименование = Лист.Cells(НомерСтроки, 1).Value;
Артикул = Лист.Cells(НомерСтроки, 2).Value;
Цена = Лист.Cells(НомерСтроки, 3).Value;
ЗаписатьНоменклатуру(Наименование, Артикул, Цена);
КонецЦикла;
Книга.Close(Ложь);
Исключение
Сообщить("Ошибка чтения файла: " + ОписаниеОшибки());
КонецПопытки;
Эксель.Quit();
Эксель = Неопределено;
Разбор кода по шагам:
UsedRangeвозвращает занятый диапазон; его реальную последнюю строку считают какRow + Rows.Count - 1, иначе пустые отформатированные ячейки собьют границу.Cells(строка, колонка).Valueотдаёт значение ячейки; нумерация с единицы.Visible = Ложьпрячет окно Excel, чтобы оно не всплывало у пользователя.
Лист можно открыть и по имени, а не по номеру: Книга.WorkSheets("Прайс"). Количество листов в книге отдаёт Книга.WorkSheets.Count — удобно, когда данные разложены по нескольким листам и обойти нужно каждый. Объединённые ячейки читаются по координате левой верхней: остальные входящие в объединение ячейки вернут пустое значение, это нормально.
Обязательно вызывайте Эксель.Quit() и присваивайте переменной Неопределено. Если этого не сделать, процесс excel.exe останется висеть в памяти. На сервере, где загрузки идут пачками, десятки таких процессов за день съедают оперативную память.
COM-автоматизацию выполняют там, где физически стоит Excel. На управляемых формах это, как правило, клиент (&НаКлиенте). Запускать COM с сервера приложений не рекомендуется: Office на сервере не устанавливают, а исполнение под учётной записью службы работает нестабильно.
ADODB — когда файл большой
COM через Excel.Application открывает весь файл в памяти и на книгах в десятки тысяч строк тормозит. Для таких объёмов быстрее подключение через ADODB: лист Excel читается как таблица базы данных SQL-запросом, без запуска самого Excel.
Соединение = Новый COMОбъект("ADODB.Connection");
СтрокаПодключения = "Provider=Microsoft.ACE.OLEDB.12.0;"
+ "Data Source=" + ПутьКФайлу + ";"
+ "Extended Properties=""Excel 12.0 Xml;HDR=YES;IMEX=1"";";
Соединение.Open(СтрокаПодключения);
Выборка = Новый COMОбъект("ADODB.Recordset");
Выборка.Open("SELECT * FROM [Лист1$]", Соединение);
Пока НЕ Выборка.EOF() Цикл
Наименование = Выборка.Fields("Наименование").Value;
Цена = Выборка.Fields("Цена").Value;
Выборка.MoveNext();
КонецЦикла;
Выборка.Close();
Соединение.Close();
Что важно в строке подключения:
Microsoft.ACE.OLEDB.12.0— провайдер для.xlsx. Для старого.xlsставятMicrosoft.Jet.OLEDB.4.0и свойствоExcel 8.0вместоExcel 12.0 Xml.HDR=YES— первая строка листа считается заголовками, по ним работаетFields("Наименование").IMEX=1— смешанные колонки (числа вперемешку с текстом) читаются как текст, чтобы артикулы вида0012не теряли ведущие нули.[Лист1$]— имя листа в квадратных скобках со знаком$. Можно указать и диапазон:[Лист1$A1:D500].
Провайдер ACE входит в состав Office; на машине без Office его ставят отдельным пакетом Access Database Engine. Поэтому ADODB снимает запуск Excel, но не зависимость от провайдера Microsoft.
Разбор XLSX как набора XML — для сервера без Office
Файл .xlsx — это обычный zip-архив с XML внутри. Если 1С крутится на Linux или на Windows без Office, ни COM, ни ADODB не поднимутся. Тогда файл разбирают средствами самой платформы: распаковывают архив и читают XML листов.
Чтение = Новый ЧтениеZipФайла(ПутьКФайлу);
КаталогРаспаковки = ПолучитьИмяВременногоФайла();
Чтение.ИзвлечьВсе(КаталогРаспаковки, РежимВосстановленияПутейФайловZIP.Восстанавливать);
Чтение.Закрыть();
// данные листов лежат в xl/worksheets/sheet1.xml,
// строковые значения — в общей таблице xl/sharedStrings.xml
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(КаталогРаспаковки + "/xl/worksheets/sheet1.xml");
Пока ЧтениеXML.Прочитать() Цикл
// обход узлов <row> и <c> (ячеек)
КонецЦикла;
ЧтениеXML.Закрыть();
Способ кросс-платформенный и не требует ничего, кроме платформы. Расплата — ручная работа с форматом: текстовые значения хранятся не в ячейках листа, а отдельной таблицей sharedStrings.xml, и ячейка ссылается на строку по индексу. Даты лежат числом (серийная дата Excel), его придётся переводить в тип Дата.
Для разовой задачи это перебор. Но для регулярной загрузки на серверной Linux-ферме, где Office нет и не будет, — единственный надёжный вариант без внешних сервисов.
CSV-файл из Excel читается ещё проще — обычным ЧтениеТекста построчно с разделением по ;. Если источник позволяет выгружать CSV, это снимает добрую половину проблем с форматами.
Коротко, чем способы отличаются на практике:
| Способ | Нужен Office | Где исполняется | Когда брать |
|---|---|---|---|
| Встроенная загрузка | нет | платформа | разовый перенос в типовой справочник |
| Внешняя обработка | нет | платформа | загрузка в документ или нетиповой объект |
COM Excel.Application | да | клиент | своя доработка на Windows с Office |
ADODB + SQL | провайдер ACE | клиент | большие файлы, важна скорость |
| Разбор XML | нет | клиент/сервер | Linux или Windows без Office |
Чем правее в таблице задача, тем больше кода и тем меньше зависимость от стороннего ПО.
Загрузка по расписанию и через внешние сервисы
Когда файлы приходят регулярно — прайс от поставщика каждое утро, выгрузка из чужой учётной системы, — ручной запуск убирают. Варианты:
- Регламентное задание. Код загрузки (любым из способов выше) оформляют процедурой и вешают на регламентное задание, которое раз в сутки проверяет заданную папку и обрабатывает новые файлы.
- Приём через HTTP-сервис. В 1С публикуют HTTP-сервис (
Администрирование → Публикация на веб-сервере), на который внешняя система шлёт данные POST-запросом. Excel при этом обычно конвертируют в JSON или CSV на стороне отправителя. - Обращение к REST API источника. Если данные лежат в облачном сервисе (Google Таблицы, учётная система партнёра), 1С сама забирает их через
HTTPСоединениеи разбирает ответ. Excel как промежуточный формат тут не нужен вовсе.
Для регулярных обменов Excel — не лучший формат: он не описывает типы данных и легко ломается при ручной правке. Если есть выбор, с партнёром договариваются о CSV, JSON или прямом обмене, а Excel оставляют для разовых загрузок.
Почему загрузка срывается и как это чинить
Большинство сбоев — не в 1С, а в самом файле или в окружении, где исполняется код.
IMEX=1, для COM — приводите значение явно через Число() или СокрЛП().UsedRange захватил отформатированные, но пустые ячейки. Проверяйте строку на заполненность ключевого поля перед записью.&НаКлиенте либо используйте разбор XML на сервере.Отдельная типовая беда — дубли. Если механизм загрузки сопоставляет позиции по наименованию, а в файле есть лишние пробелы или разный регистр, 1С создаст новые элементы вместо обновления старых. Перед загрузкой чистите ключевое поле через СокрЛП() и сверяйте результат на тестовой копии базы, а не сразу в рабочей.
Частые вопросы
Можно ли загрузить Excel, если на компьютере не установлен Office?
.xlsx как XML работают без Office — их выполняет сама платформа. А вот COM-объект Excel.Application и подключение через ADODB требуют либо Excel, либо провайдер Microsoft на той машине, где исполняется код.Чем отличается загрузка xls и xlsx?
.xlsx нужен Microsoft.ACE.OLEDB.12.0, для старого .xls — Microsoft.Jet.OLEDB.4.0. Встроенная загрузка и обработки различают форматы сами по расширению.Работает ли загрузка из Excel в облачной 1С?
Excel.Application там не запустится.Как загрузить данные сразу в документ, а не в справочник?
Почему COM-загрузка не работает на сервере?
&НаКлиенте), а для серверной обработки используйте разбор XML или ADODB с установленным провайдером.