Показывать прогресс собственного цикла и проверять Ctrl+Break

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

Считаем сумму 1…N только в памяти. Прогресс ограничен 1–100, серверные записи не выполняются, проверка прерывания находится внутри цикла команды формы.

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

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

Подготовка

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

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

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

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

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

  6. Реквизит ввода использует 8 общих разрядов, 2 дробных и знак Любой: от -999999.99 до 999999.99. Шесть целых разрядов сохраняют 100000, а дробная часть и оба знака позволяют передать 1.5 и -1 в собственную проверку без округления до целого.

  7. Сумма, Индекс и Процент — отдельные локальные числа, а не реквизит ввода. Тип поля не ограничивает сумму 5000050000; целый допустимый диапазон N проверяет команда.

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


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

&НаКлиенте
Процедура УчебноеДействие(Команда)
    ЧислоИтераций = Цел(ЗначениеПримера);
    Если ЧислоИтераций < 1 Или ЧислоИтераций > 100000 Или ЧислоИтераций <> ЗначениеПримера Тогда
        Сообщить("Введите целое число от 1 до 100000");
        Возврат;
    КонецЕсли;
    Сумма = 0;
    ПредыдущийПроцент = 0;
    Попытка
        Для Индекс = 1 По ЧислоИтераций Цикл
            ОбработкаПрерыванияПользователя();
            Сумма = Сумма + Индекс;
            Процент = Макс(1, Цел(Индекс * 100 / ЧислоИтераций));
            Если Процент <> ПредыдущийПроцент Тогда
                Состояние("Учебный расчёт в памяти", Процент, "Ctrl+Break — запрос прерывания");
                ПредыдущийПроцент = Процент;
            КонецЕсли;
        КонецЦикла;
    Исключение
        Состояние();
        ВызватьИсключение;
    КонецПопытки;
    Состояние();
    Сообщить(Сумма = ЧислоИтераций * (ЧислоИтераций + 1) / 2);
    Сообщить("Сумма: " + Строка(Сумма));
КонецПроцедуры

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

  1. Проверяем целый диапазон N до цикла. Никакие реальные документы или файлы не обрабатываются.

  2. Состояние получает прогресс 1–100. Обновляем только при изменении целого процента, не для каждой итерации.

  3. ОбработкаПрерыванияПользователя проверяет Ctrl+Break в интерактивном клиентском действии.

  4. На обычном завершении и при обрабатываемом исключении Состояние() без параметров возвращает системный текст.

  5. Проверяем результат независимой формулой N × (N + 1) / 2.

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

  1. При N=100 сумма 5050 и логическая проверка Истина; при N=100000 — 5000050000.

  2. При 0, -1, 1.5 или 100001 цикл не запускается. Дробное 1.5 сохраняется в реквизите до явного сравнения с Цел, не превращается автоматически в допустимое целое.

  3. Попробуйте Ctrl+Break во время большого варианта. Цикл может закончиться раньше нажатия — это не доказательство ошибки метода.

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

Показаны ограниченный прогресс и опрос прерывания без побочных записей.

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

  1. Прерывание разрешено не во всех обработчиках; пример запускается именно интерактивной командой формы.

  2. Платформенное прерывание может завершить весь обработчик. Не полагайтесь на него как на механизм отката записей или гарантированный finally.

  3. Очень быстрый цикл может не дать заметной анимации; не увеличивайте нагрузку на рабочую базу ради демонстрации.

  4. Команда проверяет уже типизированное значение с двумя дробными знаками. Первоначальный текст с большей точностью может быть ограничен или приведён при вводе; исходный текст здесь не анализируется. Для строгой проверки первоначального текста нужен отдельный строковый ввод и проверка до преобразования.

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

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

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

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

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