При разработке печатных форм в 1С, таких как справка 2-НДФЛ, программисты часто сталкиваются с необходимостью изменить состав выводимых данных в зависимости от условий. Казалось бы, самый простой путь — скопировать существующую секцию макета (например, НалоговыйАгент), назвать её по-новому и внести минимальные правки. Однако на практике часто возникает проблема: новая секция при выводе выглядит «криво», границы ячеек смещаются, а колонки не соответствуют оригиналу. Проанализируем, почему это происходит, и разберем правильные способы решения задачи.
Выясним причину, по которой «близнецы» в табличном документе оказываются «разнояйцевыми». Основная проблема заключается в том, что табличный документ 1С (формат .mxl) имеет жесткую сетку колонок. Когда мы создаем новую секцию, она наследует общую ширину колонок всего листа. Рассмотрим основные факторы, влияющие на визуальные искажения:
Рассмотрим по шагам, как правильно создать дубликат секции, чтобы минимизировать риск искажений:
НалоговыйАгент1).НалоговыйАгентДолжность.Если после этого верстка все же выглядит неидеально, проанализируем настройки объединения. Попробуйте выделить «проблемные» ячейки, снять объединение и установить его заново. Также проверьте свойство Автовысота строки и Размещение текста — иногда именно длинный текст в параметре заставляет строку расширяться, сдвигая границы.
Зачастую создание секции-дубля — это избыточное действие, которое усложняет поддержку макета. Вместо этого разберем, как использовать одну и ту же секцию, меняя её содержимое программно. Это гарантирует, что оформление (шрифты, отступы, сетка) останется идентичным.
Допустим, в справке 2-НДФЛ нам нужно выводить должность, только если подписант не является главным бухгалтером. Посмотрим на пример кода, который позволяет управлять видимостью данных в одной секции:
// Получаем область из макета
ОбластьМакета = Макет.ПолучитьОбласть("НалоговыйАгент");
// Проверяем условие
Если ПодписантНеЯвляетсяГлавБухом Тогда
ОбластьМакета.Параметры.Должность = ДолжностьПодписанта;
Иначе
// Если должность выводить не нужно, просто очищаем параметр
ОбластьМакета.Параметры.Должность = "";
КонецЕсли;
// Заполняем остальные параметры
ОбластьМакета.Параметры.ФИО = ФИОПодписанта;
// Выводим готовую область в итоговый документ
ТабДок.Вывести(ОбластьМакета);
Если же задача стоит в том, чтобы физически скрыть целую строку внутри секции, можно воспользоваться свойством ВысотаСтроки. Проанализируем ситуацию: в секции три строки, и вторую нужно скрыть при определенных условиях.
Область = Макет.ПолучитьОбласть("НалоговыйАгент");
Если НужноСкрытьСтроку Тогда
// Обращаемся к конкретной строке внутри полученной области
Область.Область("R2").ВысотаСтроки = 0;
КонецЕсли;
ТабДок.Вывести(Область);
Этот метод гораздо надежнее создания «близнецов», так как вы работаете с одним и тем же набором колонок и их ширин.
В типовых отчетах часто используется конструкция вида Макет.ПолучитьОбласть("Строка|Колонка"). Если ваша новая секция выводится «криво», проверьте, не забыли ли вы в коде указать вертикальную область при получении новой секции. Посмотрим на пример:
// Было (оригинал):
Область = Макет.ПолучитьОбласть("НалоговыйАгент|ВертикальнаяОбластьДанных");
// Стало (ошибка):
Область = Макет.ПолучитьОбласть("НалоговыйАгентДолжность"); // Без вертикальной части ширина колонок будет стандартной!
// Правильно:
Область = Макет.ПолучитьОбласть("НалоговыйАгентДолжность|ВертикальнаяОбластьДанных");
Важный момент: если вы создали новую горизонтальную секцию, убедитесь, что она пересекается с теми же вертикальными секциями, что и оригинал. В противном случае 1С не поймет, какую ширину колонок применять к вашим ячейкам, и выведет их по «умолчанию».
Для стабильного вывода печатных форм мы рекомендуем придерживаться следующих правил:
Заполнение выберите Шаблон. Это позволит писать текст вида [Должность] [ФИО], где параметры будут заменяться значениями, а статичный текст останется.Соблюдение этих принципов позволит вам избежать «плывущей» верстки и сделает ваши отчеты профессиональными и аккуратными.