При работе в среде 1С:Предприятие 7.7 часто возникает необходимость импорта данных из внешних файлов Excel. Одним из наиболее мощных и быстрых инструментов для этой задачи является компонента Йоксель. Однако новички часто сталкиваются с проблемой: стандартные примеры показывают, как прочитать первый лист книги, но не объясняют, как программно переключиться на нужную вкладку или выбрать её из списка.
В этой статье мы подробно разберем механизм работы с листами Excel через Йоксель, научимся получать их список и конвертировать содержимое конкретного листа в привычную ТаблицуЗначений.
Для начала проанализируем ситуацию: почему нельзя просто указать имя листа в объекте КонвертерВТаблицуЗначений? Дело в том, что в Йокселе задачи разделены между разными объектами:
ТабличнымДокументом, преобразуя его ячейки в строки и колонки ТЗ.Следовательно, наш путь будет состоять из двух этапов: сначала мы извлекаем нужный лист в ТабличныйДокумент, а затем конвертируем этот документ в ТЗ.
Прежде чем загружать конкретный лист, нам нужно знать его имя или индекс. Рассмотрим, как программно получить список всех доступных листов в файле. Это особенно полезно для создания диалогов выбора в интерфейсе пользователя.
Разберем пример кода для получения имен листов:
// Создаем объект для работы с файлами Excel
Конвертер = СоздатьОбъект("КонвертерExcel");
// Открываем книгу и получаем объект Книга
Книга = Конвертер.Открыть(ПутьКФайлу);
// Получаем коллекцию листов
Листы = Книга.Листы;
КолвоЛистов = Листы.Количество();
Для ы = 1 По КолвоЛистов Цикл
ТекущийЛист = Листы.Получить(ы);
// Проверяем тип листа. Тип 0 соответствует обычному рабочему листу с данными
Если ТекущийЛист.Тип <> 0 Тогда
Продолжить;
КонецЕсли;
Сообщить("Найден лист: " + ТекущийЛист.Имя);
КонецЦикла;
Обратите внимание на проверку ТекущийЛист.Тип <> 0. В файлах Excel могут содержаться листы диаграмм или макросов, которые не содержат табличных данных в привычном виде. Их обработка может привести к ошибкам, поэтому мы их пропускаем.
Теперь, когда мы знаем имя листа (например, "Лист2" или "Данные_Продаж"), мы можем извлечь его содержимое в ТабличныйДокумент. Выясним, как это сделать наиболее эффективно.
// Предположим, переменная ИмяНужногоЛиста содержит название вкладки
ИмяНужногоЛиста = "Лист2";
// Создаем конвертер Excel
КонвертерXLS = СоздатьОбъект("КонвертерExcel");
// Загружаем конкретный лист в объект ТабличныйДокумент
// Метод ЗагрузитьЛист возвращает готовый объект ТабличныйДокумент
ТабДок = КонвертерXLS.Открыть(ПутьКФайлу).ЗагрузитьЛист(ИмяНужногоЛиста);
// Если имя листа неизвестно, можно загрузить по индексу (например, второй лист)
// ТабДок = КонвертерXLS.Открыть(ПутьКФайлу).ЗагрузитьЛист(2);
Важный момент: объект ТабличныйДокумент в Йокселе очень функционален. Вы можете сразу показать его пользователю для предварительного просмотра с помощью метода Показать(), прежде чем переходить к загрузке в базу.
Финальный этап — преобразование полученного ТабличногоДокумента в объект ТаблицаЗначений 1С. Для этого мы используем специальный конвертер.
Рассмотрим детальный пример настройки конвертации:
// Создаем объект конвертера в ТЗ
КонвертерТЗ = СоздатьОбъект("Йоксель.КонвертерВТаблицуЗначений");
// Устанавливаем документ, который мы получили на предыдущем шаге
КонвертерТЗ.УстановитьДокумент(ТабДок);
// Настраиваем параметры распознавания структуры
// Если 1, Йоксель сам попытается определить типы колонок (Число, Строка, Дата)
КонвертерТЗ.ОпределятьСтруктуру = 1;
// Указываем, сколько строк проанализировать для определения типов
КонвертерТЗ.СтрокДляОпределенияСтруктуры = 50;
// Выполняем загрузку
ТЗ = КонвертерТЗ.Загрузить();
// Теперь ТЗ содержит данные из выбранного листа Excel
ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку() = 1 Цикл
// Обработка данных
КонецЦикла;
Для удобства использования в различных отчетах и обработках, мы можем объединить весь процесс в одну компактную функцию. Посмотрим, как это выглядит в лаконичном стиле:
Функция ЗагрузитьЛистExcelВТЗ(Файл, Лист)
Попытка
КонвертерXLS = СоздатьОбъект("КонвертерExcel");
Книга = КонвертерXLS.Открыть(Файл);
ТабДок = Книга.ЗагрузитьЛист(Лист);
КонвертерТЗ = СоздатьОбъект("Йоксель.КонвертерВТаблицуЗначений");
КонвертерТЗ.УстановитьДокумент(ТабДок);
Возврат КонвертерТЗ.Загрузить();
Исключение
Сообщить("Ошибка загрузки: " + ОписаниеОшибки());
Возврат 0;
КонецПопытки;
КонецФункции
При работе с большими объемами данных (десятки тысяч строк) или специфическими форматами, проанализируем несколько важных нюансов:
ТаблицаЗначений получена, обязательно обнуляйте объекты Йокселя: ТабДок = ""; КонвертерТЗ = "";. Это поможет избежать падения системы при массовой загрузке.SpreadSheet.dll или используйте предварительную конвертацию через COM-объект Excel.ЗагружатьСкрытыеСтроки.ИспользоватьФорматированныеЗначения = 1. Это позволит получить данные именно в том виде, в котором их видит пользователь в ячейке.Таким образом, мы выяснили, что ключ к загрузке конкретного листа лежит в использовании промежуточного объекта Книга и метода ЗагрузитьЛист. Это дает полный контроль над процессом импорта и позволяет автоматизировать обработку даже самых сложных Excel-файлов в среде 1С 7.7.