Почему в отчете СКД колонки разбиваются на две и как это исправить?

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

При выгрузке отчетов на платформе 1С в формат Excel или при их обычном просмотре разработчики и пользователи часто сталкиваются с неэстетичным поведением: одна и та же колонка (например, «Банковский счет» или «Оплачено») неожиданно оказывается разделенной на две или более узкие подколонки. При этом соседние ячейки выравниваются корректно. Выясним причину такого поведения схемы компоновки данных (СКД) и рассмотрим способы настройки отчета для сохранения единой сетки.

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

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

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

Способ 1. Отключение стандартного заголовка и отбора в «Других настройках»

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

  1. Откроем схему компоновки данных и перейдем на вкладку «Настройки».
  2. Выберем корневой элемент настроек и перейдем на вкладку «Другие настройки».
  3. Найдем параметры «Выводить заголовок» и «Выводить параметры» и установим для них значение «Не выводить».
  4. Сформируем отчет заново. Сетка колонок выровняется, и дробление ячеек исчезнет.

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

Способ 2. Изменение настройки «Расположение реквизитов» и группировка полей

Проанализируем ситуацию, когда разбиение колонок происходит из-за вывода дочерних реквизитов ссылочного объекта (например, реквизитов банковского счета или контрагента):

  1. На вкладке «Настройки» на уровне отчета или конкретной группировки найдем параметр «Расположение реквизитов».
  2. Изменим значение с «В отдельных колонках» на «Вместе» или «Авто». Это предотвратит дробление шапки на дополнительные подколонки для каждого отдельного реквизита.
  3. В разделе «Выбранные поля» сгруппируем смежные поля с помощью кнопки «Сгруппировать поля», задав для них общий заголовок. Это явно задаст правила объединения ячеек в шапке отчета.

Способ 3. Программное постобработка табличного документа

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


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

Функция ОбъединятьЯчейки(ТабДок, индСтр, индКол)
    Ячейка = ТабДок.Область(индСтр, индКол);
    ЯчейкаСлед = ТабДок.Область(индСтр, индКол + 1);
    
    Если ПустаяСтрока(Ячейка.Текст) Тогда
        Возврат Ложь;
    ИначеЕсли Ячейка.Текст = ЯчейкаСлед.Текст Тогда
        Возврат Истина;
    Иначе
        Возврат Ложь;
    КонецЕсли;
КонецФункции

Способ 4. Разделение вывода шапки и таблицы в событии «ПриКомпоновкеРезультата»

Наиболее надежным техническим решением является разделение формирования сетки заголовка и сетки основной таблицы отчета через обработчик ПриКомпоновкеРезультата в модуле объекта отчета.

Посмотри, как реализуется данный подход:

  1. В модуле объекта отчета создается обработчик события ПриКомпоновкеРезультата.
  2. Устанавливается СтандартнаяОбработка = Ложь.
  3. Вывод заголовка и параметров выполняется в отдельный вспомогательный документ (или область) с одной сеткой колонок.
  4. Вывод основной таблицы данных выполняется объектом ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент в другой документ.
  5. Таблица с данными присоединяется снизу к шапке через метод Вывести() или ВставитьОбласть(). При этом сетка колонок таблицы не искажается границами шапки.

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

← На главную