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

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

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

Почему в 1С 8.3 нельзя писать выражения в ячейках?

Разберем первопричину. В платформе 1С 8 реализован принцип разделения данных и представления (близкий к концепции MVC). Макет (объект ТабличныйДокумент) теперь отвечает только за визуальное оформление, а вся логика расчетов должна находиться в программных модулях. Это сделано по нескольким причинам:

  1. Производительность: Интерпретация кода внутри каждой ячейки при выводе больших отчетов сильно замедляла процесс формирования.
  2. Безопасность и отладка: Код в макетах невозможно эффективно отлаживать через стек вызовов. Вынесение логики в модули позволяет использовать все инструменты конфигуратора.
  3. Унификация: Программный модуль жестко управляет коллекцией Параметры, что делает структуру документа предсказуемой.

Использование типа заполнения «Шаблон»

Рассмотрим ситуацию, когда нам нужно вывести не просто значение переменной, а комбинированную строку, например: "Счет № [Номер] от [Дата]". Вместо того чтобы склеивать строки в коде, мы можем использовать свойство ячейки Заполнение — Шаблон.

В режиме шаблона текст в квадратных скобках воспринимается системой как параметр, а текст снаружи — как статика. Проанализируем, как это работает программно:


Область = Макет.ПолучитьОбласть("Заголовок");
Область.Параметры.Номер = Объект.Номер;
Область.Параметры.Дата = Формат(Объект.Дата, "ДЛФ=Д");
ТабДок.Вывести(Область);

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

Решение проблемы через внешние печатные формы (ВПФ)

Часто возникает задача: нужно изменить логику печати в типовой конфигурации (например, в 1С:Бухгалтерии или ERP), не снимая объект с поддержки. Это особенно критично для сервиса 1C:Fresh, где прямое изменение кода конфигурации невозможно.

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

  1. Создаем новую внешнюю обработку.
  2. Добавляем в нее макет, скопированный из типовой конфигурации.
  3. В модуле объекта реализуем экспортную функцию Печать().
  4. Внутри функции мы можем реализовать любую логику: Если Клиент.ЭтоВажныйУзел Тогда... и выводить соответствующие области макета.

Преимущество этого метода в том, что он проходит аудит 1С, так как использует стандартные механизмы расширения функциональности без изменения ядра системы.

Применение Расширений конфигурации

Если задача стоит шире, чем просто одна печатная форма, проанализируем использование Расширений. В расширение можно перенести только конкретный макет документа. Платформа позволяет подменить стандартный макет своим, при этом программный код в модуле объекта (если он обращается к параметрам через ЗаполнитьЗначенияСвойств) продолжит работать.

Если же нам нужно добавить условие, которого нет в типовом коде, мы используем механизм &После или &Вместо для процедуры печати в модуле менеджера или объекта. Это позволяет внедрить свою логику обработки данных перед тем, как они попадут в макет.

Логика «Выбор когда» в Системе компоновки данных (СКД)

Если ваша печатная форма строится на базе СКД (что становится стандартом для многих новых отчетов), то задача с выражениями решается максимально просто. В СКД есть вкладка Вычисляемые поля.

Посмотрим на пример выражения, которое можно написать в поле "Выражение" настроек СКД:


ВЫБОР 
    КОГДА Сумма > 100000 
    ТОГДА "VIP Клиент: " + Строка(Менеджер)
    ИНАЧЕ "Рядовой заказ"
КОНЕЦ

Это наиболее близкий аналог "формул", к которым привыкли пользователи Excel или 1С 7.7. СКД сама вычислит результат и подставит его в нужную ячейку при компоновке результата.

Программное управление оформлением (Условное оформление)

Иногда выражение в макете нужно не для вывода текста, а для изменения оформления (например, выделить долг красным цветом). В 1С 8.3 для этого используется коллекция Область.ЦветТекста или программное применение стилей.

Разберем пример кода, который динамически меняет оформление ячейки в зависимости от значения:


ОбластьДанные = Макет.ПолучитьОбласть("Строка");
ОбластьДанные.Параметры.Заполнить(ТекущаяСтрока);

Если ТекущаяСтрока.Сумма < 0 Тогда
    ОбластьДанные.Область("R1C5").ЦветТекста = WebЦвета.Красный;
    ОбластьДанные.Область("R1C5").Шрифт = Новый Шрифт(ОбластьДанные.Область("R1C5").Шрифт, , , Истина);
КонецЕсли;

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

Здесь мы видим четкое разделение: макет задает базовый вид, а программный модуль управляет деталями на основе бизнес-логики.

Выводы и рекомендации

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

Такой подход гарантирует, что ваш код будет легко читаемым, производительным и пройдет любой технический аудит.

← На главную