Как правильно задать выражение для параметров макета во внешней обработке 1С?

Программист 1С v8.3 (Обычные формы)
← На главную

При разработке внешних печатных форм и обработок в системе 1С:Предприятие, особенно в таких «классических» конфигурациях, как УПП (Управление производственным предприятием), разработчики часто сталкиваются с вопросом: как правильно передать данные из кода в ячейки макета? Многие новички ожидают увидеть поведение, схожее с Microsoft Excel, где формулы можно прописывать прямо в ячейках. Однако в 1С логика разделена: макет отвечает за визуальное представление, а программный модуль — за вычисления.

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

Разбираемся со свойствами заполнения ячеек

Для начала проанализируем, как 1С интерпретирует содержимое ячеек макета. Если мы откроем свойства любой ячейки в редакторе макета, мы увидим категорию «Заполнение». Рассмотрим три доступных варианта, которые определяют поведение системы при выводе области:

  1. Текст: Это статичное значение. Что вы напишете в ячейке, то и увидит пользователь. Никакие программные изменения здесь невозможны.
  2. Параметр: В этом режиме содержимое ячейки (например, ЦенаТовара) становится именем переменной, к которой можно обратиться из кода через коллекцию Параметры. Это основной способ вывода динамических данных.
  3. Шаблон: Это комбинированный режим. Он позволяет смешивать фиксированный текст и вставки параметров. Например, строка «Итого к оплате: [СуммаИтого] руб.» позволит заменить только часть внутри квадратных скобок, сохранив текст вокруг.

Рассмотрим подробнее, как работать с параметрами в программном коде.

Программное заполнение параметров макета

Чтобы вывести данные в макет, нам сначала нужно получить область из этого макета, заполнить её параметры и только потом вывести в итоговый табличный документ. Проанализируем типичный алгоритм действий:


// 1. Получаем макет из объекта обработки
Макет = ПолучитьМакет("МакетПечати");

// 2. Получаем конкретную область (например, строку таблицы)
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");

// 3. Заполняем параметры области
ОбластьСтрока.Параметры.Номенклатура = Выборка.Номенклатура;
ОбластьСтрока.Параметры.Количество = Выборка.Количество;

// 4. Выводим область в результирующий табличный документ
ТабДок.Вывести(ОбластьСтрока);

Важно помнить: нельзя обращаться к Область.Параметры, пока область не была получена методом ПолучитьОбласть(). Параметры живут в контексте конкретной копии области, подготовленной к печати.

Выполнение математических вычислений

Выясним причину, по которой многие пытаются написать формулы прямо в макете. В Excel мы привыкли к =A1+B1. В 1С такой механизм отсутствует в самом табличном документе. Все вычисления должны быть произведены в коде до момента присвоения значения параметру.

Рассмотрим пример, когда нам нужно вычислить сумму с учетом скидки или налога прямо перед выводом:


// Предположим, у нас есть данные из запроса или реквизитов
ЦенаБезНДС = 1500;
СтавкаНДС = 0.20; // 20%

// Выполняем математические операции в коде
СуммаНДС = ЦенаБезНДС * СтавкаНДС;
ИтоговаяЦена = ЦенаБезНДС + СуммаНДС;

// Передаем готовый результат в параметр макета
Область.Параметры.Цена = ИтоговаяЦена;
Область.Параметры.ТекДата = ТекущаяДата();

Если вам нужно сложить два реквизита документа, это выглядит аналогично:


Область.Параметры.ВсегоНа Складе = Объект.Склад1_Остаток + Объект.Склад2_Остаток;

Где брать данные: Реквизиты и Запросы

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

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

Посмотрим на пример работы с выборкой из запроса:


Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Номенклатура, Количество, Цена ИЗ Документ.РеализацияТоваровУслуг.Товары ГДЕ Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", СсылкаНаДокумент);

Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();

Пока Выборка.Следующий() Цикл
    Область = Макет.ПолучитьОбласть("Строка");
    // Прямое присваивание из выборки
    Область.Параметры.Товар = Выборка.Номенклатура;
    // Вычисление «на лету»
    Область.Параметры.Сумма = Выборка.Количество * Выборка.Цена;
    ТабДок.Вывести(Область);
КонецЦикла;

Особенности отладки в УПП (Обычное приложение)

В теме форума прозвучала жалоба на отсутствие отладчика в УПП. Выясним, почему это возникает и как это обойти. УПП чаще всего работает в режиме обычного приложения. Если внешняя печатная форма или обработка зарегистрирована в справочнике «Внешние обработки», то при её запуске 1С создает временный файл, и отладчик «теряет» связь с вашим исходным .epf файлом.

Рассмотрим шаги для успешной отладки:

Если же логика завязана на передачу параметров из документа (как в печатных формах), создайте в модуле обработки небольшую процедуру, которая будет эмулировать заполнение реквизита СсылкаНаОбъект тестовым документом, чтобы вы могли запускать её просто нажатием кнопки на форме.

Форматирование и Расшифровка

Мало просто вычислить значение, его нужно красиво представить. Проанализируем ситуацию: если мы просто передадим число 1250.5, в макете оно может выглядеть неопрятно. Используем функцию Формат():

Область.Параметры.Сумма = Формат(ВычисленнаяСумма, "ЧДЦ=2; ЧГ=3,0"); — это выведет число с двумя знаками после запятой и разделителем групп разрядов.

Также стоит упомянуть свойство «Расшифровка». В свойствах ячейки макета можно указать параметр расшифровки (например, ТоварРасшифровка). В коде это заполняется так:


Область.Параметры.Товар = Выборка.Номенклатура.Наименование; // В ячейку пишем текст
Область.Параметры.ТоварРасшифровка = Выборка.Номенклатура;   // В расшифровку кладем ссылку

Благодаря этому при двойном клике на наименовании в печатной форме у пользователя откроется карточка номенклатуры.

Подведем итог: для корректной работы с параметрами макета во внешней обработке необходимо четко разделять этап подготовки данных и этап их вывода. Все математические вычисления выполняются в коде, после чего результаты присваиваются свойствам коллекции Параметры полученной области макета. В УПП используйте прямой запуск файла через «Файл — Открыть» для полноценного использования отладчика.

← На главную