Передать исходное значение в обработчик завершения вопроса

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

Тот же учебный сброс выполняем через ОписаниеОповещения. Завершение приходит в отдельную экспортную процедуру с ответом и дополнительными параметрами.

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

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

Подготовка

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

  2. Не добавляйте вручную реквизит ЗначениеПримера, поле ПолеПримера и команду УчебноеДействие: их создаст код.

  3. В свойствах формы → События свяжите ПриСозданииНаСервере с одноимённой процедурой. Вставьте весь модуль, включая клиентские и серверные процедуры.

  4. Сохраните учебную EPF и откройте через Файл → Открыть в тонком или толстом клиенте Windows. Рабочие данные не читаются и не записываются.

  5. Этот урок хранит только собственное целое учебное количество 0–9: начальное 3, сброс в 0. Это не универсальный тип количества товаров.

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


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

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

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

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

  1. КвалификаторыЧисла(1, 0, Неотрицательный) разрешают начальное 3, ноль после сброса и прочие целые значения 0–9. Без числовых квалификаторов ОписаниеТипов не разрешает хранить числа.

  2. ОписаниеОповещения связывает имя экспортной процедуры, модуль формы и структуру дополнительного контекста.

  3. Читаем три свойства описания, чтобы увидеть, куда пойдёт результат и какой снимок данных передан.

  4. ПоказатьВопрос возвращает управление до ответа. Код сразу после вызова не должен считать вопрос завершённым.

  5. ПослеПодтверждения получает два параметра: Ответ и ДополнительныеПараметры. Имя процедуры совпадает со строкой описания и есть Экспорт.

  6. Кнопка снова становится доступной; сброс происходит только при Да и совпадении текущего числа с переданным снимком.

  7. В КонтекстВопроса попадает уже типизированное значение, не текст поля. Собственное изменение 3 → 4 до ответа не меняет снимок 3; callback обязан сохранить новое 4 даже при Да.

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

  1. Три начальные булевы проверки свойств оповещения Истина.

  2. Нет сохраняет 3, Да меняет на 0; после ответа кнопка доступна.

  3. Количество не меняется сразу после открытия вопроса, до ответа.

  4. Задайте 9 до вызова: Нет сохраняет 9, Да сбрасывает в 0. Повторный вызов после сброса передаёт снимок 0 и оставляет 0 при любом ответе.

  5. Отдельная проверка ветки callback в отладчике собственной формы: снимок 3, фактическое значение 4 или 9, ответ Да — новое значение сохраняется. Ввод в поле во время модального вопроса не предполагается.

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

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

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

  1. В обработчик передаётся не команда кнопки, а результат вопроса и дополнительные параметры.

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

  3. Модальный вопрос может не разрешать редактирование поля; проверка снимка не означает гарантированный интерактивный ввод во время ожидания.

  4. Отсутствие Экспорт или несовпадение имени обработчика приводит к ошибке вызова.

  5. Не используйте ожидаемый ответ после ПоказатьВопрос синхронно: результат приходит позже.

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

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

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

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

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