При разработке обработок часто возникает необходимость показать пользователю большой объем информации: протокол выполнения операции, лог загрузки данных, детальный результат расчета или длинное служебное уведомление. Размещение многострочного текстового поля на основной форме перегружает интерфейс. Разберем практические способы отображения объемных текстов, а также выясним, как правильно обновлять данные, если окно с результатом уже открыто на экране.
Создание специализированной формы для вывода лога или результата — один из самых гибких подходов. Это позволяет настроить размеры окна, добавить управляющие кнопки (например, «Скопировать в буфер», «Сохранить в файл» или «Очистить») и оформить внешний вид.
Рассмотрим, как передать текст в открываемую форму через параметры. В модуле основной формы вызываем открытие:
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("Результат", ТекстСообщения);
ОткрытьФорму("Обработка.МояОбработка.Форма.ФормаРезультата", ПараметрыОткрытия, ЭтотОбъект);
В модуле открываемой формы принимаем значение при инициализации:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("Результат") Тогда
РеквизитТекст = Параметры.Результат;
КонецЕсли;
КонецПроцедуры
Если пользователь выполняет обработку повторно, не закрывая окно с предыдущим результатом, метод ОткрытьФорму по умолчанию находит уже существующий экземпляр окна и активизирует его. При этом серверный обработчик ПриСозданииНаСервере повторно не вызывается, из-за чего на экране остаются старые данные.
Проанализируем доступные способы решения этой проблемы:
ПриПовторномОткрытии на клиенте.
Когда платформа обнаруживает уже открытую форму, она вызывает событие ПриПовторномОткрытии. Переданные параметры попадают во второй аргумент этой процедуры. Обратите внимание: обращаться нужно к входящему параметру процедуры, а не к системному свойству Параметры самой формы.
&НаКлиенте
Процедура ПриПовторномОткрытии(СтандартнаяОбработка, Параметры)
Если Параметры <> Неопределено И Параметры.Свойство("Результат") Тогда
РеквизитТекст = Параметры.Результат;
КонецЕсли;
КонецПроцедуры
Если требуется, чтобы каждый запуск обработки создавал отдельное новое окно, в параметре Уникальность метода ОткрытьФорму передаем значение Истина или новый уникальный идентификатор (GUID):
ОткрытьФорму("Обработка.МояОбработка.Форма.ФормаРезультата", ПараметрыОткрытия, ЭтотОбъект, Истина);
В этом случае платформа каждый раз инициализирует форму заново с вызовом ПриСозданииНаСервере.
Если окно уже может быть открыто, из основной формы можно отправить оповещение с новым текстом:
Оповестить("ОбновитьЛогОбработки", НовыйТекстРезультата);
Во второй форме перехватываем это событие через обработчик ОбработкаОповещения:
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
Если ИмяСобытия = "ОбновитьЛогОбработки" Тогда
РеквизитТекст = Параметр;
КонецЕсли;
КонецПроцедуры
Если создавать отдельную форму в метаданных не требуется, можно воспользоваться встроенным объектом ТекстовыйДокумент. Он отображает текст в отдельном стандартном окне платформы с поддержкой поиска, выделения и копирования строк.
Посмотрим на пример кода на клиенте:
ТекстДок = Новый ТекстовыйДокумент;
ТекстДок.УстановитьТекст(БольшойТекст);
ТекстДок.ТолькоПросмотр = Истина;
ТекстДок.Показать("Результат выполнения обработки");
Для вывода форматированного текста, таблиц или структурированных логов с цветовым выделением статусов отлично подходит ТабличныйДокумент. Его также можно открыть без разработки специальных экранных форм с помощью метода Показать():
ТабДок = Новый ТабличныйДокумент;
// Заполнение табличного документа данными или макетом
// ...
ТабДок.ТолькоПросмотр = Истина;
ТабДок.ОтображатьСетку = Ложь;
ТабДок.Показать("Протокол обработки");
В типовых конфигурациях на базе БСП для подобных задач также часто применяется общая форма печати (например, ПечатьДокументов или ФормаПечати), куда передается подготовленный табличный документ.
Разберем еще два удобных интерфейсных решения:
Страницы. На первой вкладке располагаются основные параметры запуска, а на второй — поле многострочного текста. После завершения выполнения алгоритма обработка программно переключает текущую страницу на вкладку с логом.ПолеHTMLДокумента. Это дает максимальную гибкость в форматировании выводимой информации.