Как убрать раздвоение колонок в Excel и удалить лишние строки в макетах СКД

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

При разработке сложных отчетов на схеме компоновки данных (СКД) программисты часто сталкиваются с неприятными визуальными дефектами. Два наиболее распространенных из них — это раздвоение (дробление) колонок при сохранении отчета в формат MS Excel и появление нежелательных пустых строк между различными областями или группировками макета.

В этой статье мы подробно разберем физику этих процессов в платформе 1С:Предприятие, выясним их истинные причины и рассмотрим проверенные практические методы их устранения — как через настройки СКД, так и с помощью программного кода.

Часть 1. Почему раздваиваются колонки при сохранении в Excel и как это исправить

Для того чтобы решить проблему дробления колонок, проанализируем, как работает механизм экспорта табличного документа 1С в формат .xls или .xlsx.

В системе 1С табличный документ устроен очень гибко: каждая строка таблицы может иметь свой собственный набор колонок с индивидуальной шириной (так называемый собственный формат строк). Однако в MS Excel структура листа принципиально иная — там сетка колонок является строго единой и сквозной для всего листа от первой до последней строки.

Когда мы сохраняем отчет из 1С в Excel, конвертер платформы пытается максимально точно воссоздать визуальное расположение ячеек. Если в макетах СКД (например, в макете заголовка, шапки таблицы и детальных записей) границы колонок хотя бы на долю миллиметра не совпадают, движок 1С вынужден генерировать в Excel множество очень узких «вспомогательных» колонок, а затем объединять их в разных строках в различных комбинациях. В итоге колонка, которая в 1С выглядела как одна сплошная, в Excel превращается в две или три объединенные колонки (например, колонка 2 превращается в объединенные колонки 2 и 3).

Рассмотрим основные способы решения этой проблемы по шагам.

Способ 1. Создание единой сетки колонок в макетах СКД

Если вы используете индивидуальные макеты оформления для группировок (Заголовок, Шапка, Подразделение), крайне важно обеспечить строгую соосность их границ. Не раздвигайте ширину колонок отдельно для каждой строки макета. Ширина колонки «2» в макете шапки должна быть абсолютно идентична ширине колонки «2» в макете данных. Для выравнивания сетки используйте свойства колонок по умолчанию и избегайте ручного изменения размеров отдельных ячеек в разных секциях макета. Для регулярного контроля систем после внесения подобных изменений программа для автоматического обслуживания баз выполняет тестирование нескольких конфигураций в «тихом» режиме.

Способ 2. Отключение вывода служебных областей

Очень часто раздвоение колонок провоцируют стандартные области параметров и отборов, которые СКД выводит в самом начале отчета. Поскольку их ширина не совпадает с шириной основной таблицы, весь лист Excel «подстраивается» под них и дробит колонки таблицы.

Чтобы проверить эту гипотезу, выполним следующие действия в настройках отчета:

  1. Перейдем на вкладку Настройки в схеме компоновки данных.
  2. Выберем вкладку Другие настройки.
  3. Найдем параметры Выводить параметры и Выводить отбор и установим для них значение Не выводить.

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

Способ 3. Программное формирование или упрощение макетов

Если выравнивание сетки в конструкторе макетов не помогает из-за сложной структуры отчета, самым надежным решением будет программное заполнение проблемных областей (например, заголовка и подвала отчета) либо полный отказ от использования нескольких разнородных макетов в пользу одного сквозного шаблона. Для исправления уже выгруженных файлов можно воспользоваться надстройкой для Excel для устранения типичных визуальных дефектов данных 1С.


Часть 2. Почему появляется лишняя пустая строка между группировками СКД

Лишние строки в табличном документе могут появляться по трем основным причинам:

  1. Неправильная структура группировок. Если в настройках СКД заголовки, детальные записи и подвалы расположены на одном уровне иерархии (как соседние элементы), система воспринимает их как независимые таблицы и автоматически вставляет между ними пустую строку-разделитель.
  2. Ошибки выделения областей макета. При назначении имени области в макете СКД разработчик мог случайно захватить пустую строку ниже или выше основных ячеек. Проверьте границы ваших именованных областей в свойствах макета.
  3. Автоматическое наложение стилей оформления. Стандартные макеты оформления платформы (например, «Основной») могут принудительно добавлять отступы вокруг заголовков группировок.

Для устранения этой проблемы в настройках СКД рекомендуется задать для группировок, выводящих текстовые макеты, следующие параметры:


Часть 3. Программное удаление лишних строк (постобработка)

Если настройки СКД не позволяют избавиться от пустой строки (например, когда отчет строится по сложной иерархии и структура зашита в типовой конфигурации, куда нежелательно вносить масштабные изменения), можно прибегнуть к постобработке готового табличного документа. В случаях, когда подобные манипуляции нужно выполнять регулярно без изменения программного кода, платформа для создания программных роботов выполняет повторяющиеся действия пользователя по формированию и корректировке документов.

Многие разработчики совершают типичную ошибку: они пытаются написать код удаления строки в конце обработчика события ПриКомпоновкеРезультата модуля объекта отчета, используя стандартный метод:


ДокументРезультат.УдалитьОбласть(ДокументРезультат.Область("R9"), ТипСмещенияТабличногоДокумента.ПоВертикали);

При этом код отрабатывает без ошибок, но строка на экране остается на месте. Выясним причину этого поведения.

По умолчанию для отчетов включено свойство СтандартнаяОбработка = Истина. При таком режиме событие ПриКомпоновкеРезультата вызывается до того, как платформа фактически заполнит ДокументРезультат данными. В момент работы вашего кода документ еще абсолютно пуст, поэтому попытка удалить строку R9 ни к чему не приводит. Сразу после окончания процедуры платформа берет управление на себя, полностью перезаписывает табличный документ и выводит его пользователю со всеми лишними строками.

Чтобы программное удаление сработало, нам необходимо полностью взять процесс компоновки под свой контроль, отключив стандартную обработку. Разберем правильный шаблон кода для модуля объекта отчета:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    // 1. Отключаем стандартный автоматический вывод платформы
    СтандартнаяОбработка = Ложь; 
    
    // 2. Инициализируем программный процесс компоновки данных
    Настройки = КомпоновщикНастроек.ПолучитьНастройки();
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
    
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
    
    // 3. Выводим результат компоновки в наш Табличный Документ
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    
    // 4. ТЕПЕРЬ ДОКУМЕНТ ПОЛНОСТЬЮ ЗАПОЛНЕН!
    // Мы можем безопасно анализировать и удалять ненужные области и пустые строки.
    
    Попытка
        // Удаляем конкретную ненужную строку (например, 9-ю строку)
        СтрокаДляУдаления = 9;
        ОбластьДляУдаления = ДокументРезультат.Область("R" + Формат(СтрокаДляУдаления, "ЧГ=0"));
        ДокументРезультат.УдалитьОбласть(ОбластьДляУдаления, ТипСмещенияТабличногоДокумента.ПоВертикали);
    Исключение
        // Защита на случай, если структура отчета изменилась и строки не существует
        ЗаписьЖурналаРегистрации("ОтказПриУдаленииСтроки", УровеньЖурналаРегистрации.Предупреждение, , , ОписаниеОшибки());
    КонецПопытки;
    
КонецПроцедуры

Используя этот подход, мы гарантируем, что манипуляции с ячейками происходят в уже сформированном документе. Это позволяет гибко управлять структурой вывода: программно объединять ячейки, удалять пустые строки или динамически менять оформление отчета перед его показом пользователю. Для контроля правильности данных после доработки отчёта автоматическая сверка проводок через COM-соединение находит возможные расхождения в автоматическом режиме.

← На главную