Почему табличный документ формируется со смещением в одну колонку и как правильно выводить динамические области?

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

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

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

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

  1. Несовпадение координат колонок в макете: когда именованная область задается пересечением строк и колонок (например, КонтрольХарактеристикШапка|Общая), важно следить за тем, какие именно столбцы входят в именованную секцию Общая и секцию динамических колонок Дата. Если секция Общая захватывает первую колонку макета, которая фактически является служебной или пустой, весь блок данных сместится вправо.
  2. Использование промежуточных табличных документов для склейки: создание временных объектов ТабличныйДокумент (например, Секция1, Секция2), вывод данных сначала в них, а затем присоединение к основному документу усложняет расчет сетки, приводит к накоплению лишних невидимых колонок и нарушению высоты/ширины таблиц.
  3. Несовпадение высоты присоединяемых областей: при вызове метода Присоединить() высота присоединяемой области должна быть в точности равна высоте области, к которой происходит присоединение. При расхождении платформа автоматически добавляет пустые ячейки.

Оптимизация макета: проверка границ именованных областей

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

  1. Откроем макет отчета в конфигураторе.
  2. Проверим вертикальные именованные области: выделим секцию Общая. Если отчет должен начинаться со второй колонки (C2), граница области должна быть установлена именно со столбца 2 (R...C2:R...C3), а не с первого столбца C1.
  3. Убедимся, что секция динамических колонок (например, Дата) идет строго следом за секцией Общая без пропущенных колонок между ними.

Правильный алгоритм вывода кросс-таблицы

Рассмотрим, как правильно формировать отчет с динамическими колонками без создания промежуточных табличных документов. Стандартная схема 1С строится на последовательном сочетании методов Вывести() (для первой левой части строки) и Присоединить() (для последующих колонок той же строки).

Посмотрим на пример правильного кода:


НовыйТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("КонтрольОснХарактеристик");

// Получаем области макета по пересечениям строк и колонок
ОбластьЗаголовок = Макет.ПолучитьОбласть("КонтрольХарактеристикЗаголовок");
ОбластьШапкаОбщая = Макет.ПолучитьОбласть("КонтрольХарактеристикШапка|Общая");
ОбластьШапкаДата = Макет.ПолучитьОбласть("КонтрольХарактеристикШапка|Дата");

ОбластьСтрокиОбщая = Макет.ПолучитьОбласть("КонтрольХарактеристикСтроки|Общая");
ОбластьСтрокиДата = Макет.ПолучитьОбласть("КонтрольХарактеристикСтроки|Дата");
ОбластьПустыеСтрокиДата = Макет.ПолучитьОбласть("КонтрольХарактеристикПустыеСтроки|Дата");

// 1. Выводим общий заголовок отчета
НовыйТабДок.Вывести(ОбластьЗаголовок);

// 2. Выводим левую фиксированную часть шапки
НовыйТабДок.Вывести(ОбластьШапкаОбщая);

// 3. В цикле присоединяем динамические колонки шапки по годам
Для Каждого ЭлементТЗ Из ГодТЗ Цикл
    ОбластьШапкаДата.Параметры.Год = ЭлементТЗ.Год;
    НовыйТабДок.Присоединить(ОбластьШапкаДата);
КонецЦикла;    

ДанныеТЗ = РезультатКонтрольХарактеристик.Выгрузить();
НомерСтроки = 0;

// 4. Построчный вывод данных отчета
Для Каждого ЭлементТЗ Из ДанныеТЗ Цикл
    
    // Формируем и выводим левую часть строки
    ОбластьСтрокиОбщая.Параметры.Заполнить(ЭлементТЗ);
    НомерСтроки = НомерСтроки + 1;
    ОбластьСтрокиОбщая.Параметры.НомерСтроки = НомерСтроки;
    ОбластьСтрокиОбщая.Параметры.Характеристика = Строка(ЭлементТЗ.Характеристика) 
        + ?(ЗначениеЗаполнено(ЭлементТЗ.ЕдиницаИзмерения), ", " + Строка(ЭлементТЗ.ЕдиницаИзмерения), "");
    
    НовыйТабДок.Вывести(ОбластьСтрокиОбщая);
    
    // Присоединяем ячейки для каждого года в текущей строке
    Для Каждого ЭлемТЗ Из ГодТЗ Цикл
        Если ЭлемТЗ.Год = ЭлементТЗ.Год Тогда
            ОбластьСтрокиДата.Параметры.Заполнить(ЭлементТЗ);
            ОбластьСтрокиДата.Параметры.Замерил = Строка(ЭлементТЗ.ЗамерилДолжность) 
                + ?(ЗначениеЗаполнено(ЭлементТЗ.ЗамерилДолжность) И ЗначениеЗаполнено(ЭлементТЗ.ЗамерилФИО), ", ", "") 
                + Строка(ЭлементТЗ.ЗамерилФИО);
            НовыйТабДок.Присоединить(ОбластьСтрокиДата);
        Иначе
            НовыйТабДок.Присоединить(ОбластьПустыеСтрокиДата);
        КонецЕсли;    
    КонецЦикла;
    
КонецЦикла;

Оформление общего заголовка над динамическими колонками

Если требуется вывести один общий заголовок (например, надпись «Дата проведения измерения») над всеми динамически добавленными годами, можно использовать один из двух подходов:

  1. Программное объединение ячеек: после вывода всей шапки документа определяем координаты начальной и конечной колонок и объединяем их вызовом метода НовыйТабДок.Область(НомерСтроки, НачальнаяКолонка, НомерСтроки, КонечнаяКолонка).Объединить().
  2. Свойство «По выделенным колонкам»: в макете для ячейки верхнего уровня устанавливаем свойство горизонтального выравнивания По выделенным колонкам, а текст заголовка заполняем только для первой выводимой колонки.

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

← На главную