Как прочитать значения из скрытых столбцов Excel в 1С

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

При автоматизации загрузки данных из Excel-файлов программисты 1С часто сталкиваются с ситуацией, когда некоторые колонки в исходном файле скрыты пользователем или техническими процессами. На первый взгляд может показаться, что программный доступ к ним ограничен или индексы колонок смещаются, однако это не так. В данной статье мы подробно разберем, как правильно обращаться к данным в таких ячейках, проанализируем типичные ошибки и рассмотрим различные способы чтения файлов.

Разбор основной проблемы: разница между свойствами Value и Text

Чаще всего разработчики используют COM-объект Excel.Application для взаимодействия с файлами. Основная причина, по которой данные из скрытых столбцов «пропадают», заключается в неправильном выборе свойства ячейки. Давайте выясним причину этого поведения, изучив три основных свойства объекта Range (ячейки):

  1. Свойство Value: Это основное свойство для получения данных. Оно возвращает реальное содержимое ячейки с учетом типа данных (строка, число, дата). Для скрытых столбцов это свойство работает абсолютно корректно, так как оно обращается к значению в памяти Excel, а не к его визуальному представлению.
  2. Свойство Value2: Работает аналогично Value, но делает это быстрее, так как не выполняет проверку форматов даты и валюты, отдавая их как простые числа. Это предпочтительный метод, если вам важна производительность при чтении больших массивов данных.
  3. Свойство Text: Именно здесь кроется ловушка. Данное свойство возвращает строку в том виде, в котором её видит пользователь на экране. Если столбец скрыт (его ширина равна нулю), Excel считает, что текста «нет», и через COM-интерфейс возвращает пустую строку "". Аналогично, если число не помещается по ширине в видимую ячейку, свойство Text может вернуть символы решетки #######.

Проанализируем ситуацию на примере кода. Посмотрим, как ведет себя система при чтении скрытой третьей колонки:


// Создание объекта Excel
Попытка
    Эксель = Новый COMОбъект("Excel.Application");
    Книга = Эксель.Workbooks.Open(ПутьКФайлу);
    Лист = Книга.Sheets(1);
Исключение
    Сообщить("Ошибка при открытии Excel: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

Счетчик = 2; // Допустим, читаем со второй строки
// Если 3-й столбец скрыт:
Значение1 = Лист.Cells(Счетчик, 3).Value; // Вернет реальное значение (например, 100)
Значение2 = Лист.Cells(Счетчик, 3).Text;  // Вернет пустую строку ""

Таким образом, для надежного чтения данных всегда следует использовать Value или Value2.

Использование встроенного Табличного документа 1С

Начиная с современных версий платформы 1С:Предприятие 8.3, использование COM-объектов становится менее актуальным. Рассмотрим более современный и производительный метод — чтение файла напрямую в объект ТабличныйДокумент. Этот способ работает быстрее, не требует наличия установленного Microsoft Excel на сервере и корректно обрабатывает скрытые области.

Разберем по шагам, как прочитать данные через ТабличныйДокумент:


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

// Проход по всем колонкам первой строки
Для НомерКолонки = 1 По ТабДок.ШиринаТаблицы Цикл
    // Читаем текст ячейки
    ЗначениеЯчейки = ТабДок.Область(1, НомерКолонки).Текст;
    
    // Важный момент: мы можем проверить, скрыта ли эта колонка в 1С
    Если ТабДок.Область(1, НомерКолонки).Видимость = Ложь Тогда
        Сообщить("Колонка №" + НомерКолонки + " скрыта, но ее значение: " + ЗначениеЯчейки);
    Иначе
        Сообщить("Колонка №" + НомерКолонки + ": " + ЗначениеЯчейки);
    КонецЕсли;
КонецЦикла;

В данном примере метод Прочитать() загружает всю структуру файла. Обратите внимание, что даже если колонка скрыта в исходном Excel-файле, в объекте ТабличныйДокумент она будет присутствовать. Мы можем получить доступ к её данным через Область().Текст или Область().Содержимое, а статус скрытости проверить через свойство Видимость.

Чтение через ADO (Recordset)

Еще один профессиональный подход — использование технологии ADO (Microsoft ActiveX Data Objects). В этом случае файл Excel рассматривается как база данных, а листы — как таблицы. Для этого метода понятия «скрытый столбец» или «скрытая строка» вообще не существует, так как чтение идет напрямую из структуры данных файла, минуя графический интерфейс отображения.

Рассмотрим пример кода для подключения через ADO:


Connection = Новый COMОбъект("ADODB.Connection");
ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ПутьКФайлу + ";Extended Properties='Excel 12.0 XML;HDR=YES;IMEX=1';";

Попытка
    Connection.Open(ConnectionString);
    Recordset = Новый COMОбъект("ADODB.Recordset");
    // [Лист1$] - имя листа в Excel
    Recordset.Open("SELECT * FROM [Лист1$]", Connection);
    
    Пока Recordset.EOF() = 0 Цикл
        // Обработка данных
        // Скрытые колонки будут доступны по именам заголовков или индексам
        Значение = Recordset.Fields.Item(2).Value; 
        Recordset.MoveNext();
    КонецЦикла;
    
    Recordset.Close();
    Connection.Close();
Исключение
    Сообщить("Ошибка ADO: " + ОписаниеОшибки());
КонецПопытки;

Этот метод является самым быстрым для обработки огромных файлов (десятки тысяч строк), так как он не тратит ресурсы на отрисовку или создание тяжелого объекта Excel.Application.

Как программно определить, что столбец скрыт

Иногда задача стоит не просто прочитать данные, а именно отфильтровать скрытые колонки (например, если в них хранятся промежуточные технические расчеты, которые не должны попасть в 1С). При работе через COM-объект мы можем проверить состояние колонки с помощью свойства Hidden или по её ширине.

Выясним, как это сделать:


// Проверка через свойство Hidden
Если Лист.Columns(НомерКолонки).Hidden Тогда
    Сообщить("Колонка " + НомерКолонки + " скрыта свойством Hidden");
КонецЕсли;

// Проверка через ширину колонки
Если Лист.Columns(НомерКолонки).ColumnWidth = 0 Тогда
    Сообщить("Колонка " + НомерКолонки + " имеет нулевую ширину и фактически не видна");
КонецЕсли;

Резюме и рекомендации

Подводя итог, можно выделить следующие ключевые правила для работы со скрытыми данными в Excel:

  1. Если вы используете COM-объект Excel.Application, никогда не используйте свойство .Text для получения данных, если есть вероятность, что колонки могут быть скрыты или сужены. Используйте .Value.
  2. Для повышения стабильности и скорости работы (особенно на стороне сервера) используйте ТабличныйДокумент 1С. Он «видит» всё содержимое файла независимо от настроек отображения в Excel.
  3. Если вам нужно прочитать данные из очень большого файла как из плоской таблицы, используйте ADO. Это позволит игнорировать любые визуальные настройки оформления, включая скрытие строк и столбцов.
  4. Если вы работаете с современными форматами (.xlsx), помните, что это по сути ZIP-архив с XML-файлами. При необходимости данные можно извлечь даже прямым парсингом XML, где скрытость колонки — это просто атрибут hidden="1" в описании структуры листа, который никак не влияет на доступность самих данных в узлах ячеек.

Выбор конкретного метода зависит от ваших задач, наличия установленного MS Office и требований к скорости обработки данных. Однако теперь вы знаете, что скрытые столбцы — это не препятствие для получения информации в 1С.

← На главную