Как реализовать интерфейс Мастер (Wizard) в управляемых формах 1С

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

Интерфейс типа Мастер (или Wizard) — это классический прием построения пользовательского взаимодействия, при котором сложная задача разбивается на последовательность простых шагов. Каждый шаг представлен отдельной страницей с минимальным набором элементов управления. В экосистеме 1С такой подход часто называют «Помощником». Рассмотрим подробнее, как реализовать этот механизм программно и с помощью визуальных средств платформы.

Программная реализация структуры страниц

Для создания мастера нам потребуется контейнер, который будет переключать видимые области. В управляемых формах для этого идеально подходит объект ГруппаФормы с видом Страницы. Разберем пример кода, который позволяет динамически создать страницы и разместить на них элементы.

Проанализируем серверную процедуру создания интерфейса:


&НаСервере
Процедура СоздатьИнтерфейсМастера()
    // Создаем основную группу-контейнер для страниц
    ГруппаСтраниц = ЭтаФорма.Элементы.Вставить("ГруппаСтраницы", Тип("ГруппаФормы"), ЭтаФорма);
    ГруппаСтраниц.Вид = ВидГруппыФормы.Страницы;
    // Скрываем стандартные закладки, чтобы пользователь не мог переключаться произвольно
    ГруппаСтраниц.ОтображениеСтраниц = ОтображениеСтраницФормы.Нет;
    
    // Добавляем первую страницу "Товары"
    СтраницаТовары = ЭтаФорма.Элементы.Добавить("СтраницаТовары", Тип("ГруппаФормы"), ГруппаСтраниц);
    СтраницаТовары.Вид = ВидГруппыФормы.Страница;
    СтраницаТовары.Заголовок = "Шаг 1: Выбор товаров";
    
    // Добавляем вторую страницу "Дополнительно"
    СтраницаДополнительно = ЭтаФорма.Элементы.Добавить("СтраницаДополнительно", Тип("ГруппаФормы"), ГруппаСтраниц);
    СтраницаДополнительно.Вид = ВидГруппыФормы.Страница;
    СтраницаДополнительно.Заголовок = "Шаг 2: Дополнительные настройки";
    
    // Размещаем декорации или поля на страницах
    Надпись1 = Элементы.Добавить("ДекорацияШаг1", Тип("ДекорацияФормы"), СтраницаТовары);
    Надпись1.Вид = ВидДекорацииФормы.Надпись;
    Надпись1.Заголовок = "Добро пожаловать в мастер подбора товаров!";
    
    // Добавляем команду и кнопку перехода
    КомандаПерехода = ЭтаФорма.Команды.Добавить("КомандаДалее");
    КомандаПерехода.Действие = "НажатьДалее";
    КомандаПерехода.Заголовок = "Далее >>";
    
    КнопкаДалее = ЭтаФорма.Элементы.Добавить("КнопкаДалее", Тип("КнопкаФормы"), СтраницаТовары);
    КнопкаДалее.ИмяКоманды = "КомандаДалее";
КонецПроцедуры

Программное переключение страниц на клиенте

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


&НаКлиенте
Процедура НажатьДалее(Команда)
    // Устанавливаем активную страницу по ее имени в коллекции элементов
    Элементы["ГруппаСтраницы"].ТекущаяСтраница = Элементы["СтраницаДополнительно"];
КонецПроцедуры

Важный нюанс: при обращении к элементам формы напрямую (например, Элементы.ИмяЭлемента) конфигуратор может подсвечивать это как ошибку, если элемент не создан в визуальном редакторе. Использование синтаксиса Элементы["Имя"] снимает эту проблему и делает код более гибким.

Использование паттерна Помощник из Библиотеки стандартных подсистем (БСП)

Проанализируем более современный и надежный подход, который используется в типовых конфигурациях (таких как БП 3.0, УТ 11 или ERP). Вместо чисто программного создания элементов, рекомендуется проектировать форму в конфигураторе, следуя определенным правилам:

  1. Создайте основную панель Страницы и отключите у нее ОтображениеСтраниц.
  2. В нижней части формы, вне страниц, разместите стандартную командную панель с кнопками Назад, Далее и Готово.
  3. Используйте переменную состояния (реквизит формы), например НомерТекущегоШага, чтобы отслеживать прогресс пользователя.

Рассмотрим пример управления кнопками навигации:


&НаКлиенте
Процедура ОбновитьСостояниеКнопок()
    // Если мы на первом шаге, кнопка "Назад" не нужна
    Элементы.КнопкаНазад.Видимость = (НомерТекущегоШага > 1);
    
    // Если мы на последнем шаге, меняем "Далее" на "Готово"
    Если НомерТекущегоШага = ВсегоШагов Тогда
        Элементы.КнопкаДалее.Заголовок = "Готово";
    Иначе
        Элементы.КнопкаДалее.Заголовок = "Далее >";
    КонецЕсли;
КонецПроцедуры

Лучшие практики разработки мастеров в 1С

Для создания качественного пользовательского опыта проанализируем следующие рекомендации:

1. Проверка заполнения данных. Перед переходом на следующую страницу обязательно вызывайте метод ПроверитьЗаполнение(). Это предотвратит ситуацию, когда пользователь дойдет до конца мастера и только тогда узнает об ошибке на первом шаге.

2. Визуализация прогресса. Разместим в верхней части формы элемент типа Декорация (надпись или HTML-поле), который будет показывать пользователю, где он находится. Например: "Шаг 2 из 5: Выбор склада".

3. Использование временного хранилища. Если мастер предполагает работу с большими файлами или таблицами, не храните их напрямую в реквизитах формы (это замедляет контекстные вызовы). Сохраняйте данные во ВременноеХранилище, передавая между сервером и клиентом только Адрес этого хранилища.

4. Обработка закрытия. Обязательно добавьте проверку в обработчик ПередЗакрытием. Если пользователь проделал большую работу и случайно закрыл окно, предложите ему подтверждение выхода.

Посмотрим на примеры из типовых решений для вдохновения: обработка "Свёртка информационной базы" в 1С:Бухгалтерии или "Формирование заказов по потребностям" в 1С:Управлении торговлей. Эти механизмы построены именно на описанных принципах работы со страницами управляемой формы.

← На главную