Разобрать стандартную ВыделитьВсе и почему её нельзя переименовать свойствами

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

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

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

Полный модуль своей управляемой формы. Только локальные количество и сумма, собственное контекстное меню поля ввода.

Подготовка

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

  2. Код сам добавляет числовое поле количества и надпись суммы. События ПриИзменении и ОбработкаФормированияКоманд назначаются полю программно. Не добавляйте одноимённые реквизиты и элементы вручную.

  3. Откройте форму на настольном тонком или толстом клиенте 8.5.1.1343 и щёлкните правой кнопкой по полю количества. Только своя Книга: 3 шт. по 250, сумма 750.

  4. Событие ОбработкаФормированияКоманд имеет параметры ПараметрыКоманд, Команды — без дополнительного Элемент. Процедура собственного оповещения имеет один параметр ДополнительныеПараметры и должна быть Экспорт.

  5. Для второго урока добавьте в свою конфигурацию общую картинку УчебныйМаркер из lesson-assets/owned-book-marker-32.png. Для остальных уроков этот ресурс не нужен.

  6. Никакие товары или документы базы не изменяются. Фактическое меню и вид иконки нужно проверить в вашей активной теме; эти BSL-модули не исполнялись в 1С автоматически.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Реквизиты = Новый Массив;
    Реквизиты.Добавить(Новый РеквизитФормы("Количество", Новый ОписаниеТипов("Число")));
    Реквизиты.Добавить(Новый РеквизитФормы("Сумма", Новый ОписаниеТипов("Число")));
    ЭтаФорма.ИзменитьРеквизиты(Реквизиты);
    Количество = 3;
    Сумма = Количество * 250;
    Поле = Элементы.Добавить("УчебноеКоличество", Тип("ПолеФормы"));
    Поле.Вид = ВидПоляФормы.ПолеВвода;
    Поле.ПутьКДанным = "Количество";
    Поле.Заголовок = "Книга: количество 0…5";
    Поле.УстановитьДействие("ПриИзменении", "КоличествоИзменено");
    Поле.УстановитьДействие("ОбработкаФормированияКоманд", "СформироватьУчебноеМеню");
    Итог = Элементы.Добавить("УчебнаяСумма", Тип("ПолеФормы"));
    Итог.Вид = ВидПоляФормы.ПолеНадписи;
    Итог.ПутьКДанным = "Сумма";
    Итог.Заголовок = "Сумма при цене 250";
КонецПроцедуры

&НаКлиенте
Процедура КоличествоИзменено(Элемент)
    Если ТипЗнч(Количество) <> Тип("Число") Тогда
        Количество = 3;
    ИначеЕсли Количество < 0 ИЛИ Количество > 5 ИЛИ Количество <> Цел(Количество) Тогда
        Количество = 3;
        Сообщить("В учебном опыте нужны целые количества 0…5; восстановлены 3");
    КонецЕсли;
    Сумма = Количество * 250;
КонецПроцедуры

&НаКлиенте
Процедура УчебнаяКомандаВыбрана(ДополнительныеПараметры) Экспорт
    Если ТипЗнч(ДополнительныеПараметры) <> Тип("Строка") Тогда
        ВызватьИсключение "Ожидается собственный строковый код действия";
    КонецЕсли;
    Если ДополнительныеПараметры = "Увеличить" Тогда
        Если ТипЗнч(Количество) <> Тип("Число") Тогда
            ВызватьИсключение "Количество должно быть числом";
        КонецЕсли;
        Если Количество < 0 ИЛИ Количество >= 5 ИЛИ Количество <> Цел(Количество) Тогда
            Сообщить("Увеличение отклонено: нужен целый остаток 0…4 в собственной форме");
            Возврат;
        КонецЕсли;
        Количество = Количество + 1;
    ИначеЕсли ДополнительныеПараметры = "Вернуть" Тогда
        Количество = 3;
    Иначе
        ВызватьИсключение "Неизвестное учебное действие";
    КонецЕсли;
    Сумма = Количество * 250;
    Сообщить("Своя Книга: " + Строка(Количество) + ", сумма " + Строка(Сумма));
КонецПроцедуры

&НаКлиенте
Процедура СформироватьУчебноеМеню(ПараметрыКоманд, Команды)
    Оповещение = Новый ОписаниеОповещения("УчебнаяКомандаВыбрана", ЭтаФорма, "Увеличить");
    Увеличить = Новый ОписаниеКомандыПоляВвода;
    Увеличить.Команда = Оповещение;
    Увеличить.Представление = "+1 Книга; сейчас " + Строка(Количество);
    Увеличить.Доступность = Количество < 5;
    Увеличить.Пометка = Ложь;
    Увеличить.Картинка = Новый Картинка;
    Команды.Добавить(Увеличить);
    Вернуть = Новый ОписаниеКомандыПоляВвода(Новый ОписаниеОповещения("УчебнаяКомандаВыбрана", ЭтаФорма, "Вернуть"), "Вернуть количество 3");
    Вернуть.Доступность = Количество <> 3;
    Вернуть.Пометка = Количество = 3;
    Команды.Добавить(Вернуть);
    Индекс = Команды.Количество() - 1;
    Пока Индекс >= 0 Цикл
        Если Команды[Индекс].Команда = СтандартнаяКомандаПоляВвода.ВыделитьВсе Тогда
            Команды.Удалить(Индекс);
        КонецЕсли;
        Индекс = Индекс - 1;
    КонецЦикла;
    Стандартная = Новый ОписаниеКомандыПоляВвода(СтандартнаяКомандаПоляВвода.ВыделитьВсе);
    Стандартная.Представление = "Этот текст для стандартной команды игнорируется";
    Стандартная.Доступность = Ложь;
    Стандартная.Пометка = Истина;
    Команды.Добавить(Стандартная);
    Сообщить(Стандартная.Команда = СтандартнаяКомандаПоляВвода.ВыделитьВсе);
    Сообщить(Сумма = Количество * 250);
КонецПроцедуры

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

  1. Сохранить стандартный список меню и добавить собственные рабочие +1/Вернуть 3.

  2. Обойти массив с конца и убрать только уже имеющуюся стандартную ВыделитьВсе, чтобы не добавлять дубликат.

  3. Добавить описание той же стандартной команды. Намеренно задать другое Представление, Доступность и Пометку, чтобы разобрать ограничение справки.

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

  5. Если стандартный пункт доступен, его выбор выделяет только текст своего поля. Количество и сумма не меняются. Собственные пункты продолжают работать.

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

  1. Две булевые проверки Истина при открытии: стандартная команда назначена, сумма согласована.

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

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

Объяснено реальное различие стандартных и собственных команд на безопасном выделении текста своего поля.

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

  1. Доступность=Ложь у стандартной команды не создаёт запрет. Для собственных правил нужна своя команда и проверка в обработчике.

  2. Удалять из массива при обходе вперёд без учёта сдвига индексов нельзя.

  3. Урок не вызывает Вырезать, Вставить или Копировать и не меняет буфер обмена.

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

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

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

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

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