При разработке внешних печатных форм и обработок в системе 1С:Предприятие, особенно в таких «классических» конфигурациях, как УПП (Управление производственным предприятием), разработчики часто сталкиваются с вопросом: как правильно передать данные из кода в ячейки макета? Многие новички ожидают увидеть поведение, схожее с Microsoft Excel, где формулы можно прописывать прямо в ячейках. Однако в 1С логика разделена: макет отвечает за визуальное представление, а программный модуль — за вычисления.
В этой статье мы подробно разберем, как работать с параметрами макета, выполнять математические операции и правильно настраивать вывод данных, даже если вы работаете в среде с ограниченными возможностями отладки.
Для начала проанализируем, как 1С интерпретирует содержимое ячеек макета. Если мы откроем свойства любой ячейки в редакторе макета, мы увидим категорию «Заполнение». Рассмотрим три доступных варианта, которые определяют поведение системы при выводе области:
ЦенаТовара) становится именем переменной, к которой можно обратиться из кода через коллекцию Параметры. Это основной способ вывода динамических данных.«Итого к оплате: [СуммаИтого] руб.» позволит заменить только часть внутри квадратных скобок, сохранив текст вокруг.Рассмотрим подробнее, как работать с параметрами в программном коде.
Чтобы вывести данные в макет, нам сначала нужно получить область из этого макета, заполнить её параметры и только потом вывести в итоговый табличный документ. Проанализируем типичный алгоритм действий:
// 1. Получаем макет из объекта обработки
Макет = ПолучитьМакет("МакетПечати");
// 2. Получаем конкретную область (например, строку таблицы)
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
// 3. Заполняем параметры области
ОбластьСтрока.Параметры.Номенклатура = Выборка.Номенклатура;
ОбластьСтрока.Параметры.Количество = Выборка.Количество;
// 4. Выводим область в результирующий табличный документ
ТабДок.Вывести(ОбластьСтрока);
Важно помнить: нельзя обращаться к Область.Параметры, пока область не была получена методом ПолучитьОбласть(). Параметры живут в контексте конкретной копии области, подготовленной к печати.
Выясним причину, по которой многие пытаются написать формулы прямо в макете. В Excel мы привыкли к =A1+B1. В 1С такой механизм отсутствует в самом табличном документе. Все вычисления должны быть произведены в коде до момента присвоения значения параметру.
Рассмотрим пример, когда нам нужно вычислить сумму с учетом скидки или налога прямо перед выводом:
// Предположим, у нас есть данные из запроса или реквизитов
ЦенаБезНДС = 1500;
СтавкаНДС = 0.20; // 20%
// Выполняем математические операции в коде
СуммаНДС = ЦенаБезНДС * СтавкаНДС;
ИтоговаяЦена = ЦенаБезНДС + СуммаНДС;
// Передаем готовый результат в параметр макета
Область.Параметры.Цена = ИтоговаяЦена;
Область.Параметры.ТекДата = ТекущаяДата();
Если вам нужно сложить два реквизита документа, это выглядит аналогично:
Область.Параметры.ВсегоНа Складе = Объект.Склад1_Остаток + Объект.Склад2_Остаток;
Разберем, откуда в программный модуль попадают данные для параметров. В контексте внешней обработки есть два основных пути:
СсылкаНаОбъект для печатных форм), вы обращаетесь к ним напрямую: ЭтотОбъект.СсылкаНаОбъект.Дата.Посмотрим на пример работы с выборкой из запроса:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Номенклатура, Количество, Цена ИЗ Документ.РеализацияТоваровУслуг.Товары ГДЕ Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", СсылкаНаДокумент);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Область = Макет.ПолучитьОбласть("Строка");
// Прямое присваивание из выборки
Область.Параметры.Товар = Выборка.Номенклатура;
// Вычисление «на лету»
Область.Параметры.Сумма = Выборка.Количество * Выборка.Цена;
ТабДок.Вывести(Область);
КонецЦикла;
В теме форума прозвучала жалоба на отсутствие отладчика в УПП. Выясним, почему это возникает и как это обойти. УПП чаще всего работает в режиме обычного приложения. Если внешняя печатная форма или обработка зарегистрирована в справочнике «Внешние обработки», то при её запуске 1С создает временный файл, и отладчик «теряет» связь с вашим исходным .epf файлом.
Рассмотрим шаги для успешной отладки:
.epf с диска.Если же логика завязана на передачу параметров из документа (как в печатных формах), создайте в модуле обработки небольшую процедуру, которая будет эмулировать заполнение реквизита СсылкаНаОбъект тестовым документом, чтобы вы могли запускать её просто нажатием кнопки на форме.
Мало просто вычислить значение, его нужно красиво представить. Проанализируем ситуацию: если мы просто передадим число 1250.5, в макете оно может выглядеть неопрятно. Используем функцию Формат():
Область.Параметры.Сумма = Формат(ВычисленнаяСумма, "ЧДЦ=2; ЧГ=3,0"); — это выведет число с двумя знаками после запятой и разделителем групп разрядов.
Также стоит упомянуть свойство «Расшифровка». В свойствах ячейки макета можно указать параметр расшифровки (например, ТоварРасшифровка). В коде это заполняется так:
Область.Параметры.Товар = Выборка.Номенклатура.Наименование; // В ячейку пишем текст
Область.Параметры.ТоварРасшифровка = Выборка.Номенклатура; // В расшифровку кладем ссылку
Благодаря этому при двойном клике на наименовании в печатной форме у пользователя откроется карточка номенклатуры.
Подведем итог: для корректной работы с параметрами макета во внешней обработке необходимо четко разделять этап подготовки данных и этап их вывода. Все математические вычисления выполняются в коде, после чего результаты присваиваются свойствам коллекции Параметры полученной области макета. В УПП используйте прямой запуск файла через «Файл — Открыть» для полноценного использования отладчика.