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

Программист 1С v7.7
← На главную

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

Почему не работает сложное условие внутри ячейки макета

Разберем типичную ошибку начинающего разработчика. Попытка написать громоздкую конструкцию с использованием оператора ?() непосредственно в ячейке макета с типом «Шаблон» или «Выражение» часто приводит к тому, что система выводит текст условия «как есть» или некорректно вычисляет переменные. Это происходит потому, что механизм вычисления выражений в макете 7.7 предназначен для простых операций. Кроме того, физические переносы строк внутри кода выражения в ячейке макета не допускаются — движок платформы воспринимает их как разрыв синтаксической конструкции.

Проанализируем ситуацию: когда вы ставите тип «Выражение», 1С ожидает одну строку кода, результатом которой будет значение. Если внутри кода встречаются сложные объекты или попытка вывести многострочный текст через запятую, парсер выдает ошибку или непредсказуемый результат. Поэтому золотое правило 1С 7.7 гласит: вся сложная логика должна находиться в программном модуле, а в макет должны передаваться только готовые значения.

Способ №1: Использование разных секций макета (Рекомендуемый)

Это самый «чистый» и правильный с точки зрения архитектуры 1С 7.7 способ. Вместо того чтобы пытаться впихнуть невпихуемое в одну ячейку, мы создадим две разные секции в макете и будем управлять их выводом из кода.

Рассмотрим пошагово этот процесс:

  1. Откроем макет печатной формы.
  2. Создадим секцию (строку), назовем ее, например, СекцияФизЛицо. В ней разместим переменные для паспорта: [Клиент.ПаспортСерия], [Клиент.ПаспортНомер] и так далее.
  3. Создадим вторую секцию, назовем ее СекцияЮрЛицо. Здесь разместим ячейки для ИНН, КПП и банковских счетов.
  4. В модуле формы (или обработки), где происходит формирование таблицы, напишем условие для вывода нужной секции.

Пример программного кода для реализации этого способа:


Если Клиент.Форма = Перечисление.Формы.ЧЛ Тогда
    Таб.ВывестиСекцию("СекцияФизЛицо");
Иначе
    Таб.ВывестиСекцию("СекцияЮрЛицо");
КонецЕсли;

Этот метод позволяет гибко настраивать визуальное оформление (шрифты, границы, выравнивание) для каждого типа контрагента отдельно, не загромождая макет сложными формулами.

Способ №2: Подготовка текста в программном модуле

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

Рассмотрим подробнее, как сформировать многострочный текст. Выясним причину, по которой обычное сложение строк не всегда подходит: нам нужно явно указывать переносы строк. В 1С 7.7 для этого используется константа РазделительСтрок.

Пример подготовки данных в модуле:


Перем ТекстРеквизитов;

Если Клиент.Форма = Перечисление.Формы.ЧЛ Тогда
    ТекстРеквизитов = "Паспорт: " + СокрЛП(Клиент.ПаспортСерия) + " № " + СокрЛП(Клиент.ПаспортНомер) + 
                      РазделительСтрок + "Адрес: " + СокрЛП(Клиент.Адрес);
Иначе
    ТекстРеквизитов = "ИНН/КПП: " + СокрЛП(Клиент.ИНН) + "/" + СокрЛП(Клиент.КПП) + 
                      РазделительСтрок + "Р/с: " + СокрЛП(Клиент.Расч_Счет);
КонецЕсли;
// В макете в ячейке просто пишем [ТекстРеквизитов] и ставим тип "Шаблон"

Важный нюанс: для ячейки в макете, куда выводится переменная ТекстРеквизитов, в свойствах на вкладке «Положение» обязательно нужно установить флажок «Переносить по словам». Это позволит ячейке автоматически расширяться по вертикали, вмещая все сформированные строки.

Способ №3: Использование функции Шаблон() внутри выражения

Существует продвинутый метод, который позволяет использовать условия прямо в макете, если вы все же хотите избежать создания лишних переменных в модуле. Для этого используется системная функция Шаблон(). Она принудительно обрабатывает строку, вычисляя значения в квадратных скобках.

Посмотрим на пример такого выражения для ячейки макета (тип ячейки должен быть «Выражение»):


?(Клиент.Форма = Перечисление.Формы.ЧЛ, Шаблон("[Клиент.ПаспортСерия] [Клиент.ПаспортНомер]"), Шаблон("ИНН [Клиент.ИНН]"))

Разберем, как это работает. Функция ?() проверяет условие. Если оно истинно, выполняется функция Шаблон(), которая «заглядывает» внутрь строки, находит там обращение к объекту Клиент и подставляет реальное значение. Без функции Шаблон() система вывела бы просто текст «[Клиент.ИНН]» как обычную строку.

Сравнение типов ячеек: Текст, Выражение, Шаблон

Для понимания того, какой метод выбрать, проанализируем различия типов ячеек в 1С 7.7:

Практические советы по работе с макетами 7.7

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

Рассмотрим пример качественной обработки данных:


СтрокаКПП = ?(ПустаяСтрока(Клиент.КПП) = 0, " / КПП " + СокрЛП(Клиент.КПП), "");
ТекстИНН_КПП = "ИНН " + СокрЛП(Клиент.ИНН) + СтрокаКПП;

Такой подход гарантирует, что если КПП не заполнен, то и лишних разделителей (слэшей) в печатной форме не появится. Это делает ваши документы профессиональными и аккуратными.

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

← На главную