Как получить данные из первого листа Excel через ADODB в 1С, не зная его имени

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

При автоматизации загрузки данных из файлов Excel программисты часто сталкиваются с проблемой: SQL-запрос через ADODB требует обязательного указания имени листа в формате [ИмяЛиста$]. Однако на практике пользователи могут переименовывать листы, или файл может формироваться сторонней программой с произвольными именами вкладок. Если мы точно знаем, что нужные данные всегда находятся на первом листе (первой вкладке слева), нам необходим универсальный способ программно определить это имя перед выполнением основного запроса SELECT.

В этой статье мы подробно рассмотрим, почему прямое обращение по индексу в стиле SELECT * FROM [1] не работает, и разберем стандартный механизм получения метаданных файла через схему данных. Мы также проанализируем нюансы настройки соединения, которые влияют на стабильность чтения.

Проблема использования фиксированных имен листов

Обычно запрос к Excel-файлу через ADODB выглядит следующим образом:

ТекстЗапроса = "SELECT * FROM [Лист1$]";

Этот подход крайне хрупок. Если пользователь переименует «Лист1» в «Данные», система выдаст ошибку о том, что объект не найден. Использование COM-объекта Excel.Application позволяет легко обратиться к Worksheets(1).Name, но это значительно замедляет работу системы, особенно на больших файлах или при серверном выполнении, где запуск полноценного приложения Excel нежелателен или невозможен.

Решение: Использование метода OpenSchema

Для того чтобы узнать структуру файла (список листов и именованных областей) без использования Excel, мы воспользуемся методом OpenSchema объекта Connection. Рассмотрим этот процесс по шагам.

Шаг 1: Установка соединения

Прежде всего, нам необходимо создать и открыть соединение с файлом. В зависимости от расширения файла (xls или xlsx) и разрядности системы используются разные провайдеры (Jet или ACE). Проанализируем пример создания соединения:


Соединение = Новый COMОбъект("ADODB.Connection");
ПутьКФайлу = "C:\mydata.xlsx";
// Для файлов .xlsx используем ACE.OLEDB
СтрокаПодключения = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ПутьКФайлу + ";Extended Properties=""Excel 12.0;HDR=YES;""";
Соединение.Open(СтрокаПодключения);

Шаг 2: Извлечение метаданных

После открытия соединения мы можем запросить список таблиц. В терминологии OLE DB листы Excel являются таблицами. Мы вызываем метод OpenSchema с параметром 20, что соответствует константе adSchemaTables.


// Получаем набор записей со списком таблиц (листов)
ТаблицыСхемы = Соединение.OpenSchema(20);

Если Не ТаблицыСхемы.EOF Тогда
    // По умолчанию первая запись часто соответствует первому листу
    ИмяЛиста = ТаблицыСхемы.Fields("TABLE_NAME").Value;
    Сообщить("Найдено имя листа: " + ИмяЛиста);
КонецЕсли;

ТаблицыСхемы.Close();

Тонкости фильтрации имен листов

Важно понимать, что метод OpenSchema(20) возвращает не только листы, но и именованные диапазоны, а также скрытые системные области. Проанализируем признаки, по которым можно отличить настоящий лист:

  1. Знак доллара: Имена листов всегда заканчиваются на символ $. Если в имени нет этого знака, скорее всего, это именованная область.
  2. Кавычки: Если в названии листа есть пробелы, драйвер может вернуть имя, заключенное в одинарные кавычки, например 'Лист номер один$'.

Давайте разработаем универсальную функцию, которая гарантированно вернет имя первого корректного листа:


Функция ПолучитьИмяПервогоЛиста(Соединение)
    Попытка
        ЗаписиСхемы = Соединение.OpenSchema(20);
        Пока Не ЗаписиСхемы.EOF Цикл
            ТекущееИмя = ЗаписиСхемы.Fields("TABLE_NAME").Value;
            
            // Лист должен заканчиваться на $ (иногда после него может быть кавычка)
            Если Найти(ТекущееИмя, "$") > 0 Тогда
                ЗаписиСхемы.Close();
                Возврат ТекущееИмя;
            КонецЕсли;
            
            ЗаписиСхемы.MoveNext();
        КонецЦикла;
        ЗаписиСхемы.Close();
    Исключение
        Возврат "";
    КонецПопытки;
    Возврат "";
КонецФункции

Интеграция в основной запрос

Теперь, когда у нас есть динамически полученное имя листа, мы можем безопасно подставить его в наш SQL запрос. Обратите внимание, что если имя уже содержит знак $, повторно добавлять его не нужно, но имя обязательно должно быть заключено в квадратные скобки на случай наличия пробелов.


ИмяЛиста = ПолучитьИмяПервогоЛиста(Соединение);
Если ЗначениеЗаполнено(ИмяЛиста) Тогда
    // Формируем запрос. ИмяЛиста уже содержит $ из схемы.
    ТекстЗапроса = "SELECT TOP 10 * FROM [" + ИмяЛиста + "]";
    Recordset = Соединение.Execute(ТекстЗапроса);
    // ... дальнейшая обработка данных
КонецЕсли;

Влияние параметров HDR и IMEX на результат

При работе с ADODB крайне важно правильно настроить Extended Properties в строке подключения. Выясним, на что влияют параметры HDR и IMEX:

Ограничения и рекомендации

Разберем ситуации, когда метод может вести себя непредсказуемо:

Порядок листов: Драйвер ADO не всегда возвращает листы в том же порядке, в котором они расположены в книге Excel (визуально на вкладках). Чаще всего они сортируются по алфавиту. Если в книге много листов, и вам нужен именно «первый слева», гарантированного способа сделать это через ADODB нет. В таких случаях лучше требовать от источника данных уникального именования листов или использовать ТабличныйДокумент.

Скрытые листы: Метод OpenSchema видит скрытые листы так же, как и видимые. Если в файле есть скрытый технический лист, чье имя по алфавиту идет раньше нужного нам, функция может вернуть его. Проанализируйте структуру ваших файлов на наличие подобных «сюрпризов».

Разрядность драйверов: Если ваша база 1С работает на 64-битном сервере, убедитесь, что установлен 64-битный драйвер Microsoft Access Database Engine. Стандартный Jet.OLEDB.4.0 работает только в 32-битном режиме, что часто является причиной ошибки «Провайдер не найден» при попытке подключения на сервере.

Использование OpenSchema — это мощный и эффективный инструмент, который позволяет сделать ваши обработки загрузки данных гибкими и устойчивыми к изменениям в структуре Excel-файлов, сохраняя при этом высокую скорость работы технологии ADODB.

← На главную