Вернуть результат из собственного callback-алгоритма подтверждения

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

Процедура с вопросом не может синхронно вернуть ответ. Передаём ей оповещение завершения, затем явно вызываем ВыполнитьОбработкуОповещения с результатом.

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

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

Подготовка

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

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

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

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

  5. Используйте новую пустую учебную базу и отдельную копию EPF для каждой задачи. Команды не должны обращаться к рабочим данным, внешним сервисам или процедурам записи.

  6. Основной пример выполняется в тонком/толстом клиенте Windows. Доступность веб-клиента оговаривается отдельно; наличие Асинх в имени не гарантирует веб-доступность.

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


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

&НаКлиенте
Процедура УчебноеДействие(Команда)
    Контекст = Новый Структура("КоличествоНаСтарт", ЗначениеПримера);
    Завершение = Новый ОписаниеОповещения("ПослеУчебногоАлгоритма", ЭтаФорма, Контекст);
    НачатьУчебныйАлгоритм(Завершение);
    Сообщить("Вопрос запущен: результата здесь ещё нет");
КонецПроцедуры

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

&НаКлиенте
Процедура ПослеВопросаАлгоритма(Ответ, КонтекстВопроса) Экспорт
    Подтверждено = Ответ = КодВозвратаДиалога.Да;
    ВыполнитьОбработкуОповещения(КонтекстВопроса.Завершение, Подтверждено);
КонецПроцедуры

&НаКлиенте
Процедура ПослеУчебногоАлгоритма(Подтверждено, Контекст) Экспорт
    Если Не Подтверждено Тогда
        Сообщить("Учебный расчёт не подтверждён");
        Возврат;
    КонецЕсли;
    Если ЗначениеПримера <> Контекст.КоличествоНаСтарт Тогда
        Сообщить("Количество изменилось: повторите подтверждение");
        Возврат;
    КонецЕсли;
    Сообщить("Подтверждена сумма в памяти: " + Строка(Контекст.КоличествоНаСтарт * 200));
КонецПроцедуры

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

  1. Основная команда передаёт отдельное оповещение завершения и снимок числа на старте.

  2. Внутренняя процедура открывает вопрос; выполнение основной команды продолжается, ответа пока нет.

  3. Callback вопроса преобразует только точное Да в Истина. Нет/закрытие не подтверждают действие.

  4. ВыполнитьОбработкуОповещения вызывает внешнюю экспортную процедуру с Результат и её ДополнительныеПараметры.

  5. Перед расчётом проверяем неизменность числа; при устаревшем подтверждении выходим. Записи/удаления отсутствуют.

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

  1. При Нет выводится отказ без расчёта; при Да и неизменном 3 — сумма 600.

  2. Сообщение «результата здесь ещё нет» относится к запуску, не к завершению. Внешний callback должен вызываться ровно один раз на ответ.

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

Разобрана полноценная цепочка продолжения через два разных оповещения.

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

  1. Не используйте возвращаемое значение НачатьУчебныйАлгоритм как ответ вопроса: это процедура.

  2. Если пользователь повторно запускает команду, получится новая независимая цепочка; для реальных операций нужна защита от повторного запуска.

  3. Да не заменяет серверные проверки прав и состояния объекта.

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

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

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

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

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