Обычная форма: связать комментарий, назначить обработчики и своё меню

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

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

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

Полный модуль собственной обычной формы УчебныеЭлементы85 → Обработки → Уч85Комментарий → Карточка. Толстый обычный клиент; не выполнялся.

Подготовка

  1. Общая основа семейства УчебныеЭлементы85: новая отдельная файловая база 8.5.1.1343, русский встроенный язык, совместимость Не использовать. Этот вариант запускается как Обычное приложение в толстом клиенте Windows, не в тонком/управляемом клиенте. Не переносите сюда Элементы/ПутьКДанным или серверные директивы управляемого варианта флажков.

  2. В новом собственном стенде нет расширений, подписок и фоновых обработчиков. Обработки → Уч85Комментарий → обычная основная форма Карточка. Только реквизиты формы Комментарий Строка(100), Подсказка Строка(300), СчетчикРучныхИзменений Число(5,0), неотрицательный. Реквизитов объекта обработки и прикладных данных для записи нет.

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

  4. Отдельная командная панель МенюКомментария — собственное контекстное меню, изначально пустое, АвтоЗаполнение=Нет. Код создаёт только свою кнопку ВставитьОбразец. Не передавайте панель рабочей формы или её чужую коллекцию кнопок.

  5. Кнопки Заполнить, АвтоМеню, СвоеМеню, БезОбработчика, СОбработчиком, Проверить: действия одноимённых процедур *Нажатие. ПриОткрытии формы → ПриОткрытии. Основной блок — полный модуль обычной формы; обработчики динамических действий имеют Экспорт и стандартный параметр своего элемента/кнопки.

  6. F7 и обновление только своего нового стенда. Откройте свою обработку через стандартный список обработок толстого обычного клиента. Здесь подготовка и UI не выполнялись, runtimeVerifiedScenarios=0.

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

Процедура ПроверитьСвойСтенд()
    Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда
        ВызватьИсключение "Откройте только свою новую учебную базу указанной версии";
    КонецЕсли;
    Если ТипЗнч(ЭтаФорма) <> Тип("Форма") Тогда
        ВызватьИсключение "Нужна собственная обычная форма толстого клиента";
    КонецЕсли;
КонецПроцедуры

Процедура НастроитьСвоеМеню()
    Панель = ЭлементыФормы.МенюКомментария;
    Панель.АвтоЗаполнение = Ложь;
    Панель.ИсточникДействий = ЭтаФорма;
    Панель.Кнопки.Очистить();
    Панель.Кнопки.Добавить("ВставитьОбразец", ТипКнопкиКоманднойПанели.Действие,
        "Вставить свой образец", Новый Действие("ЗаполнитьНажатие"));
    Поле = ЭлементыФормы.Комментарий;
    Поле.КонтекстноеМеню = Панель;
    Поле.АвтоКонтекстноеМеню = Ложь;
КонецПроцедуры

Процедура ЗаполнитьНажатие(Кнопка) Экспорт
    ПроверитьСвойСтенд();
    ЭлементыФормы.Комментарий.Значение = "Доставка: согласовать адрес";
    Если Комментарий <> "Доставка: согласовать адрес" Тогда
        ВызватьИсключение "Изменение Значение должно менять собственный связанный реквизит";
    КонецЕсли;
    ПоказатьСвоеСостояние();
КонецПроцедуры

Процедура КомментарийИзменился(Элемент) Экспорт
    ПроверитьСвойСтенд();
    СчетчикРучныхИзменений = СчетчикРучныхИзменений + 1;
    ПоказатьСвоеСостояние();
КонецПроцедуры

Процедура АвтоМенюНажатие(Кнопка)
    ПроверитьСвойСтенд();
    Поле = ЭлементыФормы.Комментарий;
    Панель = ЭлементыФормы.МенюКомментария;
    Панель.ИсточникДействий = Поле;
    Панель.АвтоЗаполнение = Истина;
    Поле.АвтоКонтекстноеМеню = Истина;
    ПоказатьСвоеСостояние();
КонецПроцедуры

Процедура СвоеМенюНажатие(Кнопка)
    ПроверитьСвойСтенд();
    НастроитьСвоеМеню();
    ПоказатьСвоеСостояние();
КонецПроцедуры

Процедура БезОбработчикаНажатие(Кнопка)
    ПроверитьСвойСтенд();
    ЭлементыФормы.Комментарий.УстановитьДействие("ПриИзменении", Неопределено);
    ПоказатьСвоеСостояние();
КонецПроцедуры

Процедура СОбработчикомНажатие(Кнопка)
    ПроверитьСвойСтенд();
    ЭлементыФормы.Комментарий.УстановитьДействие("ПриИзменении", Новый Действие("КомментарийИзменился"));
    ПоказатьСвоеСостояние();
КонецПроцедуры

Процедура ПроверитьНажатие(Кнопка)
    ПроверитьСвойСтенд();
    ПоказатьСвоеСостояние();
КонецПроцедуры

Процедура ПоказатьСвоеСостояние()
    Подсказка = СтрШаблон("Комментарий=%1; ручных изменений=%2; авто-меню=%3; имя=%4",
        Комментарий, СчетчикРучныхИзменений, ЭлементыФормы.Комментарий.АвтоКонтекстноеМеню,
        ЭлементыФормы.Комментарий.Имя);
КонецПроцедуры

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

  1. Расширение возникает у реального элемента управления, расположенного в обычной форме. Поле.Имя проверяет, что найден именно свой Комментарий. Имя не переименовывается: native-замечание разрешает запись имени лишь при совместимости Версия8_3_5 и ниже, а здесь НеИспользовать.

  2. Данные — имя связанной переменной, не значение комментария. Значение — её редактируемое значение. Присвоение через поле проверяется чтением реального реквизита Комментарий.

  3. У связанного поля ТипЗначения readonly. Код только проверяет СодержитТип(Строка), не присваивает новый ОписаниеТипов. Запись этого свойства разрешена для несвязанных элементов, чего данный опыт не делает.

  4. УстановитьДействие получает объект Действие, не строку имени процедуры как в управляемой форме. ПолучитьДействие подтверждает назначенный тип; реальные процедуры формы экспортные. БезОбработчика назначает Неопределено, СОбработчиком возвращает своё действие.

  5. ПриИзменении поля ввода относится к пользовательскому изменению с завершением редактирования. Программное присвоение Значение не должно считаться таким событием: Заполнить явно обновляет подпись, но не увеличивает счётчик ручных изменений.

  6. ИзменяетДанные=True установлено у кнопки локального заполнения. Это характеристика UI, не вызов записи базы и не проверка прав. КнопкаПоУмолчанию=True означает Ctrl+Enter, не обычный Enter.

  7. АвтоКонтекстноеМеню=False включает собственное КонтекстноеМеню с действием ВставитьОбразец. АвтоМеню разрешает стандартное меню поля и назначает это поле источником автоматически заполняемой своей панели. СвоеМеню возвращает ручной вариант и свою единственную кнопку.

  8. ПервыйВГруппе относится к группе обхода клавишами управления курсором. ПропускатьПриВводе=True у Подсказка пропускает её по Enter, но не по Tab. Это не одно и то же свойство и не запрет доступа к полю.

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

  1. Будущий ручной тест: открыть собственную карточку. Проверить Комментарий=Самовывоз, счётчик 0, имя Комментарий, тип реквизита Строка.

  2. Заполнить кнопкой, Ctrl+Enter и командой собственного контекстного меню. Комментарий должен стать Доставка: согласовать адрес; счётчик не растёт только из-за программного присвоения.

  3. Вручную заменить комментарий и перейти на другой элемент. С установленным обработчиком счётчик увеличивается. БезОбработчика → ручной ввод → Проверить: значение меняется, счётчик не увеличивается. СОбработчиком возвращает подсчёт будущих изменений.

  4. АвтоМеню и СвоеМеню: проверить настоящее контекстное меню по правой кнопке мыши. Стандартный состав зависит от состояния поля/клиента; ручное меню содержит только свою ВставитьОбразец.

  5. Сравнить обход Enter и Tab для readonly Подсказка, Ctrl+Enter для Заполнить. Не объявлять видимый текст доказательством всех клавиатурных событий.

  6. Закрыть собственную карточку и открыть заново: локальный комментарий снова Самовывоз, счётчик 0. При возможном вопросе о локальной модификации не сохранять никакой объект: в уроке нет записи базы.

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

Будущий опыт связывает своё поле с локальным реквизитом, отличает пользовательское событие от программного заполнения и показывает ручное/автоматическое меню. Данные только в форме; запуск не выполнялся.

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

  1. Это обычная форма Форма/ЭлементыФормы, не управляемая УправляемаяФорма/Элементы. Одноимённые экспортные расширения и расширения менеджера тестирования не являются этим API.

  2. При установке поля ввода/табличного поля владельцем формы свойства данного расширения недоступны. Не используйте здесь внешний элемент-владелец.

  3. Имя не записываем при совместимости НеИспользовать. У связанного поля ТипЗначения только читаем. Не переносите общий заголовок Чтение и запись без условий из примечаний.

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

  5. ИзменяетДанные не означает Записать. Очищается только коллекция своей панели, не чужое меню. Здесь нет сети, файлов, печати, удаления или записи предметных данных.

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

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

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

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

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