При разработке печатных форм и отчетов в 1С часто возникает задача вывести в ячейку табличного документа то или иное значение в зависимости от определенного условия (например, если число больше единицы, вывести одно значение, иначе — другое). Разберем, как устроен механизм шаблонов в макетах табличных документов платформы 1С:Предприятие 8, почему в них нельзя писать формулы и как правильно реализовать такую логику.
Выясним причину, по которой попытки написать тернарный оператор вида [?(Параметр > 1, Параметр, Параметр2)] или конструкцию с Если непосредственно в свойствах ячейки не дают результата.
В платформе 1С:Предприятие 8 для ячейки табличного документа предусмотрено три варианта свойства Заполнение:
Область.Параметры.[...] определяют имена параметров. Например, строка Директор: [ФИОДиректора] при выводе заменит [ФИОДиректора] на значение свойства Область.Параметры.ФИОДиректора.Важно понимать: платформа 1С 8.x не производит вычисление выражений или кода встроенного языка внутри квадратных скобок шаблона. Все символы внутри скобок воспринимаются исключительно как имя параметра. Если указать внутри скобок логическое выражение или знаки операций, платформа не сможет найти параметр с таким длинным и некорректным именем, из-за чего ячейка останется пустой либо возникнет ошибка формирования документа.
Рассмотрим основные и наиболее эффективные способы решения задачи.
Разберем классический подход. Вместо попытки вычислить условие в макете зададим в ячейке макета единый результирующий параметр, а всю логику расчета перенесем в программный модуль формирования печатной формы.
1. В макете для требуемой ячейки устанавливаем тип заполнения Параметр (или Шаблон, если параметр находится внутри текста) и указываем понятное имя, например РезультирующееЗначение.
2. В процедуре формирования табличного документа вычисляем значение перед выводом области в результирующий документ с помощью тернарного оператора ?() или стандартного ветвления Если ... Тогда:
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
// Вычисляем значение по условию
Если Параметр > 1 Тогда
ИтоговыйТекст = Параметр;
Иначе
ИтоговыйТекст = Параметр2;
КонецЕсли;
// Или компактно с помощью тернарной операции:
// ИтоговыйТекст = ?(Параметр > 1, Параметр, Параметр2);
ОбластьСтрока.Параметры.РезультирующееЗначение = ИтоговыйТекст;
ТабличныйДокумент.Вывести(ОбластьСтрока);
Если исходные данные для печатной формы выбираются с помощью запроса, оптимальнее всего перенести логику условия непосредственно в текст запроса с помощью конструкции ВЫБОР КОГДА ... ТОГДА ... ИНАЧЕ ... КОНЕЦ. Это разгружает программный код и позволяет получить уже готовое для вывода поле.
Посмотрим на пример текста запроса:
ВЫБРАТЬ
Таблица.Ссылка КАК Ссылка,
ВЫБОР
КОГДА Таблица.Количество > 1
ТОГДА Таблица.Количество
ИНАЧЕ Таблица.РезервноеКоличество
КОНЕЦ КАК РезультирующееЗначение
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК Таблица
ГДЕ
Таблица.Ссылка = &Документ
В модуле останется только применить метод Заполнить(), который автоматически сопоставит имена полей выборки с параметрами области макета:
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
ОбластьСтрока.Параметры.Заполнить(Выборка);
ТабличныйДокумент.Вывести(ОбластьСтрока);
КонецЦикла;
Проанализируем ситуацию, когда в зависимости от условия требуется не только изменить текст, но и применить разное визуальное оформление (цвет фона, начертание шрифта или рамки ячеек). В этом случае в макете создаются две разные именованные области, а выбор нужной выполняется в коде:
Если Параметр > 1 Тогда
ОбластьВывода = Макет.ПолучитьОбласть("СтрокаВариант1");
ОбластьВывода.Параметры.Параметр = Параметр;
Иначе
ОбластьВывода = Макет.ПолучитьОбласть("СтрокаВариант2");
ОбластьВывода.Параметры.Параметр2 = Параметр2;
КонецЕсли;
ТабличныйДокумент.Вывести(ОбластьВывода);
В платформе 1С:Предприятие 8 макет отвечает исключительно за разметку и оформление, в то время как вся логика вычислений и проверки условий должна располагаться в запросах или коде модулей.