Одной из наиболее частых задач в практике программиста 1С является импорт или экспорт данных в формат Excel. Традиционный метод через COM-объект (Excel.Application) имеет существенный недостаток: он требует обязательной установки Microsoft Office на стороне клиента или сервера. Это создает проблемы с лицензированием и стабильностью работы серверных процессов. В этой статье мы разберем по шагам, как обойти эти ограничения и организовать работу с файлами .xlsx и .xls, используя исключительно встроенные возможности платформы 1С:Предприятие 8.3 и современные подходы.
Начнем с самого простого и доступного способа. Платформа 1С позволяет сохранять и читать табличные документы напрямую в формате Excel. Рассмотрим подробнее, как это реализовать. Этот метод идеально подходит для простых отчетов и выгрузок, где не требуется сложная логика манипуляции ячейками внутри существующего файла.
Проанализируем пример кода для сохранения данных:
ТабДок = Новый ТабличныйДокумент;
// Заполняем ТабДок данными (например, из макета или программно)
Область = ТабДок.ПолучитьОбласть("R1C1:R10C10");
Область.Текст = "Пример данных";
// Сохраняем файл без использования стороннего ПО
ПутьКФайлу = "C:\Temp\Export.xlsx";
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);
Для чтения файла мы можем использовать метод Прочитать(). Выясним причину, почему это удобно: платформа сама парсит структуру файла и переводит ее в знакомую структуру ячеек 1С. Однако стоит учитывать, что при чтении больших файлов (более 50-100 Мб) этот метод может потреблять значительный объем оперативной памяти.
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Значение);
// Теперь мы можем перебирать ячейки
Для Строка = 1 По ТабДок.ВысотаТаблицы Цикл
ЗначениеЯчейки = ТабДок.Область(Строка, 1).Текст;
// Обработка данных
КонецЦикла;
Начиная с версии платформы 8.3.10, в 1С появился специализированный объект ЧтениеДанныхXLSX. Это наиболее быстрый и эффективный способ работы с современными файлами Excel (формат OpenXML). Разберем по шагам, как работать с этим объектом.
Важно: этот объект работает по принципу последовательного чтения, что позволяет обрабатывать файлы огромного размера с минимальными затратами памяти.
Посмотрим на пример реализации:
ЧтениеXLSX = Новый ЧтениеДанныхXLSX;
ЧтениеXLSX.Открыть(ПутьКФайлу);
// Получаем список листов
ЛистыКниги = ЧтениеXLSX.ПолучитьЛисты();
Если ЛистыКниги.Количество() > 0 Тогда
// Выбираем первый лист
ЧтениеXLSX.ВыбратьЛист(ЛистыКниги[0]);
// Читаем данные построчно
Пока ЧтениеXLSX.Прочитать() Цикл
// Получаем значение конкретной колонки по индексу
Значение = ЧтениеXLSX.ПолучитьЗначение(1);
// Здесь выполняется логика загрузки в справочник или документ
КонецЦикла;
КонецЕсли;
ЧтениеXLSX.Закрыть();
Этот метод является приоритетным для серверного кода, так как он полностью автономен и работает на операционных системах Linux, что критически важно для современных инсталляций 1С.
Если нам требуется не просто прочитать данные, а создать сложный файл с формулами, защитой листов и специфическим форматированием без MS Office, мы можем рассмотреть структуру самого файла .xlsx. На самом деле, это ZIP-архив, внутри которого находятся XML-файлы. Мы можем программно распаковать его, модифицировать XML и запаковать обратно.
Рассмотрим подробнее логику процесса:
Проанализируем ситуацию, когда необходимо заменить данные в шаблоне. Мы используем объект ЧтениеZipФайла и ЗаписьZipФайла для работы с контейнером, а затем через ЧтениеXML и ЗаписьXML меняем содержимое файлов в папке xl/worksheets/.
Преимущества этого подхода:
Этот способ позволяет работать с файлом Excel как с базой данных, используя SQL-запросы. Хотя он требует наличия определенных драйверов в системе (Microsoft Access Database Engine), он все же не требует установки полноценного пакета Office.
Разберем пример кода для получения данных через SQL-запрос:
СтрокаСоединения = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ПутьКФайлу + ";Extended Properties=""Excel 12.0 Xml;HDR=YES"";";
Connection = Новый COMОбъект("ADODB.Connection");
Connection.Open(СтрокаСоединения);
Command = Новый COMОбъект("ADODB.Command");
Command.ActiveConnection = Connection;
Command.CommandText = "SELECT * FROM [Лист1$]";
RecordSet = Command.Execute();
Пока НЕ RecordSet.EOF() Цикл
Сообщить(RecordSet.Fields.Item(0).Value);
RecordSet.MoveNext();
КонецЦикла;
Connection.Close();
Использование ADO оправдано, если вам нужно быстро выбрать подмножество данных из очень большой таблицы по сложному условию (фильтрация, сортировка) прямо на уровне драйвера.
Проанализируем, какой метод выбрать в зависимости от задачи:
ТабличныйДокумент. Это быстро в разработке и надежно.ЧтениеДанныхXLSX. Это самый современный и производительный способ.Выясним причину частых ошибок при работе с Excel. Основная проблема — это типизация данных. В Excel ячейка может содержать текст, который выглядит как число, или дату в специфическом формате. При использовании ЧтениеДанныхXLSX всегда проверяйте тип полученного значения с помощью функции ТипЗнч(), чтобы избежать ошибок при записи в информационную базу.
Важный момент по производительности: при работе с большими объемами всегда отключайте автоматическое обновление экрана и пересчет формул, если вы все же используете COM-объекты (хотя мы стараемся их избегать). В случае со встроенными методами 1С, старайтесь читать данные порциями и не загружать весь файл в память, если вам нужны только первые 100 строк.
Таким образом, мы выяснили, что современная платформа 1С предоставляет достаточно инструментов для полноценной работы с Excel без привязки к офисным продуктам Microsoft. Это позволяет создавать более надежные, кроссплатформенные и быстрые решения для автоматизации бизнеса.