Переносим данные из Excel в 1С: от кнопки до кода

· 9 мин

Содержание

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

Способ зависит от трёх вещей: разовая это загрузка или регулярная, установлен ли на машине Microsoft Office и куда переносим данные — в типовой справочник или в собственный документ. Ниже — каждый способ с конкретными путями меню и примерами кода, который читает значения ячеек целиком, а не обрывается на середине.

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

Встроенная загрузка без единой строки кода

Типовые конфигурации на базе Библиотеки стандартных подсистем (БП 3.0, УТ 11, ЗУП 3.1 и другие) умеют принимать Excel без обработок. Механизм называется «Загрузка данных из файла» и работает для справочников, которые его поддерживают, — в первую очередь Номенклатура и Контрагенты.

Порядок действий в БП 3.0:

  1. Откройте список справочника: Справочники → Номенклатура.
  2. В командной панели списка нажмите Загрузить (в части релизов команда спрятана в группу Ещё).
  3. Укажите файл .xlsx, .xls, .ods или .mxl.
  4. Сопоставьте колонки файла с реквизитами справочника — программа покажет таблицу «колонка Excel → реквизит 1С».
  5. Проверьте предпросмотр и нажмите Загрузить данные.

Механизм сам находит строку с заголовками, предлагает варианты сопоставления и подсвечивает строки, которые не удалось распознать. Новые позиции он создаёт, а по совпадению наименования или артикула — обновляет существующие.

Если нужной команды «Загрузить» в списке нет, справочник её просто не поддерживает. Тогда переходите к универсальной обработке или коду.

Сопоставление полей
Колонка «Наименование»→Реквизит «Наименование»
Колонка «Артикул»→Реквизит «Артикул»
Колонка «Цена»→Регистр «Цены номенклатуры»
Колонка «Ставка НДС»→Реквизит «Ставка НДС»

Тот же механизм доступен в облачной 1С (сервис 1cfresh): встроенная загрузка там работает, потому что исполняется средствами самой платформы, а не внешним Excel.

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

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

Как подключить и запустить:

  1. Получите файл обработки с диска ИТС или из поставки.
  2. В режиме 1С:Предприятие: Файл → Открыть и выберите .epf, либо зарегистрируйте её через Администрирование → Печатные формы, отчёты и обработки → Дополнительные отчёты и обработки.
  3. В обработке укажите объект-приёмник (например, справочник Номенклатура или документ ПоступлениеТоваровУслуг).
  4. Загрузите табличный документ из файла Excel — или скопируйте диапазон прямо из Excel и вставьте в поле обработки через Ctrl+V.
  5. Настройте соответствие колонок реквизитам и запустите загрузку.

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

Внешние обработки запускаются с полными правами. Берите .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С, а в самом файле или в окружении, где исполняется код.

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

Отдельная типовая беда — дубли. Если механизм загрузки сопоставляет позиции по наименованию, а в файле есть лишние пробелы или разный регистр, 1С создаст новые элементы вместо обновления старых. Перед загрузкой чистите ключевое поле через СокрЛП() и сверяйте результат на тестовой копии базы, а не сразу в рабочей.

Проверка перед загрузкой из Excel
Выполнено: 0 / 6

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

Можно ли загрузить Excel, если на компьютере не установлен Office?
Встроенная команда «Загрузить данные из файла» и разбор .xlsx как XML работают без Office — их выполняет сама платформа. А вот COM-объект Excel.Application и подключение через ADODB требуют либо Excel, либо провайдер Microsoft на той машине, где исполняется код.
Чем отличается загрузка xls и xlsx?
Форматом файла и провайдером при чтении через ADODB. Для современного .xlsx нужен Microsoft.ACE.OLEDB.12.0, для старого .xls — Microsoft.Jet.OLEDB.4.0. Встроенная загрузка и обработки различают форматы сами по расширению.
Работает ли загрузка из Excel в облачной 1С?
Да, но только встроенными средствами: команда «Загрузить данные из файла» доступна. COM и произвольные внешние обработки в облаке ограничены безопасным режимом, поэтому код с Excel.Application там не запустится.
Как загрузить данные сразу в документ, а не в справочник?
Встроенная команда заливает данные в справочники. Для документов и их табличных частей берут универсальную обработку «Загрузка данных из табличного документа» или пишут загрузку кодом, где сами создаёте и заполняете объект-документ.
Почему COM-загрузка не работает на сервере?
COM-автоматизация обращается к установленному Excel, а на сервере приложений Office обычно нет. Выполняйте такой код на клиенте (&НаКлиенте), а для серверной обработки используйте разбор XML или ADODB с установленным провайдером.