При разработке отчетов и печатных форм с динамическим количеством колонок (кросс-таблиц) разработчики нередко сталкиваются с ситуацией, когда данные в результирующем отчете съезжают на одну ячейку влево или вправо, либо заголовок таблицы не совпадает с колонками строк данных. Разберем по шагам, почему возникает такое смещение и как организовать вывод динамических секций без использования лишних промежуточных таблиц.
Проанализируем распространенные ошибки при программном формировании макета:
КонтрольХарактеристикШапка|Общая), важно следить за тем, какие именно столбцы входят в именованную секцию Общая и секцию динамических колонок Дата. Если секция Общая захватывает первую колонку макета, которая фактически является служебной или пустой, весь блок данных сместится вправо.ТабличныйДокумент (например, Секция1, Секция2), вывод данных сначала в них, а затем присоединение к основному документу усложняет расчет сетки, приводит к накоплению лишних невидимых колонок и нарушению высоты/ширины таблиц.Присоединить() высота присоединяемой области должна быть в точности равна высоте области, к которой происходит присоединение. При расхождении платформа автоматически добавляет пустые ячейки.Выясним причину смещения на уровне макета. Если в первой колонке макета находится пустой отступ или служебная колонка нулевой ширины, убедимся, что границы именованных колонок начинаются со второй колонки:
Общая. Если отчет должен начинаться со второй колонки (C2), граница области должна быть установлена именно со столбца 2 (R...C2:R...C3), а не с первого столбца C1.Дата) идет строго следом за секцией Общая без пропущенных колонок между ними.Рассмотрим, как правильно формировать отчет с динамическими колонками без создания промежуточных табличных документов. Стандартная схема 1С строится на последовательном сочетании методов Вывести() (для первой левой части строки) и Присоединить() (для последующих колонок той же строки).
Посмотрим на пример правильного кода:
НовыйТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("КонтрольОснХарактеристик");
// Получаем области макета по пересечениям строк и колонок
ОбластьЗаголовок = Макет.ПолучитьОбласть("КонтрольХарактеристикЗаголовок");
ОбластьШапкаОбщая = Макет.ПолучитьОбласть("КонтрольХарактеристикШапка|Общая");
ОбластьШапкаДата = Макет.ПолучитьОбласть("КонтрольХарактеристикШапка|Дата");
ОбластьСтрокиОбщая = Макет.ПолучитьОбласть("КонтрольХарактеристикСтроки|Общая");
ОбластьСтрокиДата = Макет.ПолучитьОбласть("КонтрольХарактеристикСтроки|Дата");
ОбластьПустыеСтрокиДата = Макет.ПолучитьОбласть("КонтрольХарактеристикПустыеСтроки|Дата");
// 1. Выводим общий заголовок отчета
НовыйТабДок.Вывести(ОбластьЗаголовок);
// 2. Выводим левую фиксированную часть шапки
НовыйТабДок.Вывести(ОбластьШапкаОбщая);
// 3. В цикле присоединяем динамические колонки шапки по годам
Для Каждого ЭлементТЗ Из ГодТЗ Цикл
ОбластьШапкаДата.Параметры.Год = ЭлементТЗ.Год;
НовыйТабДок.Присоединить(ОбластьШапкаДата);
КонецЦикла;
ДанныеТЗ = РезультатКонтрольХарактеристик.Выгрузить();
НомерСтроки = 0;
// 4. Построчный вывод данных отчета
Для Каждого ЭлементТЗ Из ДанныеТЗ Цикл
// Формируем и выводим левую часть строки
ОбластьСтрокиОбщая.Параметры.Заполнить(ЭлементТЗ);
НомерСтроки = НомерСтроки + 1;
ОбластьСтрокиОбщая.Параметры.НомерСтроки = НомерСтроки;
ОбластьСтрокиОбщая.Параметры.Характеристика = Строка(ЭлементТЗ.Характеристика)
+ ?(ЗначениеЗаполнено(ЭлементТЗ.ЕдиницаИзмерения), ", " + Строка(ЭлементТЗ.ЕдиницаИзмерения), "");
НовыйТабДок.Вывести(ОбластьСтрокиОбщая);
// Присоединяем ячейки для каждого года в текущей строке
Для Каждого ЭлемТЗ Из ГодТЗ Цикл
Если ЭлемТЗ.Год = ЭлементТЗ.Год Тогда
ОбластьСтрокиДата.Параметры.Заполнить(ЭлементТЗ);
ОбластьСтрокиДата.Параметры.Замерил = Строка(ЭлементТЗ.ЗамерилДолжность)
+ ?(ЗначениеЗаполнено(ЭлементТЗ.ЗамерилДолжность) И ЗначениеЗаполнено(ЭлементТЗ.ЗамерилФИО), ", ", "")
+ Строка(ЭлементТЗ.ЗамерилФИО);
НовыйТабДок.Присоединить(ОбластьСтрокиДата);
Иначе
НовыйТабДок.Присоединить(ОбластьПустыеСтрокиДата);
КонецЕсли;
КонецЦикла;
КонецЦикла;
Если требуется вывести один общий заголовок (например, надпись «Дата проведения измерения») над всеми динамически добавленными годами, можно использовать один из двух подходов:
НовыйТабДок.Область(НомерСтроки, НачальнаяКолонка, НомерСтроки, КонечнаяКолонка).Объединить().Таким образом, устранение лишних промежуточных табличных документов и проверка границ вертикальных областей в макете полностью решают проблему нежелательного сдвига колонок.