Создать меню с действием и пройти операции коллекции

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

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

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

Полный модуль собственной обычной формы. Только толстый клиент с обычными формами; экспортные обработчики получают первым параметром инициирующий Элемент. Конструктор Действие выбирает процедуру, но не отменяет параметры события.

Подготовка

  1. Создайте отдельную внешнюю обработку с обычной формой, запускайте толстым клиентом в режиме обычных форм.

  2. Добавьте реквизит УчебноеКоличество (Число 9.0), обычную кнопку УчебнаяКнопка и элемент Надпись с именем УчебнаяНадпись. Реквизиты рабочих объектов не используются.

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

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

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

Процедура ДобавитьОднуКнигу(Элемент) Экспорт
    УчебноеКоличество = УчебноеКоличество + 1;
    ЭтаФорма.ЭлементыФормы.УчебнаяНадпись.Заголовок = "Учебных книг: " + Строка(УчебноеКоличество);
    Сообщить("Собственное количество: " + Строка(УчебноеКоличество));
КонецПроцедуры

Процедура ПоказатьКоличествоКниг(Элемент) Экспорт
    Сообщить("Проверка только собственной формы: " + Строка(УчебноеКоличество));
КонецПроцедуры

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

  1. Кнопки — readonly-ссылка на собственную коллекцию меню, но её элементы можно добавлять и удалять.

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

  3. Вставить имеет первый аргумент индекс, Добавить — имя. Разделитель не получает Действие.

  4. Сдвинуть работает с конкретным пунктом, Удалить — с проверенным индексом. Удалённый Временный далее не используется.

  5. Найти ищет внутреннее имя, не пользовательский Текст. Проверка количества предшествует Получить(0).

  6. ИзменяетДанные различает действие, меняющее собственный реквизит, и диагностику. Это не запись в базу.

  7. Проверить является действием, поэтому его дочернее меню пусто. Пометка не равна запуску команды.

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

  1. Восемь сообщений Истина при открытии; временный пункт исчезает до показа меню.

  2. В меню Добавить книга увеличивает число, Проверить своё число только сообщает его.

  3. Повторное открытие создаёт своё меню заново, рабочие команды не затронуты.

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

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

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

  1. Удалить получает индекс, не объект пункта: не путайте его со Сдвинуть.

  2. Не копируйте Очистить в чужую панель с рабочими кнопками.

  3. КнопкаПоУмолчанию и Пометка не заменяют привязку действия.

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

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

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

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

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