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