Как правильно вывести пересекающиеся области в табличный документ и избежать смещения данных?

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

Работа с макетами в 1С часто преподносит сюрпризы, особенно когда дело касается построения сложных отчетов с пересекающимися горизонтальными и вертикальными областями — для этого подойдёт конструктор макетов и печатных форм для 1С. Одной из самых распространенных проблем является «съезд» данных: например, когда область детальных записей выводится левее, чем шапка отчета, хотя в макете они выглядят выровненными. Разберем детально, как устроены механизмы вывода областей, почему возникают «мистические» ошибки и как правильно проектировать макет.

Разбор механизма относительных координат

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

Рассмотрим ситуацию: в макете у вас есть пустая первая колонка для отступа. Если в области «Шапка» эта колонка включена в именованную вертикальную область, а в области «Детали» — нет, то при вызове метода Присоединить() система начнет вывод с первой доступной колонки полученной области. Из-за разницы в индексах (в одной области это вторая колонка макета, в другой — первая) данные визуально «уедут» влево. Чтобы этого избежать, необходимо обеспечивать идентичность структуры вертикальных областей для всех выводимых строк.

Анализ программного вывода пересекающихся областей

Посмотрим на типичный пример кода, который используется для формирования помесячного отчета с показателями в строках и периодами в колонках — пригодится инструмент пошаговой отладки кода 1С в режиме Предприятие. Проанализируем, как происходит заполнение:


Макет = ПолучитьМакет("МакетПомесячно"); 
Табдок = ЭлементыФормы.ТабДок; 

// Выводим левый верхний угол (шапку показателей)
Область = Макет.ПолучитьОбласть("ПоказателиШапка|ПоказателиВертикальная"); 
ТабДок.Вывести(Область); 

// Присоединяем колонки с периодами в шапке
Область = Макет.ПолучитьОбласть("ПоказателиШапка|ЗначенияШапка"); 
Для а = 0 По 3 Цикл 
    Область.Параметры.Период = Дата(2025, а + 1, 1); 
    ТабДок.Присоединить(Область); 
КонецЦикла; 

// Основной цикл вывода данных
Для а = 0 по 10 Цикл 
    // Выводим строку с названием показателя
    Область = макет.ПолучитьОбласть("Таблица|ПоказательДетали"); 
    Область.Параметры.Показатель = "Показатель " + Строка(а); 
    ТабДок.Вывести(Область); 

    // Присоединяем данные (план/факт) по каждой колонке периода
    Область = макет.ПолучитьОбласть("Таблица|ТаблицаЗначения"); 
    Для б = 0 По 3 Цикл 
        Область.Параметры.План = б * 2; 
        Область.Параметры.Факт = б * 2.1; 
        ТабДок.Присоединить(Область); 
    КонецЦикла; 
КонецЦикла;

В данном примере крайне важно, чтобы ПоказателиВертикальная в строке ПоказателиШапка и область ПоказательДетали в строке Таблица имели одинаковые границы по горизонтали (одни и те же номера колонок в макете). Аналогично, ЗначенияШапка и ТаблицаЗначения должны строго совпадать по ширине колонок.

Оптимизация структуры макета: меньше — значит лучше

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

  1. Создаем одну вертикальную область (например, КолонкаПоказатель), которая проходит через весь макет сверху вниз.
  2. Создаем вторую вертикальную область (КолонкаДанные) для повторяющихся ячеек с цифрами.
  3. При вызове Макет.ПолучитьОбласть("ИмяСтроки | КолонкаДанные") система сама найдет нужный прямоугольник на пересечении.

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

Решение проблемы с заполнением параметров («Мистика» макета)

Иногда программисты сталкиваются с тем, что параметр в макете (обозначенный как <ИмяПараметра>) не выводится в итоговый документ, пока в свойствах ячейки не переключишь «Заполнение» с «Текст» на «Параметр» и обратно. Проанализируем причины этого поведения:

Кэширование формата: При копировании ячеек внутри конфигуратора 1С может сохранить внутренний флаг заполнения как «Текст», даже если визуально вы добавили угловые скобки. Платформа при выводе ориентируется не на визуальные символы <>, а на метаданные ячейки — поможет инструментарий разработчика для анализа структуры и отладки 1С. Принудительное переключение типа заполнения обновляет эти метаданные.

Конфликт имен: Если имя параметра совпадает с именем какого-либо реквизита формы или системной переменной, метод ПолучитьОбласть() в некоторых контекстах может отработать некорректно. Старайтесь давать параметрам уникальные осмысленные имена, например, Прм_ДатаВыгрузки вместо просто Дата.

Как создавать сложные «рваные» вертикальные области

Если вам необходимо, чтобы вертикальная область имела разную структуру для разных строк (например, в одной строке колонка объединена, а в другой — разделена), используйте механизм нового формата строк:

  1. Выделите нужную строку (или группу строк) целиком.
  2. Немного измените ширину любой колонки в этом выделении.
  3. Платформа спросит: «Для выделенных строк будет создан новый формат строк?». Нажмите «Да».

После этого изменения в сетке колонок для этих строк станут независимыми от остального макета. Это позволяет легально настраивать сложные пересечения, не прибегая к «извратам» с удалением и добавлением ячеек. Однако помните, что избыток форматов строк может замедлить вывод очень больших табличных документов.

Работа с методом Присоединить()

Метод Присоединить() всегда приклеивает новую область к правой границе последней выведенной области в текущей строке. Если у вас в присоединенной области слева есть пустая колонка без границ, визуально будет казаться, что данные «отпрыгнули» вправо. И наоборот, если в предыдущей области была скрытая пустая колонка справа, данные «съедут» влево. Всегда проверяйте границы областей, включив отображение сетки в конфигураторе (Меню Таблица — Вид — Отображать сетку) — пригодится обработка управления графикой и факсимиле в печатных формах.

← На главную