При разработке простых обработок и печатных форм начинающие разработчики часто сталкиваются с задачей: необходимо не просто рассчитать результат вычисления, но и красиво вывести полное математическое выражение (например, вида 3 * 3 / 3 = 3) в табличный документ. Разберем по шагам, как правильно настроить макет, заполнить параметры и отобразить печатную форму пользователю, а также проанализируем типичные ошибки при работе с элементами управления формы.
Посмотрим на исходный код обработчика нажатия кнопки расчета. В нем присутствуют две распространенные проблемы, которые важно устранить до формирования печатной формы:
Кнопка1Нажатие(Элемент) системная переменная Отказ отсутствует. Присвоение Отказ = Истина ни к чему не приведет, и выполнение кода продолжилось бы, если бы не ветка Иначе. Если требуется прервать выполнение процедуры, необходимо использовать оператор Возврат.ЭлементыФормы.ПолеВвода.Значение не гарантирует правильный числовой тип, если в свойствах полей не настроена строгая типизация. Надежнее создать у обработки реквизиты с типом Число, связать их с полями ввода через свойство «Данные» и обращаться непосредственно к реквизитам.Скорректируем логику проверки деления на ноль и расчета:
Процедура Кнопка1Нажатие(Элемент)
Если ПолеВвода3 = 0 Тогда
Сообщить("Делить на 0 нельзя!");
Возврат;
КонецЕсли;
РезультатРасчета = ПолеВвода1 * ПолеВвода2 / ПолеВвода3;
Надпись1 = РезультатРасчета;
КонецПроцедуры
Рассмотрим классический способ вывода информации в табличный документ. Для этого настроим макет и напишем алгоритм заполнения данных.
Разберем порядок действий в конфигураторе:
Макет).Печать.ПредставлениеУравнения.Текст на Параметр.Теперь напишем программный код формирования печатной формы. Чтобы числа в выражении выглядели аккуратно и платформа не добавляла неразрывные пробелы в триадах (например, 1 000 вместо 1000), применим функцию Формат() с параметром ЧГ=0. Если результат деления может содержать дробную часть, ограничим разрядность параметром ЧДЦ=2 или функцией Окр().
Процедура ПечатьМакета()
Если ПолеВвода3 = 0 Тогда
Сообщить("Печать невозможна: деление на ноль!");
Возврат;
КонецЕсли;
Результат = Окр(ПолеВвода1 * ПолеВвода2 / ПолеВвода3, 2);
// Формируем текстовое представление выражения
Строка1 = Формат(ПолеВвода1, "ЧГ=0");
Строка2 = Формат(ПолеВвода2, "ЧГ=0");
Строка3 = Формат(ПолеВвода3, "ЧГ=0");
СтрокаРезультат = Формат(Результат, "ЧГ=0; ЧДЦ=2");
ТекстВыражения = Строка1 + " * " + Строка2 + " / " + Строка3 + " = " + СтрокаРезультат;
// Инициализируем табличный документ и макет
ТабДокумент = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("Макет");
ОбластьПечать = Макет.ПолучитьОбласть("Печать");
// Заполняем параметр области
ОбластьПечать.Параметры.ПредставлениеУравнения = ТекстВыражения;
// Выводим заполненную область в документ и отображаем его
ТабДокумент.Вывести(ОбластьПечать);
ТабДокумент.Показать("Печать выражения");
КонецПроцедуры
Рассмотрим более удобный способ, который позволяет избежать ручной склейки строк в коде конфигурации. Платформа 1С поддерживает режим заполнения ячейки Шаблон.
Разберем по шагам, как это реализовать:
Печать выбираем нужную ячейку.Шаблон.[Число1] * [Число2] / [Число3] = [Результат].Теперь каждый параметр доступен в коде как отдельное свойство коллекции Параметры соответствующей области. Напишем код вывода:
Процедура ПечатьШаблоном()
Если ПолеВвода3 = 0 Тогда
Сообщить("Делить на 0 нельзя");
Возврат;
КонецЕсли;
ТабДокумент = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("Макет");
ОбластьПечать = Макет.ПолучитьОбласть("Печать");
// Заполняем параметры напрямую в макет
ОбластьПечать.Параметры.Число1 = Формат(ПолеВвода1, "ЧГ=0");
ОбластьПечать.Параметры.Число2 = Формат(ПолеВвода2, "ЧГ=0");
ОбластьПечать.Параметры.Число3 = Формат(ПолеВвода3, "ЧГ=0");
ОбластьПечать.Параметры.Результат = Формат(ПолеВвода1 * ПолеВвода2 / ПолеВвода3, "ЧГ=0; ЧДЦ=2");
ТабДокумент.Вывести(ОбластьПечать);
ТабДокумент.Показать("Результат расчета");
КонецПроцедуры
Платформа автоматически подставит переданные значения вместо параметров в квадратных скобках, сохранив все пробелы и знаки арифметических операций.
Посмотрим на альтернативный вариант отображения: если не требуется открывать отдельное окно для просмотра, можно разместить результат прямо на форме обработки. Для этого:
ПолеТабличногоДокумента1.Показать() очищаем табличный документ на форме и выводим область напрямую в элемент управления:
ЭлементыФормы.ПолеТабличногоДокумента1.Очистить();
ЭлементыФормы.ПолеТабличногоДокумента1.Вывести(ОбластьПечать);
Таким образом, пользователь сразу увидит сформированную печатную форму в нижней части рабочей области формы без открытия дополнительных модальных окон.