Переключить два своих старых интерфейса и восстановить их

Учебные задачи

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

Где и как запускать

Полный модуль обычной формы собственной учебной EPF; толстый клиент Windows, именно ОбычноеПриложение.

Подготовка

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

  2. В ветке Общие → Интерфейсы создайте ровно два собственных интерфейса УчебныйОсновной и УчебныйДополнительный. Не переносите рабочие меню: добавьте только учебные меню с разными заголовками.

  3. Назначьте оба интерфейса собственному учебному пользователю по правилам своей конфигурации. В коллекции текущего сеанса должны быть ровно эти два интерфейса.

  4. Создайте учебную внешнюю обработку с обычной формой и кнопкой УчебнаяКоманда, свяжите действие с одноимённой процедурой. Вставьте полный модуль и запустите в толстом клиенте Windows 8.5.1.1343.

  5. Урок меняет только отображение собственных интерфейсов текущего приложения и возвращает их исходные флаги. Метаданные, роли, документы и регистры код не записывает.

Процедура УчебнаяКоманда(Кнопка)
    Интерфейсы = ГлавныйИнтерфейс;
    Если Интерфейсы.Количество() <> 2 Тогда
        ВызватьИсключение "Для упражнения нужны ровно два собственных интерфейса и ни одного другого";
    КонецЕсли;
    Основной = Интерфейсы.Найти("УчебныйОсновной");
    Дополнительный = Интерфейсы.Найти("УчебныйДополнительный");
    Если Основной = Неопределено Или Дополнительный = Неопределено Или Основной = Дополнительный Тогда
        ВызватьИсключение "Не найдены два собственных разных интерфейса";
    КонецЕсли;
    Исходные = Новый Структура("ВидимостьОсновного,ПереключаемыйОсновной,ВидимостьДополнительного,ПереключаемыйДополнительный",
        Основной.Видимость, Основной.Переключаемый, Дополнительный.Видимость, Дополнительный.Переключаемый);
    Попытка
        Основной.Видимость = Истина;
        Основной.Переключаемый = Ложь;
        Дополнительный.Видимость = Ложь;
        Дополнительный.Переключаемый = Истина;
        Сообщить(Интерфейсы.Получить(Интерфейсы.Индекс(Основной)) = Основной);
        Сообщить(Интерфейсы.Получить(Интерфейсы.Индекс(Дополнительный)) = Дополнительный);
        Сообщить(Основной.Видимость И НЕ Основной.Переключаемый);
        Сообщить(НЕ Дополнительный.Видимость И Дополнительный.Переключаемый);
        Интерфейсы.ПереключитьИнтерфейс("УчебныйДополнительный");
        Сообщить(Основной.Видимость);
        Сообщить(Дополнительный.Видимость);
        Сообщить("Оба своих интерфейса видимы: основной не скрыт групповым переключением");
    Исключение
        ОшибкаОперации = ОписаниеОшибки();
        Основной.Переключаемый = Исходные.ПереключаемыйОсновной;
        Дополнительный.Переключаемый = Исходные.ПереключаемыйДополнительный;
        Основной.Видимость = Исходные.ВидимостьОсновного;
        Дополнительный.Видимость = Исходные.ВидимостьДополнительного;
        ВызватьИсключение ОшибкаОперации;
    КонецПопытки;
    Основной.Переключаемый = Исходные.ПереключаемыйОсновной;
    Дополнительный.Переключаемый = Исходные.ПереключаемыйДополнительный;
    Основной.Видимость = Исходные.ВидимостьОсновного;
    Дополнительный.Видимость = Исходные.ВидимостьДополнительного;
    Сообщить(Основной.Видимость = Исходные.ВидимостьОсновного);
    Сообщить(Основной.Переключаемый = Исходные.ПереключаемыйОсновной);
    Сообщить(Дополнительный.Видимость = Исходные.ВидимостьДополнительного);
    Сообщить(Дополнительный.Переключаемый = Исходные.ПереключаемыйДополнительный);
КонецПроцедуры

Разбор по шагам

  1. Получить настоящую коллекцию ГлавныйИнтерфейс. Проверить ровно два элемента и найти свои интерфейсы по точным именам.

  2. Сохранить четыре исходных флага до первого изменения. Основной сделать видимым и непереключаемым, дополнительный скрытым и переключаемым.

  3. ПереключитьИнтерфейс принимает строку имён через запятую, не массив. Передать только своё дополнительное имя: основной остаётся видимым благодаря Переключаемый = Ложь.

  4. Проверить оба интерфейса, затем восстановить сохранённые значения при успехе и в обработке ошибки. Коллекция не очищается, интерфейсы не удаляются.

Как проверить результат

  1. Десять булевых проверок дают Истина в обычном приложении с двумя собственными интерфейсами.

  2. После команды Видимость и Переключаемый обоих интерфейсов совпадают с исходными. Промежуточный UI может не успеть перерисоваться внутри одной команды: проверяются настоящие свойства и восстановление.

Ожидаемый результат

Полный пример старого интерфейсного API с ограничением ровно своими элементами и восстановлением состояния.

На что обратить внимание

  1. Переключаемый = Ложь означает, что групповое переключение не скрывает интерфейс. Это не означает невозможность прямого изменения Видимость.

  2. В режиме УправляемоеПриложение ПереключитьИнтерфейс игнорируется по контракту платформы. Не объявляйте это багом или способом управления современным командным интерфейсом.

  3. ГлавныйИнтерфейс не имеет конструктора и методов Добавить/Удалить. Интерфейсы сначала создаются в конфигураторе, не в этом модуле.

  4. Не запускайте упражнение над рабочими интерфейсами. Видимость меню не изменяет права пользователя на данные.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.