Загрузка данных из внешних файлов Excel — одна из самых частых задач, с которыми сталкивается разработчик 1С. Существует несколько подходов к решению этой задачи, и выбор оптимального зависит от множества факторов: наличия установленного Microsoft Office на сервере или клиенте, объема данных, операционной системы и требований к скорости. В этой статье мы подробно разберем основные методы, их преимущества и недостатки, а также рассмотрим современные альтернативы.
Этот метод считается наиболее универсальным и современным для платформы 1С:Предприятие 8. Его главное преимущество заключается в том, что для чтения файла .xlsx или .xls не требуется наличие установленного Microsoft Excel на компьютере. Платформа 1С умеет самостоятельно парсить эти файлы.
Рассмотрим, как это работает на практике. Мы используем метод Прочитать() объекта ТабличныйДокумент. Проанализируем пример кода:
ТабДок = Новый ТабличныйДокумент;
Попытка
ТабДок.Прочитать(ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Значение);
Исключение
Сообщить("Не удалось прочитать файл: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
Для НомерСтроки = 1 По ТабДок.ВысотаТаблицы Цикл
ЗначениеКолонки1 = ТабДок.Область(НомерСтроки, 1).Текст;
// Обработка данных и заполнение справочника
КонецЦикла;
Разберем основные нюансы этого метода. Использование СпособЧтенияЗначенийТабличногоДокумента.Значение позволяет получить типизированные данные (числа, даты), а не только текст. Однако будьте осторожны: иногда даты в Excel могут считываться со смещением или преобразовываться в числа (количество дней с 1900 года). В таких ситуациях стоит проверить формат ячеек в исходном файле.
Преимущества:
Этот способ долгое время был «золотым стандартом». Мы создаем экземпляр приложения 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 остаются «висеть» в памяти сервера при некорректном завершении работы кода.
Если нам нужно прочитать огромный объем данных максимально быстро, стоит рассмотреть технологию 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 для текстовых значений, так как он определяет тип колонки по первым строкам.
Как отмечают опытные разработчики на форумах, любые внешние подключаемые данные лучше «отключать» как можно раньше. Один из самых производительных способов для сверхбольших файлов — сохранение данных из Excel в формат CSV (текст с разделителями).
Разберем алгоритм:
.csv.ЧтениеТекста.СтрРазделить().Это исключает любые проблемы с версиями библиотек, разрядностью и лицензиями на офисное ПО.
При загрузке данных мы неизбежно сталкиваемся с «грязными» данными. Рассмотрим наиболее частые случаи:
1. Неразрывные пробелы и лишние символы. В Excel числа часто форматируются с разделителями групп разрядов, которые при чтении превращаются в неразрывные пробелы (код символа 160). 1С не сможет преобразовать такую строку в число. Для очистки используем следующий подход:
ЧисловоеЗначение = Число(СтрЗаменить(ЗначениеИзФайла, Символы.НПП, ""));
2. Ошибки типов данных.
Часто путают дату и строку. Если вы используете ТабличныйДокумент, всегда проверяйте тип полученного значения через ТипЗнч(). Если пришло число вместо даты, его можно конвертировать, зная, что в Excel дата — это количество дней с 30.12.1899.
3. Серверное исполнение.
Если ваша обработка работает в фоновом задании на сервере, забудьте про COMОбъект. Серверный пользователь 1С (обычно USR1CV8) не имеет прав на запуск интерактивных приложений. В этом случае ваш выбор — ТабличныйДокумент или прямое чтение XLSX как архива XML (Native чтение).
Если вы работаете в современной типовой конфигурации (например, БП 3.0, УТ 11, ERP), рассмотрите возможность использования встроенной подсистемы «Загрузка данных из файла». Разработчики 1С уже создали удобный интерфейс, который позволяет пользователю сопоставлять колонки файла с реквизитами справочника в интерактивном режиме. Вам достаточно вызвать соответствующий конструктор и описать структуру загружаемых данных.
Подведем итог нашему анализу и определим критерии выбора метода:
ТаблицаЗначений, закрыть файл (освободить ресурсы), и только потом начинать длительную обработку поиска и создания элементов справочника в базе.Помните, что архитектурно правильным решением будет отделение процесса чтения данных от процесса их записи в базу данных. Это позволит вам легче отлаживать код и обеспечит стабильную работу системы даже при наличии ошибок в исходных файлах Excel.