Можно ли вычислять формулы внутри шаблона табличного документа 1С

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

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

Почему формулы не работают в ячейках с типом «Шаблон»

Выясним причину, по которой конструкция вида [розничнаясумма - сумма] не дает ожидаемого результата. В ячейках табличного документа с типом заполнения Шаблон отсутствует математический вычислитель или интерпретатор выражений (в отличие от ячеек в Microsoft Excel или таблиц 1С 7.7).

Любая подстрока, заключенная в квадратные скобки [...], воспринимается платформой исключительно как единый строковый идентификатор параметра. Знаки арифметических операций (плюс, минус, умножение, деление) и пробелы не распознаются как команды вычисления. Платформа пытается найти в процедуре печати параметр со строгим именем "розничнаясумма - сумма". Так как разработчики такой параметр не объявляли, ячейка остается пустой.

Если написать параметры раздельно, например [розничнаясумма] - [сумма], платформа подставит значения каждого параметра отдельно через дефис, и в печатной форме получится обычная текстовая строка: 1000 - 600.

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

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

Разберем по шагам порядок действий:

  1. В макете табличного документа выделяем ячейку, открываем ее свойства и указываем тип заполнения Параметр (либо Шаблон с указанием имени, например [Разница]).
  2. Задаем имя параметра, например Разница.
  3. В модуле формирования печатной формы выполняем математическое действие перед выводом области в результирующий табличный документ:

ОбластьСтрока.Параметры.Разница = ДанныеСтроки.РозничнаяСумма - ДанныеСтроки.Сумма;
ТабличныйДокумент.Вывести(ОбластьСтрока);

Способ 2. Использование расширения конфигурации

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

  1. Создаем новое расширение с назначением Адаптация или Дополнение.
  2. Добавляем в расширение документ, его макет печатной формы и модуль менеджера.
  3. В заимствованном макете добавляем новую колонку и прописываем параметр для наценки или разницы сумм.
  4. В модуле менеджера с помощью директивы &Вместо или &ИзменениеИКонтроль переопределяем процедуру печати, добавляя расчет значения перед выводом строки.

При таком подходе типовая конфигурация поставщика остается на полной поддержке и обновляется в штатном режиме без конфликтов.

Способ 3. Создание внешней печатной формы (ВПФ)

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

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

Способ 4. Постобработка сформированного табличного документа

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

  1. Вызываем типовую процедуру формирования печатной формы и получаем готовый ТабличныйДокумент.
  2. Определяем номера колонок, в которых выводятся розничная сумма и базовая сумма.
  3. Проходим в цикле по строкам таблицы, считываем числовые значения из колонок с суммами, производим расчет и записываем результат в ячейку колонки наценки:

Для НомерСтроки = НомерПервойСтроки По НомерПоследнейСтроки Цикл
    ЯчейкаРозничная = ТабДок.Область(НомерСтроки, КолонкаРозничная);
    ЯчейкаБазовая = ТабДок.Область(НомерСтроки, КолонкаБазовая);
    
    // Получаем числовые значения и записываем разницу
    Разница = ЯчейкаРозничная.Значение - ЯчейкаБазовая.Значение;
    ТабДок.Область(НомерСтроки, КолонкаНаценка).Текст = Формат(Разница, "ЧДЦ=2");
КонецЦикла;

Этот способ позволяет не переписывать сложный типовой запрос выборки данных печатной формы, а лишь дополнить готовый отчет вычисляемыми полями.

← На главную