Как лучше реализовать загрузку данных из Excel в справочник 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Метод 1: Использование объекта ТабличныйДокумент

Этот метод считается наиболее универсальным и современным для платформы 1С:Предприятие 8. Его главное преимущество заключается в том, что для чтения файла .xlsx или .xls не требуется наличие установленного Microsoft Excel на компьютере. Платформа 1С умеет самостоятельно парсить эти файлы.

Рассмотрим, как это работает на практике. Мы используем метод Прочитать() объекта ТабличныйДокумент. Проанализируем пример кода:


ТабДок = Новый ТабличныйДокумент;
Попытка
    ТабДок.Прочитать(ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Значение);
Исключение
    Сообщить("Не удалось прочитать файл: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

Для НомерСтроки = 1 По ТабДок.ВысотаТаблицы Цикл
    ЗначениеКолонки1 = ТабДок.Область(НомерСтроки, 1).Текст;
    // Обработка данных и заполнение справочника
КонецЦикла;

Разберем основные нюансы этого метода. Использование СпособЧтенияЗначенийТабличногоДокумента.Значение позволяет получить типизированные данные (числа, даты), а не только текст. Однако будьте осторожны: иногда даты в Excel могут считываться со смещением или преобразовываться в числа (количество дней с 1900 года). В таких ситуациях стоит проверить формат ячеек в исходном файле.

Преимущества:

Метод 2: Использование COM-объекта (Excel.Application)

Этот способ долгое время был «золотым стандартом». Мы создаем экземпляр приложения Excel как внешний COM-объект и через него управляем книгами и листами. Это дает максимальную гибкость: мы можем не только читать данные, но и обращаться к формулам, свойствам ячеек, цветам и другим элементам оформления.

Посмотрим на типичный пример реализации:


Попытка
    ExcelПриложение = Новый COMОбъект("Excel.Application");
Исключение
    Сообщить("Excel не установлен!");
    Возврат;
КонецПопытки;

Книга = ExcelПриложение.Workbooks.Open(ПутьКФайлу);
Лист = Книга.Sheets(1);

Для НомерСтроки = 1 По Лист.UsedRange.Rows.Count Цикл
    Значение = Лист.Cells(НомерСтроки, 1).Value;
    // Загрузка в справочник
КонецЦикла;

Книга.Close(Ложь);
ExcelПриложение.Quit();

Проанализируем риски. Основная проблема COMОбъект — это зависимость от окружения. Если вы запускаете этот код на сервере 1С, который является 64-битным, а установленный Excel 32-битный, вы получите ошибку инициализации. Также часто возникают ситуации, когда процессы excel.exe остаются «висеть» в памяти сервера при некорректном завершении работы кода.

Метод 3: Использование технологии ADO (ActiveX Data Objects)

Если нам нужно прочитать огромный объем данных максимально быстро, стоит рассмотреть технологию ADO. В этом случае файл Excel воспринимается системой как база данных, а листы — как таблицы. Мы можем использовать язык SQL для выборки данных.

Выясним причину высокой скорости этого метода: он не запускает графическую оболочку Excel и не тратит ресурсы на отрисовку интерфейса. Это «чистое» чтение данных из потока.


Connection = Новый COMОбъект("ADODB.Connection");
ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ПутьКФайлу + ";Extended Properties=""Excel 12.0 Xml;HDR=YES"";";
Connection.Open(ConnectionString);

Recordset = Новый COMОбъект("ADODB.Recordset");
Recordset.Open("SELECT * FROM [Лист1$]", Connection);

Пока НЕ Recordset.EOF() Цикл
    Сообщить(Recordset.Fields.Item(0).Value);
    Recordset.MoveNext();
КонецЦикла;

Recordset.Close();
Connection.Close();

Важный момент: для работы этого метода на сервере должен быть установлен драйвер Microsoft Access Database Engine. Также ADO критичен к типам данных в колонках: если в одной колонке в начале идут числа, а затем текст, драйвер может вернуть Null для текстовых значений, так как он определяет тип колонки по первым строкам.

Метод 4: Предварительная конвертация в CSV или Текст

Как отмечают опытные разработчики на форумах, любые внешние подключаемые данные лучше «отключать» как можно раньше. Один из самых производительных способов для сверхбольших файлов — сохранение данных из Excel в формат CSV (текст с разделителями).

Разберем алгоритм:

  1. Файл Excel программно или вручную сохраняется в формат .csv.
  2. 1С читает файл как обычный текстовый документ через объект ЧтениеТекста.
  3. Строки разбиваются по разделителю (например, точка с запятой) с помощью функции СтрРазделить().

Это исключает любые проблемы с версиями библиотек, разрядностью и лицензиями на офисное ПО.

Проблемы при загрузке и способы их решения

При загрузке данных мы неизбежно сталкиваемся с «грязными» данными. Рассмотрим наиболее частые случаи:

1. Неразрывные пробелы и лишние символы. В Excel числа часто форматируются с разделителями групп разрядов, которые при чтении превращаются в неразрывные пробелы (код символа 160). 1С не сможет преобразовать такую строку в число. Для очистки используем следующий подход:

ЧисловоеЗначение = Число(СтрЗаменить(ЗначениеИзФайла, Символы.НПП, ""));

2. Ошибки типов данных. Часто путают дату и строку. Если вы используете ТабличныйДокумент, всегда проверяйте тип полученного значения через ТипЗнч(). Если пришло число вместо даты, его можно конвертировать, зная, что в Excel дата — это количество дней с 30.12.1899.

3. Серверное исполнение. Если ваша обработка работает в фоновом задании на сервере, забудьте про COMОбъект. Серверный пользователь 1С (обычно USR1CV8) не имеет прав на запуск интерактивных приложений. В этом случае ваш выбор — ТабличныйДокумент или прямое чтение XLSX как архива XML (Native чтение).

Использование БСП (Библиотеки стандартных подсистем)

Если вы работаете в современной типовой конфигурации (например, БП 3.0, УТ 11, ERP), рассмотрите возможность использования встроенной подсистемы «Загрузка данных из файла». Разработчики 1С уже создали удобный интерфейс, который позволяет пользователю сопоставлять колонки файла с реквизитами справочника в интерактивном режиме. Вам достаточно вызвать соответствующий конструктор и описать структуру загружаемых данных.

Итоги: что же выбрать?

Подведем итог нашему анализу и определим критерии выбора метода:

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

← На главную