Как корректно прочитать Excel-файл с объединенными ячейками в таблицу значений 1С?

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

Чтение данных из Excel — одна из самых частых задач в практике программиста 1С. Однако стандартные методы часто дают сбой, если файл имеет сложную структуру: объединенные ячейки, несколько листов или нестандартное форматирование. Для тех, кто ищет готовое решение, часто подойдет универсальная загрузка из Excel, позволяющая импортировать справочники без установленного Microsoft Office. Рассмотрим несколько эффективных способов решения этой проблемы программно, начиная от простых переборов и заканчивая использованием интеллектуальных механизмов платформы.

Метод 1. Прямой обход ячеек через Табличный документ

Этот способ считается классическим. Мы загружаем файл во временный объект типа ТабличныйДокумент и перебираем его ячейки. Главное преимущество здесь — полный контроль над процессом. Для тех, кто хочет сэкономить время на написании базового кода, существует шаблон простой обработки загрузки из excel, который можно взять за основу. Разберем программный код, который позволяет выгрузить данные в таблицу значений.


// Инициализируем табличный документ
тДокумент = Новый ТабличныйДокумент;
тДокумент.Прочитать(ИмяФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);

// Определяем границы таблицы
ПоследняяСтрока = тДокумент.ВысотаТаблицы;
ПоследняяКолонка = тДокумент.ШиринаТаблицы;

// Подготавливаем таблицу значений
ТЗ = Новый ТаблицаЗначений;
Для Сч = 1 По ПоследняяКолонка Цикл
    ТЗ.Колонки.Добавить("Колонка" + Формат(Сч, "ЧГ="));
КонецЦикла;

// Наполняем данными
Для НомерСтроки = 1 По ПоследняяСтрока Цикл
    НСтр = ТЗ.Добавить();
    Для НомерКолонки = 1 По ПоследняяКолонка Цикл
        // Обращаемся к конкретной области ячейки
        НСтр[НомерКолонки - 1] = тДокумент.Область(НомерСтроки, НомерКолонки).Значение;
    КонецЦикла;
КонецЦикла;

Важный нюанс: При использовании метода Прочитать крайне важно указывать второй параметр СпособЧтенияЗначенийТабличногоДокумента.Значение. Это позволяет 1С пытаться типизировать данные (числа, даты) сразу при чтении, а не просто считывать их как текст.

Метод 2. Использование Построителя отчета для интеллектуального чтения

Если файл содержит типичную таблицу, но стандартное чтение "видит" только первую колонку, на помощь приходит ПостроительОтчета. Этот объект умеет самостоятельно анализировать структуру ТабличногоДокумента и преобразовывать её в таблицу значений. Подобные алгоритмы часто применяются, когда требуется массовый импорт данных из различных форматов для первоначального заполнения базы 1С.


ТабДокумент = Новый ТабличныйДокумент;
ТабДокумент.Прочитать(ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Значение);

ПоследняяСтрока = ТабДокумент.ВысотаТаблицы;
ПоследняяКолонка = ТабДокумент.ШиринаТаблицы;

// Определяем область, которую нужно прочитать (например, начиная с 1 строки)
ОбластьЯчеек = ТабДокумент.Область(1, 1, ПоследняяСтрока, ПоследняяКолонка);

// Создаем описание источника данных
ИсточникДанных = Новый ОписаниеИсточникаДанных(ОбластьЯчеек);

// Используем построитель для трансформации
ПостроительОтчета = Новый ПостроительОтчета;
ПостроительОтчета.ИсточникДанных = ИсточникДанных;
ПостроительОтчета.Выполнить();

// Получаем готовую таблицу значений
ТабЗначений = ПостроительОтчета.Результат.Выгрузить();

Этот метод часто решает проблему "невидимых" колонок, так как ОписаниеИсточникаДанных более корректно обрабатывает структуру листа Excel, чем простой цикл по ячейкам.

Метод 3. Динамический поиск начала данных

Бывают ситуации, когда "каркас" файла одинаковый, но данные начинаются с разной строки. В таких случаях разработчикам может пригодиться универсальный механизм для создания обработок по загрузке данных, предоставляющий удобный программный интерфейс. Мы можем в цикле перебирать возможные начальные ячейки, пока не найдем нужную область с заданным количеством колонок.


Для Сч = 1 По 20 Цикл // Проверяем первые 20 строк как потенциальное начало
    Для СчКолонок = 1 По ПоследняяКолонка Цикл
        ОбластьЯчеек = тДокумент.Область(Сч, СчКолонок, ПоследняяСтрока, ПоследняяКолонка);
        ИсточникДанных = Новый ОписаниеИсточникаДанных(ОбластьЯчеек);
        ПостроительОтчета = Новый ПостроительОтчета;
        ПостроительОтчета.ИсточникДанных = ИсточникДанных;
        
        Попытка
            ПостроительОтчета.Выполнить();
            ТабЗначений = ПостроительОтчета.Результат.Выгрузить();
            
            // Если нашли область, где, например, ровно 8 колонок — это наша таблица
            Если ТабЗначений.Колонки.Количество() = НужноеКоличествоКолонок Тогда
                Прервать;
            КонецЕсли;
        Исключение
            Продолжить;
        КонецПопытки;
    КонецЦикла;
КонецЦикла;

Почему возникают проблемы с объединенными ячейками?

Выясним причину, по которой 1С иногда некорректно считывает данные из объединенных областей. В объекте ТабличныйДокумент значение хранится только в левой верхней ячейке объединения. Все остальные ячейки, входящие в эту область, будут возвращать Неопределено или пустое значение.

Чтобы обойти это ограничение при ручном обходе, необходимо анализировать свойства Нижний и Правый области ячейки. Если координаты области шире одной ячейки, значит, мы имеем дело с объединением, и данные нужно брать из "головы" этой группы.

Альтернативные способы для сложных случаев

Если встроенные средства 1С не справляются, профессионалы рекомендуют следующие подходы:

  1. Технология ADO (ActiveX Data Objects). Позволяет работать с листом Excel как с таблицей базы данных.
  2. Прямое чтение XML (для .xlsx). Это самый быстрый способ чтения огромных файлов. Для работы с многостраничными книгами также может использоваться универсальная обработка для загрузки файлов Excel и CSV, которая корректно считывает все листы файла.
  3. Использование COM-объекта. Метод Новый COMОбъект("Excel.Application") — самый точный способ, так как вы видите файл именно так, как его "видит" сам Excel.

Рекомендация: Для большинства повседневных задач связки ТабличныйДокумент + ПостроительОтчета более чем достаточно.

← На главную