При разработке прикладных решений на платформе 1С:Предприятие 7.7 разработчики часто сталкиваются с задачей отображения промежуточных расчетов в отдельном окне. Например, после выполнения набора функций основной обработки требуется открыть вспомогательный диалог, передать в него вычисленные значения и отобразить их в статическом элементе интерфейса. Разберем особенности архитектуры диалогов в версии 7.7, способы передачи параметров между формами и варианты вывода текстовой информации.
В отличие от объектных языков программирования или более поздних версий платформы 1С, в 1С 7.7 действует жесткое архитектурное правило: один объект конфигурации (обработка или отчет) может содержать только один диалог. В рамках одного модуля обработки невозможно просто нарисовать второе окно и вызвать команду его показа. Для реализации интерфейса с выводом результата у разработчика есть два основных пути:
.ert. Первая обработка открывает вторую с помощью функции ОткрытьФорму() или ОткрытьФормуМодально(), передавая параметры через контекст.Рассмотрим классический вариант, когда для отображения результатов создается вторая обработка. Поскольку процедура открытия принимает единичный параметр, для передачи набора вычисленных значений удобно упаковать их в агрегатный объект СписокЗначений.
Проанализируем вызов из основной обработки. Если вспомогательная обработка добавлена в дерево метаданных конфигурации под именем ФормаРезультатов, код кнопки выполнения выглядит следующим образом:
Процедура ВыполнитьИПоказать()
// Выполняем требуемые расчеты
Рез1 = ВычислитьИтог();
Рез2 = ПолучитьОписание();
// Упаковываем данные для передачи
Парам = СоздатьОбъект("СписокЗначений");
Парам.Установить("СуммаИтого", Рез1);
Парам.Установить("ТекстИнфо", Рез2);
// Открываем форму обработки из метаданных
ОткрытьФорму("Обработка.ФормаРезультатов", Парам);
КонецПроцедуры
Если же вспомогательный диалог сохранен во внешнем файле (например, в подкаталоге базы ExtForms), синтаксис имеет важную особенность. Для внешних файлов в качестве первого аргумента платформы всегда указывается строковый литерал "Отчет", даже если файл по своей сути является обработкой:
ПутьКФайлу = КаталогИБ() + "ExtForms\Результаты.ert";
ОткрытьФорму("Отчет", Парам, ПутьКФайлу);
При немодальном вызове переданная переменная Парам после открытия перезаписывается контекстом открытой формы. Это дает возможность обращаться к экспортным процедурам и функциям вызванного окна непосредственно из модуля первой формы.
Разберем, как принять переданные значения во второй форме. В диалоге 1С 7.7 элемент управления «Текст» является статической надписью и не привязывается к переменной ввода напрямую, как обычное поле редактирования. Отобразить в нем динамические данные можно двумя путями.
Вариант А: Использование идентификатора элемента и метода Заголовок(). В свойствах элемента «Текст» на форме указываем идентификатор, например ПолеТекст. В модуле открываемой формы данные перехватываются в предопределенной процедуре ПриОткрытии() через свойство Форма.Параметр:
Процедура ПриОткрытии()
Если ПустоеЗначение(Форма.Параметр) = 0 Тогда
// Проверяем тип и извлекаем значение
Если ТипЗначенияСтр(Форма.Параметр) = "СписокЗначений" Тогда
СтрокаВывода = Форма.Параметр.Получить("ТекстИнфо");
Иначе
СтрокаВывода = Строка(Форма.Параметр);
КонецЕсли;
// Устанавливаем текст на элементе диалога
Форма.ПолеТекст.Заголовок(СтрокаВывода);
КонецЕсли;
КонецПроцедуры
Вариант Б: Вывод через формулу элемента. В свойствах элемента «Текст» поле «Идентификатор» оставляем пустым, а в поле «Формула» пишем имя глобальной переменной модуля формы, например ТекстРезультата. В самом начале модуля формы объявляем эту переменную, а при открытии присваиваем ей значение:
Перем ТекстРезультата;
Процедура ПриОткрытии()
Если ПустоеЗначение(Форма.Параметр) = 0 Тогда
ТекстРезультата = Форма.Параметр.Получить("ТекстИнфо");
// При необходимости принудительно перерисовываем элементы
Форма.Обновить();
КонецЕсли;
КонецПроцедуры
Если задача заключается лишь в смене рабочей области без открытия дополнительных окон операционной системы, целесообразно использовать слои. В редакторе диалога 1С 7.7 элементы можно разнести по разным слоям (например, слой Параметры и слой Результат).
Посмотрим на пример переключения слоев по нажатию кнопки в модуле этой же обработки:
Процедура ПоказатьРезультат()
// Выполняем функции расчета
ТекстРезультата = ПолучитьСводныеДанные();
// Переключаем видимый слой диалога
Форма.ИспользоватьСлой("Результат", 1);
Форма.Обновить();
КонецПроцедуры
Такой подход избавляет от необходимости плодить внешние файлы и хранить структуру данных в нескольких модулях конфигурации.
Нередко при обработке данных (например, при проведении чека или запуске длительных вычислений) требуется исключить повторное срабатывание кнопки пользователем. Для этого управляют свойством Доступность соответствующего элемента диалога.
Разберем типовой пример отключения кнопки:
Функция ВыполнитьДействие()
// Отключаем доступность кнопки для предотвращения двойного клика
Форма.КнопкаВыполнить.Доступность(0);
// Вызов основной бизнес-логики
СтатусОперации = ПровестиОперацию();
Возврат 1;
КонецФункции
Если же требуется не просто заблокировать элемент визуально, а при повторном клике выводить пользователю предупреждение «Повторное выполнение функции запрещено», используют флаг состояния в переменной модуля:
Перем ФлагВыполнения;
Функция НажатиеКнопки()
Если ФлагВыполнения = 1 Тогда
Предупреждение("Повторное выполнение функции запрещено!");
Возврат 0;
КонецЕсли;
ФлагВыполнения = 1;
// Выполнение алгоритма
Возврат 1;
КонецФункции
Процедура ПриОткрытии()
ФлагВыполнения = 0;
КонецПроцедуры
Таким образом, для реализации диалоговых окон в 1С 7.7 достаточно выбрать подходящий архитектурный вариант: отдельную внешнюю обработку с передачей параметров через Форма.Параметр или распределение элементов по слоям текущего диалога с управлением их доступностью.