Работа с макетами в 1С часто преподносит сюрпризы, особенно когда дело касается построения сложных отчетов с пересекающимися горизонтальными и вертикальными областями — для этого подойдёт конструктор макетов и печатных форм для 1С. Одной из самых распространенных проблем является «съезд» данных: например, когда область детальных записей выводится левее, чем шапка отчета, хотя в макете они выглядят выровненными. Разберем детально, как устроены механизмы вывода областей, почему возникают «мистические» ошибки и как правильно проектировать макет.
Для начала проанализируем, почему данные могут смещаться. Когда мы используем метод ПолучитьОбласть("Строка|Колонка"), платформа 1С не просто копирует фрагмент макета, она создает временный табличный документ, содержащий только указанное пересечение. Важно понимать: колонки в этой новой временной области всегда начинаются с индекса 1.
Рассмотрим ситуацию: в макете у вас есть пустая первая колонка для отступа. Если в области «Шапка» эта колонка включена в именованную вертикальную область, а в области «Детали» — нет, то при вызове метода Присоединить() система начнет вывод с первой доступной колонки полученной области. Из-за разницы в индексах (в одной области это вторая колонка макета, в другой — первая) данные визуально «уедут» влево. Чтобы этого избежать, необходимо обеспечивать идентичность структуры вертикальных областей для всех выводимых строк.
Посмотрим на типичный пример кода, который используется для формирования помесячного отчета с показателями в строках и периодами в колонках — пригодится инструмент пошаговой отладки кода 1С в режиме Предприятие. Проанализируем, как происходит заполнение:
Макет = ПолучитьМакет("МакетПомесячно");
Табдок = ЭлементыФормы.ТабДок;
// Выводим левый верхний угол (шапку показателей)
Область = Макет.ПолучитьОбласть("ПоказателиШапка|ПоказателиВертикальная");
ТабДок.Вывести(Область);
// Присоединяем колонки с периодами в шапке
Область = Макет.ПолучитьОбласть("ПоказателиШапка|ЗначенияШапка");
Для а = 0 По 3 Цикл
Область.Параметры.Период = Дата(2025, а + 1, 1);
ТабДок.Присоединить(Область);
КонецЦикла;
// Основной цикл вывода данных
Для а = 0 по 10 Цикл
// Выводим строку с названием показателя
Область = макет.ПолучитьОбласть("Таблица|ПоказательДетали");
Область.Параметры.Показатель = "Показатель " + Строка(а);
ТабДок.Вывести(Область);
// Присоединяем данные (план/факт) по каждой колонке периода
Область = макет.ПолучитьОбласть("Таблица|ТаблицаЗначения");
Для б = 0 По 3 Цикл
Область.Параметры.План = б * 2;
Область.Параметры.Факт = б * 2.1;
ТабДок.Присоединить(Область);
КонецЦикла;
КонецЦикла;
В данном примере крайне важно, чтобы ПоказателиВертикальная в строке ПоказателиШапка и область ПоказательДетали в строке Таблица имели одинаковые границы по горизонтали (одни и те же номера колонок в макете). Аналогично, ЗначенияШапка и ТаблицаЗначения должны строго совпадать по ширине колонок.
Частой ошибкой является создание избыточного количества вертикальных областей. Нам не нужно создавать отдельные области для каждой ячейки. Достаточно использовать принцип пересечения:
КолонкаПоказатель), которая проходит через весь макет сверху вниз.КолонкаДанные) для повторяющихся ячеек с цифрами.Макет.ПолучитьОбласть("ИмяСтроки | КолонкаДанные") система сама найдет нужный прямоугольник на пересечении.Это значительно упрощает поддержку кода. Если вы измените ширину колонки в макете, вам не придется переназначать десятки мелких областей — для этого есть редактор макетов и печатных форм без программирования.
Иногда программисты сталкиваются с тем, что параметр в макете (обозначенный как <ИмяПараметра>) не выводится в итоговый документ, пока в свойствах ячейки не переключишь «Заполнение» с «Текст» на «Параметр» и обратно. Проанализируем причины этого поведения:
Кэширование формата: При копировании ячеек внутри конфигуратора 1С может сохранить внутренний флаг заполнения как «Текст», даже если визуально вы добавили угловые скобки. Платформа при выводе ориентируется не на визуальные символы <>, а на метаданные ячейки — поможет инструментарий разработчика для анализа структуры и отладки 1С. Принудительное переключение типа заполнения обновляет эти метаданные.
Конфликт имен: Если имя параметра совпадает с именем какого-либо реквизита формы или системной переменной, метод ПолучитьОбласть() в некоторых контекстах может отработать некорректно. Старайтесь давать параметрам уникальные осмысленные имена, например, Прм_ДатаВыгрузки вместо просто Дата.
Если вам необходимо, чтобы вертикальная область имела разную структуру для разных строк (например, в одной строке колонка объединена, а в другой — разделена), используйте механизм нового формата строк:
После этого изменения в сетке колонок для этих строк станут независимыми от остального макета. Это позволяет легально настраивать сложные пересечения, не прибегая к «извратам» с удалением и добавлением ячеек. Однако помните, что избыток форматов строк может замедлить вывод очень больших табличных документов.
Метод Присоединить() всегда приклеивает новую область к правой границе последней выведенной области в текущей строке. Если у вас в присоединенной области слева есть пустая колонка без границ, визуально будет казаться, что данные «отпрыгнули» вправо. И наоборот, если в предыдущей области была скрытая пустая колонка справа, данные «съедут» влево. Всегда проверяйте границы областей, включив отображение сетки в конфигураторе (Меню Таблица — Вид — Отображать сетку) — пригодится обработка управления графикой и факсимиле в печатных формах.