Как вывести большое текстовое сообщение пользователю в 1С и обновить данные в открытой форме

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

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

Вариант 1. Использование отдельной формы обработки

Создание специализированной формы для вывода лога или результата — один из самых гибких подходов. Это позволяет настроить размеры окна, добавить управляющие кнопки (например, «Скопировать в буфер», «Сохранить в файл» или «Очистить») и оформить внешний вид.

Рассмотрим, как передать текст в открываемую форму через параметры. В модуле основной формы вызываем открытие:


ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("Результат", ТекстСообщения);

ОткрытьФорму("Обработка.МояОбработка.Форма.ФормаРезультата", ПараметрыОткрытия, ЭтотОбъект);

В модуле открываемой формы принимаем значение при инициализации:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Если Параметры.Свойство("Результат") Тогда
        РеквизитТекст = Параметры.Результат;
    КонецЕсли;
КонецПроцедуры

Как решить проблему обновления данных при повторном открытии формы

Если пользователь выполняет обработку повторно, не закрывая окно с предыдущим результатом, метод ОткрытьФорму по умолчанию находит уже существующий экземпляр окна и активизирует его. При этом серверный обработчик ПриСозданииНаСервере повторно не вызывается, из-за чего на экране остаются старые данные.

Проанализируем доступные способы решения этой проблемы:

  1. Обработка события ПриПовторномОткрытии на клиенте.

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

    
    &НаКлиенте
    Процедура ПриПовторномОткрытии(СтандартнаяОбработка, Параметры)
        Если Параметры <> Неопределено И Параметры.Свойство("Результат") Тогда
            РеквизитТекст = Параметры.Результат;
        КонецЕсли;
    КонецПроцедуры
    
  2. Использование уникальности окна.

    Если требуется, чтобы каждый запуск обработки создавал отдельное новое окно, в параметре Уникальность метода ОткрытьФорму передаем значение Истина или новый уникальный идентификатор (GUID):

    
    ОткрытьФорму("Обработка.МояОбработка.Форма.ФормаРезультата", ПараметрыОткрытия, ЭтотОбъект, Истина);
    

    В этом случае платформа каждый раз инициализирует форму заново с вызовом ПриСозданииНаСервере.

  3. Механизм глобальных оповещений.

    Если окно уже может быть открыто, из основной формы можно отправить оповещение с новым текстом:

    Оповестить("ОбновитьЛогОбработки", НовыйТекстРезультата);

    Во второй форме перехватываем это событие через обработчик ОбработкаОповещения:

    
    &НаКлиенте
    Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
        Если ИмяСобытия = "ОбновитьЛогОбработки" Тогда
            РеквизитТекст = Параметр;
        КонецЕсли;
    КонецПроцедуры
    

Вариант 2. Быстрый вывод через объект «ТекстовыйДокумент»

Если создавать отдельную форму в метаданных не требуется, можно воспользоваться встроенным объектом ТекстовыйДокумент. Он отображает текст в отдельном стандартном окне платформы с поддержкой поиска, выделения и копирования строк.

Посмотрим на пример кода на клиенте:


ТекстДок = Новый ТекстовыйДокумент;
ТекстДок.УстановитьТекст(БольшойТекст);
ТекстДок.ТолькоПросмотр = Истина;
ТекстДок.Показать("Результат выполнения обработки");

Вариант 3. Использование табличного документа

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


ТабДок = Новый ТабличныйДокумент;
// Заполнение табличного документа данными или макетом
// ...
ТабДок.ТолькоПросмотр = Истина;
ТабДок.ОтображатьСетку = Ложь;
ТабДок.Показать("Протокол обработки");

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

Вариант 4. Вывод на отдельную страницу текущей формы или в HTML-поле

Разберем еще два удобных интерфейсных решения:

  1. Группа страниц на форме. На форму обработки добавляется группа элементов с видом Страницы. На первой вкладке располагаются основные параметры запуска, а на второй — поле многострочного текста. После завершения выполнения алгоритма обработка программно переключает текущую страницу на вкладку с логом.
  2. Поле HTML-документа. Если результат необходимо оформить стилями CSS, цветными индикаторами ошибок, ссылками на объекты информационной базы или табличной версткой, на форму помещается элемент управления с типом ПолеHTMLДокумента. Это дает максимальную гибкость в форматировании выводимой информации.
← На главную