Для стандартной команды поля ввода прочие свойства описания игнорируются платформой. Это иной контракт, чем собственное ОписаниеОповещения.
Где и как запускать
Полный модуль своей управляемой формы. Только локальные количество и сумма, собственное контекстное меню поля ввода.
Подготовка
В отдельной конфигурации УчебнаяКонфигурацияСинтаксиса создайте новую внешнюю обработку с пустой управляемой формой. Вставьте весь модуль одного урока и назначьте событию ПриСозданииНаСервере приведённую процедуру.
Код сам добавляет числовое поле количества и надпись суммы. События ПриИзменении и ОбработкаФормированияКоманд назначаются полю программно. Не добавляйте одноимённые реквизиты и элементы вручную.
Откройте форму на настольном тонком или толстом клиенте 8.5.1.1343 и щёлкните правой кнопкой по полю количества. Только своя Книга: 3 шт. по 250, сумма 750.
Событие ОбработкаФормированияКоманд имеет параметры ПараметрыКоманд, Команды — без дополнительного Элемент. Процедура собственного оповещения имеет один параметр ДополнительныеПараметры и должна быть Экспорт.
Для второго урока добавьте в свою конфигурацию общую картинку УчебныйМаркер из lesson-assets/owned-book-marker-32.png. Для остальных уроков этот ресурс не нужен.
Никакие товары или документы базы не изменяются. Фактическое меню и вид иконки нужно проверить в вашей активной теме; эти 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/Вернуть 3.
Обойти массив с конца и убрать только уже имеющуюся стандартную ВыделитьВсе, чтобы не добавлять дубликат.
Добавить описание той же стандартной команды. Намеренно задать другое Представление, Доступность и Пометку, чтобы разобрать ограничение справки.
Вид и доступность стандартной команды определяются платформой и состоянием собственного поля. Не ожидайте свою подпись или запрет из Доступность=Ложь.
Если стандартный пункт доступен, его выбор выделяет только текст своего поля. Количество и сумма не меняются. Собственные пункты продолжают работать.
Как проверить результат
Две булевые проверки Истина при открытии: стандартная команда назначена, сумма согласована.
Стандартное представление, пометка и доступность проверить в клиенте; заданные прочие свойства для этого вида Команда игнорируются по контракту.
Ожидаемый результат
Объяснено реальное различие стандартных и собственных команд на безопасном выделении текста своего поля.
На что обратить внимание
Доступность=Ложь у стандартной команды не создаёт запрет. Для собственных правил нужна своя команда и проверка в обработчике.
Удалять из массива при обходе вперёд без учёта сдвига индексов нельзя.
Урок не вызывает Вырезать, Вставить или Копировать и не меняет буфер обмена.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.