Переход с платформы 1С:Предприятие 7.7 на версию 8.х принес множество архитектурных изменений. Одно из наиболее заметных для разработчиков — это изменение логики работы с макетами табличных документов. Если в "семерке" мы могли написать произвольное выражение или вызвать функцию прямо в ячейке макета, то в 1С 8.3 макет стал "немым" представлением данных. В этой статье мы разберем, почему так произошло, и проанализируем все доступные способы реализации сложной логики в печатных формах.
Разберем первопричину. В платформе 1С 8 реализован принцип разделения данных и представления (близкий к концепции MVC). Макет (объект ТабличныйДокумент) теперь отвечает только за визуальное оформление, а вся логика расчетов должна находиться в программных модулях. Это сделано по нескольким причинам:
Параметры, что делает структуру документа предсказуемой.Рассмотрим ситуацию, когда нам нужно вывести не просто значение переменной, а комбинированную строку, например: "Счет № [Номер] от [Дата]". Вместо того чтобы склеивать строки в коде, мы можем использовать свойство ячейки Заполнение — Шаблон.
В режиме шаблона текст в квадратных скобках воспринимается системой как параметр, а текст снаружи — как статика. Проанализируем, как это работает программно:
Область = Макет.ПолучитьОбласть("Заголовок");
Область.Параметры.Номер = Объект.Номер;
Область.Параметры.Дата = Формат(Объект.Дата, "ДЛФ=Д");
ТабДок.Вывести(Область);
Это частичная замена выражениям, которая позволяет упростить верстку макета, не перегружая код операциями конкатенации строк.
Часто возникает задача: нужно изменить логику печати в типовой конфигурации (например, в 1С:Бухгалтерии или ERP), не снимая объект с поддержки. Это особенно критично для сервиса 1C:Fresh, где прямое изменение кода конфигурации невозможно.
Выясним, как правильно реализовать это через механизм дополнительных отчетов и обработок. Вместо того чтобы пытаться "впихнуть" условие в макет, мы создаем внешнюю обработку, которая полностью берет на себя формирование печатной формы. Рассмотрим пошаговый алгоритм:
Печать().Если Клиент.ЭтоВажныйУзел Тогда... и выводить соответствующие области макета.Преимущество этого метода в том, что он проходит аудит 1С, так как использует стандартные механизмы расширения функциональности без изменения ядра системы.
Если задача стоит шире, чем просто одна печатная форма, проанализируем использование Расширений. В расширение можно перенести только конкретный макет документа. Платформа позволяет подменить стандартный макет своим, при этом программный код в модуле объекта (если он обращается к параметрам через ЗаполнитьЗначенияСвойств) продолжит работать.
Если же нам нужно добавить условие, которого нет в типовом коде, мы используем механизм &После или &Вместо для процедуры печати в модуле менеджера или объекта. Это позволяет внедрить свою логику обработки данных перед тем, как они попадут в макет.
Если ваша печатная форма строится на базе СКД (что становится стандартом для многих новых отчетов), то задача с выражениями решается максимально просто. В СКД есть вкладка Вычисляемые поля.
Посмотрим на пример выражения, которое можно написать в поле "Выражение" настроек СКД:
ВЫБОР
КОГДА Сумма > 100000
ТОГДА "VIP Клиент: " + Строка(Менеджер)
ИНАЧЕ "Рядовой заказ"
КОНЕЦ
Это наиболее близкий аналог "формул", к которым привыкли пользователи Excel или 1С 7.7. СКД сама вычислит результат и подставит его в нужную ячейку при компоновке результата.
Иногда выражение в макете нужно не для вывода текста, а для изменения оформления (например, выделить долг красным цветом). В 1С 8.3 для этого используется коллекция Область.ЦветТекста или программное применение стилей.
Разберем пример кода, который динамически меняет оформление ячейки в зависимости от значения:
ОбластьДанные = Макет.ПолучитьОбласть("Строка");
ОбластьДанные.Параметры.Заполнить(ТекущаяСтрока);
Если ТекущаяСтрока.Сумма < 0 Тогда
ОбластьДанные.Область("R1C5").ЦветТекста = WebЦвета.Красный;
ОбластьДанные.Область("R1C5").Шрифт = Новый Шрифт(ОбластьДанные.Область("R1C5").Шрифт, , , Истина);
КонецЕсли;
ТабДок.Вывести(ОбластьДанные);
Здесь мы видим четкое разделение: макет задает базовый вид, а программный модуль управляет деталями на основе бизнес-логики.
Подводя итог, можно сказать, что отсутствие выражений в ячейках ТабличногоДокумента — это не ограничение, а архитектурное решение для повышения стабильности системы. Для реализации условий в печатных формах рекомендуем:
Если...Тогда, циклы, запросы) всегда оставлять в программном модуле, передавая в макет только готовый результат через Параметры.Такой подход гарантирует, что ваш код будет легко читаемым, производительным и пройдет любой технический аудит.