Как динамически выводить колонки в печатной форме 1С при наличии или отсутствии данных

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

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

Метод 1: Использование вертикальных областей и метода Присоединить()

Это самый профессиональный и надежный способ управления структурой ТабличногоДокумента. Основная идея заключается в том, что макет разбивается не только на горизонтальные секции (строки), но и на вертикальные (столбцы). Рассмотрим подробнее алгоритм действий.

Во-первых, проанализируем структуру макета. Вместо одной широкой области «СтрокаДанных» нам нужно создать три маленьких вертикальных области: ОбластьФамилия, ОбластьИмя и ОбластьОтчество. В конфигураторе это делается путем выделения нужных колонок и присвоения им имен через меню «Таблица — Имена — Назначить имя».

Во-вторых, разберем программный код для вывода. Основное правило: первая область в строке выводится методом Вывести(), а все последующие в этой же строке — методом Присоединить(). Посмотрим на пример реализации:


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

// Флаг для определения, выведена ли первая колонка в текущей строке
ПерваяКолонкаВыведена = Ложь;

// Проверяем наличие данных и выводим области
Если ЗначениеЗаполнено(Данные.Фамилия) Тогда
    Область = Макет.ПолучитьОбласть("Строка|ОбластьФамилия");
    Область.Параметры.Фамилия = Данные.Фамилия;
    ТабДок.Вывести(Область);
    ПерваяКолонкаВыведена = Истина;
КонецЕсли;

Если ЗначениеЗаполнено(Данные.Имя) Тогда
    Область = Макет.ПолучитьОбласть("Строка|ОбластьИмя");
    Область.Параметры.Имя = Данные.Имя;
    Если ПерваяКолонкаВыведена Тогда
        ТабДок.Присоединить(Область);
    Иначе
        ТабДок.Вывести(Область);
        ПерваяКолонкаВыведена = Истина;
    КонецЕсли;
КонецЕсли;

Если ЗначениеЗаполнено(Данные.Отчество) Тогда
    Область = Макет.ПолучитьОбласть("Строка|ОбластьОтчество");
    Область.Параметры.Отчество = Данные.Отчество;
    Если ПерваяКолонкаВыведена Тогда
        ТабДок.Присоединить(Область);
    Иначе
        ТабДок.Вывести(Область);
    КонецЕсли;
КонецЕсли;

Используя этот подход, мы добиваемся того, что если Фамилия пустая, то Имя встанет на ее место (станет первой колонкой в строке), и документ будет выглядеть аккуратно, без лишних пробелов слева.

Метод 2: Управление видимостью колонок в готовом документе

Иногда переделывать макет под вертикальные области слишком трудозатратно, особенно если форма уже сложная и содержит много объединенных ячеек. В этом случае мы можем сначала сформировать документ полностью, а затем скрыть ненужные колонки. Выясним, как это сделать программно.

Проанализируем ситуацию: у нас есть готовый ТабДок. Мы знаем, в каких колонках выводятся наши данные. Мы можем обратиться к конкретной колонке и установить свойство Видимость в значение Ложь.


// Пример скрытия второй колонки, если в ней нет данных
Если Не ЗначениеЗаполнено(ПараметрИмя) Тогда
    // Обращаемся ко всей колонке №2
    ТабДок.Область(, 2, , 2).Видимость = Ложь;
КонецЕсли;

Важный нюанс: метод Область() без указания строк (пустые первые и третьи параметры) позволяет выделить колонку целиком. Однако помните, что скрытие колонки через Видимость может повлиять на заголовок или подвал документа, если они используют те же индексы колонок. Поэтому данный метод лучше применять, когда структура документа строго табличная.

Метод 3: Программное изменение ширины колонок

Если по каким-то причинам свойство Видимость не дает нужного визуального эффекта (например, в старых версиях платформы или при специфическом экспорте в Excel), мы можем программно «схлопнуть» колонку, установив ее ширину в ноль.

Рассмотрим по шагам:

  1. Формируем печатную форму обычным способом.
  2. Определяем номера колонок, которые потенциально могут быть пустыми.
  3. Проверяем условие заполненности.
  4. Устанавливаем ширину: ТабДок.Область(, НомерКолонки).ШиринаКолонки = 0;.

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

Метод 4: Формирование единой строки (конкатенация)

Если задача стоит просто вывести ФИО в одну строку через пробел, и строгое деление по столбцам не требуется, мы рекомендуем использовать функции работы со строками. Это значительно упростит код и избавит от необходимости манипуляций с областями макета.

Посмотрим на пример использования функции СтрСоединить, которая появилась в современных версиях платформы 8.3:


МассивФИО = Новый Массив;
Если ЗначениеЗаполнено(Данные.Фамилия) Тогда МассивФИО.Добавить(Данные.Фамилия); КонецЕсли;
Если ЗначениеЗаполнено(Данные.Имя) Тогда МассивФИО.Добавить(Данные.Имя); КонецЕсли;
Если ЗначениеЗаполнено(Данные.Отчество) Тогда МассивФИО.Добавить(Данные.Отчество); КонецЕсли;

// Объединяем элементы массива через пробел, пустые значения игнорируются автоматически
РезультатФИО = СтрСоединить(МассивФИО, " ");

// Выводим в единственный параметр макета
Область = Макет.ПолучитьОбласть("Строка");
Область.Параметры.ФИО_Строкой = РезультатФИО;
ТабДок.Вывести(Область);

Советы по оформлению границ

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

Рекомендуем:

Подводя итог, можно сказать, что выбор метода зависит от сложности задачи. Для простых текстовых данных лучше всего подходит конкатенация строк. Для сложных таблиц с сохранением структуры — метод Присоединить() или управление Видимостью колонок в финальном ТабличномДокументе.

← На главную