Как задать условие для параметра в шаблоне ячейки макета 1С

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

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

Ограничение механизма «Шаблон» в табличных документах 1С:Предприятие 8

Выясним причину, по которой попытки написать тернарный оператор вида [?(Параметр > 1, Параметр, Параметр2)] или конструкцию с Если непосредственно в свойствах ячейки не дают результата.

В платформе 1С:Предприятие 8 для ячейки табличного документа предусмотрено три варианта свойства Заполнение:

  1. Текст — статическая строка, отображаемая без изменений.
  2. Параметр — ячейка связывается с одним конкретным параметром из коллекции Область.Параметры.
  3. Шаблон — строковый шаблон, в котором фрагменты текста внутри квадратных скобок [...] определяют имена параметров. Например, строка Директор: [ФИОДиректора] при выводе заменит [ФИОДиректора] на значение свойства Область.Параметры.ФИОДиректора.

Важно понимать: платформа 1С 8.x не производит вычисление выражений или кода встроенного языка внутри квадратных скобок шаблона. Все символы внутри скобок воспринимаются исключительно как имя параметра. Если указать внутри скобок логическое выражение или знаки операций, платформа не сможет найти параметр с таким длинным и некорректным именем, из-за чего ячейка останется пустой либо возникнет ошибка формирования документа.

Рассмотрим основные и наиболее эффективные способы решения задачи.

Способ 1. Вычисление значения в коде модуля

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

1. В макете для требуемой ячейки устанавливаем тип заполнения Параметр (или Шаблон, если параметр находится внутри текста) и указываем понятное имя, например РезультирующееЗначение.

2. В процедуре формирования табличного документа вычисляем значение перед выводом области в результирующий документ с помощью тернарного оператора ?() или стандартного ветвления Если ... Тогда:


ОбластьСтрока = Макет.ПолучитьОбласть("Строка");

// Вычисляем значение по условию
Если Параметр > 1 Тогда
    ИтоговыйТекст = Параметр;
Иначе
    ИтоговыйТекст = Параметр2;
КонецЕсли;

// Или компактно с помощью тернарной операции:
// ИтоговыйТекст = ?(Параметр > 1, Параметр, Параметр2);

ОбластьСтрока.Параметры.РезультирующееЗначение = ИтоговыйТекст;
ТабличныйДокумент.Вывести(ОбластьСтрока);

Способ 2. Вычисление условия на уровне запроса

Если исходные данные для печатной формы выбираются с помощью запроса, оптимальнее всего перенести логику условия непосредственно в текст запроса с помощью конструкции ВЫБОР КОГДА ... ТОГДА ... ИНАЧЕ ... КОНЕЦ. Это разгружает программный код и позволяет получить уже готовое для вывода поле.

Посмотрим на пример текста запроса:


ВЫБРАТЬ
    Таблица.Ссылка КАК Ссылка,
    ВЫБОР
        КОГДА Таблица.Количество > 1
            ТОГДА Таблица.Количество
        ИНАЧЕ Таблица.РезервноеКоличество
    КОНЕЦ КАК РезультирующееЗначение
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК Таблица
ГДЕ
    Таблица.Ссылка = &Документ

В модуле останется только применить метод Заполнить(), который автоматически сопоставит имена полей выборки с параметрами области макета:


Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
    ОбластьСтрока.Параметры.Заполнить(Выборка);
    ТабличныйДокумент.Вывести(ОбластьСтрока);
КонецЦикла;

Способ 3. Использование разных областей макета

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


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

ТабличныйДокумент.Вывести(ОбластьВывода);

Итоги

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

← На главную