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

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

Часто при разработке отчетов или обработок выгрузки данных программисты 1С сталкиваются с ситуацией, когда итоговый файл Excel выглядит неопрятно: данные начинаются не с первой ячейки (A1), а со смещением — например, со второй колонки и пятой строки. Это создает неудобства для пользователей, особенно если файл предназначен для автоматизированной обработки или импорта в другие системы. В этой статье мы подробно проанализируем причины такого поведения системы и разберем несколько эффективных способов решения проблемы.

Почему возникают пустые строки и колонки при использовании ПостроителяОтчета?

Рассмотрим ситуацию, когда для преобразования ТаблицыЗначений в ТабличныйДокумент используется объект ПостроительОтчета. Это удобный инструмент, который автоматически формирует структуру отчета, но он имеет ряд настроек по умолчанию, которые и вызывают смещение:

  1. Заголовок отчета: Построитель резервирует первые строки под название отчета.
  2. Информация об отборах: Если в построителе установлены фильтры, они выводятся в шапке документа, занимая дополнительные строки.
  3. Техническая колонка группировок: Первая колонка (колонка "A") часто резервируется под дерево группировок (плюсики и минусики), даже если самих группировок в данных нет.
  4. Реквизиты отчета: Сведения о дате формирования и авторе также могут занимать место сверху.

Выясним, как программно управлять этими настройками, чтобы "прижать" данные к левому верхнему углу.

Способ 1: Настройка свойств ПостроителяОтчета

Самый простой и правильный путь — это отключение вывода служебных областей в самом построителе перед тем, как вызвать метод Вывести(). Проанализируем необходимые свойства:


Построитель = Новый ПостроительОтчета;
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТЗ);
Построитель.Выполнить();

// Отключаем лишние элементы оформления
Построитель.ВыводитьЗаголовокОтчета = Ложь; 
Построитель.ВыводитьОтбор = Ложь;
Построитель.ВыводитьПодвалОтчета = Ложь;

ТабличныйДокумент = Новый ТабличныйДокумент;
Построитель.Вывести(ТабличныйДокумент);

Установка свойства ВыводитьЗаголовокОтчета в значение Ложь убирает пустые строки сверху. Однако это не всегда решает проблему первой пустой колонки. Если колонка все равно остается, перейдем к более радикальным методам.

Способ 2: Программное удаление лишних областей

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

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


// Удаление первых 4-х строк
Если ТабличныйДокумент.ВысотаТаблицы >= 4 Тогда
    ОбластьДляУдаления = ТабличныйДокумент.Область(1, , 4, );
    ТабличныйДокумент.УдалитьОбласть(ОбластьДляУдаления, ТипСмещенияТабличногоДокумента.ПоВертикали);
КонецЕсли;

// Удаление первой колонки
Если ТабличныйДокумент.ШиринаТаблицы >= 1 Тогда
    ОбластьКолонки = ТабличныйДокумент.Область(, 1, , 1);
    ТабличныйДокумент.УдалитьОбласть(ОбластьКолонки, ТипСмещенияТабличногоДокумента.ПоГоризонтали);
КонецЕсли;

Важный момент: При использовании метода УдалитьОбласть крайне важно указывать правильный ТипСмещенияТабличногоДокумента, чтобы остальные данные корректно сдвинулись. Для реализации сложного форматирования также существует COM компонента для вывода в Excel в стиле 1С.

Способ 3: Ручное заполнение ТабличногоДокумента (Цикл)

Если вам нужен полный контроль над каждой ячейкой и вы хотите избежать "магии" построителя, оптимальным решением будет прямой перебор ТаблицыЗначений и заполнение ТабличногоДокумента. Рассмотрим оптимизированный алгоритм, который корректно обрабатывает типы данных (числа и даты) для Excel.


ТабДок = Новый ТабличныйДокумент;
КоличествоКолонок = ТЗ.Колонки.Количество();

// 1. Формируем шапку (первая строка)
Для ИндексКол = 0 По КоличествоКолонок - 1 Цикл
    ТекущаяКолонка = ТЗ.Колонки[ИндексКол];
    Ячейка = ТабДок.Область(1, ИндексКол + 1);
    Ячейка.Текст = ?(ЗначениеЗаполнено(ТекущаяКолонка.Заголовок), ТекущаяКолонка.Заголовок, ТекущаяКолонка.Имя);
    Ячейка.Шрифт = Новый Шрифт(,,Истина); // Жирный шрифт для шапки
КонецЦикла;

// 2. Заполняем данные (начиная со второй строки)
НомерСтроки = 2;
Для Каждого СтрокаДанных Из ТЗ Цикл
    Для НомерКолонки = 1 По КоличествоКолонок Цикл
        Значение = СтрокаДанных[НомерКолонки - 1];
        Ячейка = ТабДок.Область(НомерСтроки, НомерКолонки);
        
        // Устанавливаем значение с учетом типа для корректного отображения в Excel
        Если ТипЗнч(Значение) = Тип("Число") Тогда
            Ячейка.СодержитЗначение = Истина;
            Ячейка.ТипЗначения = Новый ОписаниеТипов("Число");
            Ячейка.Значение = Значение;
            Ячейка.Формат = "ЧГ=0"; // Убираем разделитель групп разрядов
        ИначеЕсли ТипЗнч(Значение) = Тип("Дата") Тогда
            Ячейка.СодержитЗначение = Истина;
            Ячейка.ТипЗначения = Новый ОписаниеТипов("Дата");
            Ячейка.Значение = Значение;
            Ячейка.Формат = "ДФ=dd.MM.yyyy";
        Иначе
            Ячейка.Текст = Строка(Значение);
        КонецЕсли;
    КонецЦикла;
    НомерСтроки = НомерСтроки + 1;
КонецЦикла;

ТабДок.Записать("C:\my_export.xlsx", ТипФайлаТабличногоДокумента.XLSX);

Проанализируем этот код подробнее. Использование свойства СодержитЗначение и Значение вместо простого присвоения Текст позволяет Excel распознать данные именно как числа или даты. Это критически важно, если пользователь планирует в дальнейшем суммировать колонки или фильтровать даты в Excel.

Особенности форматов XLS и XLSX

При выгрузке данных стоит обратить внимание на используемый формат файла. В современных версиях платформы 1С настоятельно рекомендуется использовать ТипФайлаТабличногоДокумента.XLSX (формат Excel 2007 и выше).

Преимущества XLSX:

  1. Объем данных: Формат поддерживает более 1 миллиона строк, в то время как старый XLS ограничен 65 536 строками.
  2. Типизация: XLSX гораздо лучше сохраняет форматы чисел и дат без дополнительных манипуляций.
  3. Размер файла: За счет сжатия файлы XLSX занимают значительно меньше места на диске.

Советы по оптимизации

Если ваша таблица содержит десятки тысяч строк, метод перебора каждой ячейки (Способ 3) может работать медленно. В таких случаях рекомендуем:

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

← На главную