Как через Йоксель загрузить в таблицу значений (ТЗ) определенный лист Excel

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При работе в среде 1С:Предприятие 7.7 часто возникает необходимость импорта данных из внешних файлов Excel. Одним из наиболее мощных и быстрых инструментов для этой задачи является компонента Йоксель. Однако новички часто сталкиваются с проблемой: стандартные примеры показывают, как прочитать первый лист книги, но не объясняют, как программно переключиться на нужную вкладку или выбрать её из списка.

В этой статье мы подробно разберем механизм работы с листами Excel через Йоксель, научимся получать их список и конвертировать содержимое конкретного листа в привычную ТаблицуЗначений.

Понимание архитектуры Йокселя

Для начала проанализируем ситуацию: почему нельзя просто указать имя листа в объекте КонвертерВТаблицуЗначений? Дело в том, что в Йокселе задачи разделены между разными объектами:

  1. КонвертерExcel: отвечает за открытие файла формата XLS и извлечение из него данных.
  2. ТабличныйДокумент: внутренний объект Йокселя (аналог мокселя 1С), который хранит визуальное представление данных.
  3. КонвертерВТаблицуЗначений: умеет работать только с ТабличнымДокументом, преобразуя его ячейки в строки и колонки ТЗ.

Следовательно, наш путь будет состоять из двух этапов: сначала мы извлекаем нужный лист в ТабличныйДокумент, а затем конвертируем этот документ в ТЗ.

Шаг 1. Получение списка листов книги

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

Разберем пример кода для получения имен листов:


// Создаем объект для работы с файлами Excel
Конвертер = СоздатьОбъект("КонвертерExcel");

// Открываем книгу и получаем объект Книга
Книга = Конвертер.Открыть(ПутьКФайлу);

// Получаем коллекцию листов
Листы = Книга.Листы;
КолвоЛистов = Листы.Количество();

Для ы = 1 По КолвоЛистов Цикл
    ТекущийЛист = Листы.Получить(ы);
    
    // Проверяем тип листа. Тип 0 соответствует обычному рабочему листу с данными
    Если ТекущийЛист.Тип <> 0 Тогда
        Продолжить;
    КонецЕсли;
    
    Сообщить("Найден лист: " + ТекущийЛист.Имя);
КонецЦикла;

Обратите внимание на проверку ТекущийЛист.Тип <> 0. В файлах Excel могут содержаться листы диаграмм или макросов, которые не содержат табличных данных в привычном виде. Их обработка может привести к ошибкам, поэтому мы их пропускаем.

Шаг 2. Загрузка данных конкретного листа

Теперь, когда мы знаем имя листа (например, "Лист2" или "Данные_Продаж"), мы можем извлечь его содержимое в ТабличныйДокумент. Выясним, как это сделать наиболее эффективно.


// Предположим, переменная ИмяНужногоЛиста содержит название вкладки
ИмяНужногоЛиста = "Лист2";

// Создаем конвертер Excel
КонвертерXLS = СоздатьОбъект("КонвертерExcel");

// Загружаем конкретный лист в объект ТабличныйДокумент
// Метод ЗагрузитьЛист возвращает готовый объект ТабличныйДокумент
ТабДок = КонвертерXLS.Открыть(ПутьКФайлу).ЗагрузитьЛист(ИмяНужногоЛиста);

// Если имя листа неизвестно, можно загрузить по индексу (например, второй лист)
// ТабДок = КонвертерXLS.Открыть(ПутьКФайлу).ЗагрузитьЛист(2);

Важный момент: объект ТабличныйДокумент в Йокселе очень функционален. Вы можете сразу показать его пользователю для предварительного просмотра с помощью метода Показать(), прежде чем переходить к загрузке в базу.

Шаг 3. Конвертация в Таблицу Значений

Финальный этап — преобразование полученного ТабличногоДокумента в объект ТаблицаЗначений 1С. Для этого мы используем специальный конвертер.

Рассмотрим детальный пример настройки конвертации:


// Создаем объект конвертера в ТЗ
КонвертерТЗ = СоздатьОбъект("Йоксель.КонвертерВТаблицуЗначений");

// Устанавливаем документ, который мы получили на предыдущем шаге
КонвертерТЗ.УстановитьДокумент(ТабДок);

// Настраиваем параметры распознавания структуры
// Если 1, Йоксель сам попытается определить типы колонок (Число, Строка, Дата)
КонвертерТЗ.ОпределятьСтруктуру = 1; 

// Указываем, сколько строк проанализировать для определения типов
КонвертерТЗ.СтрокДляОпределенияСтруктуры = 50;

// Выполняем загрузку
ТЗ = КонвертерТЗ.Загрузить();

// Теперь ТЗ содержит данные из выбранного листа Excel
ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку() = 1 Цикл
    // Обработка данных
КонецЦикла;

Объединение в одну функцию

Для удобства использования в различных отчетах и обработках, мы можем объединить весь процесс в одну компактную функцию. Посмотрим, как это выглядит в лаконичном стиле:


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

Продвинутые советы по оптимизации

При работе с большими объемами данных (десятки тысяч строк) или специфическими форматами, проанализируем несколько важных нюансов:

  1. Освобождение памяти: 1С 7.7 крайне чувствительна к оперативной памяти. После того как ТаблицаЗначений получена, обязательно обнуляйте объекты Йокселя: ТабДок = ""; КонвертерТЗ = "";. Это поможет избежать падения системы при массовой загрузке.
  2. Работа с XLSX: Классический Йоксель работает с файлами Excel 97-2003 (XLS). Если вам нужно прочитать современный XLSX, убедитесь, что у вас установлена последняя версия библиотеки SpreadSheet.dll или используйте предварительную конвертацию через COM-объект Excel.
  3. Скрытые данные: По умолчанию Йоксель может игнорировать скрытые строки или колонки. Если в вашем файле данные могут быть скрыты фильтрами, проверьте свойства конвертера ЗагружатьСкрытыеСтроки.
  4. Форматирование: Если в Excel числа хранятся как текст или имеют специфические маски (например, номера телефонов), используйте свойство ИспользоватьФорматированныеЗначения = 1. Это позволит получить данные именно в том виде, в котором их видит пользователь в ячейке.

Таким образом, мы выяснили, что ключ к загрузке конкретного листа лежит в использовании промежуточного объекта Книга и метода ЗагрузитьЛист. Это дает полный контроль над процессом импорта и позволяет автоматизировать обработку даже самых сложных Excel-файлов в среде 1С 7.7.

← На главную