Два обещания изменения намеренно отклоняются. Исключение учитывается только вокруг ожидаемой операции, а проверка неизменности выполняется после обоих отказов.
Где и как запускать
Модуль пустой управляемой формы учебной внешней обработки; тонкий или толстый клиент Windows. Вставьте весь модуль. Это не серверный код.
Подготовка
Создайте учебную внешнюю обработку с пустой управляемой основной формой. Создайте команду УчебныйПример и кнопку этой команды.
В свойстве команды Действие выберите процедуру УчебныйПример. Вставьте полный приведённый модуль формы.
Откройте EPF в тонком или толстом клиенте Windows и нажмите кнопку. Не переносите Ждать и Асинх в серверный общий модуль.
Пример работает только со своими данными в памяти; записи в базу, файлы и сеть нет.
&НаКлиенте
Асинх Процедура УчебныйПример(Команда)
Данные = ПолучитьДвоичныеДанныеИзСтроки("ABC123", КодировкаТекста.UTF8, Ложь);
Поток = Данные.ОткрытьПотокДляЧтения();
Вид = Неопределено;
Копия = Неопределено;
Попытка
Буфер = ПолучитьБуферДвоичныхДанныхИзСтроки("ZZ", КодировкаТекста.UTF8, Ложь);
Отказов = 0;
Попытка
Ждать Поток.ЗаписатьАсинх(Буфер, 0, 2);
Исключение
Отказов = Отказов + 1;
Сообщить("Ожидаемый отказ записи: " + ОписаниеОшибки());
КонецПопытки;
Попытка
Ждать Поток.УстановитьРазмерАсинх(2);
Исключение
Отказов = Отказов + 1;
Сообщить("Ожидаемый отказ изменения размера: " + ОписаниеОшибки());
КонецПопытки;
Сообщить(Отказов = 2);
Сообщить(Не Поток.ДоступнаЗапись);
Сообщить(Поток.Размер() = 6);
Сообщить(ПолучитьСтрокуИзДвоичныхДанных(Данные, КодировкаТекста.UTF8) = "ABC123");
Попытка
Ждать Поток.СброситьБуферыАсинх();
Сообщить("Сброс завершён для данного источника");
Исключение
Сообщить("Сброс недоступен данному источнику: " + ОписаниеОшибки());
КонецПопытки;
Сообщить(Не Поток.ДоступнаЗапись);
Исключение
Если Вид <> Неопределено Тогда
Вид.Закрыть();
КонецЕсли;
Если Копия <> Неопределено Тогда
Копия.Закрыть();
КонецЕсли;
Поток.Закрыть();
ВызватьИсключение;
КонецПопытки;
Если Вид <> Неопределено Тогда
Вид.Закрыть();
КонецЕсли;
Если Копия <> Неопределено Тогда
Копия.Закрыть();
КонецЕсли;
Поток.Закрыть();
КонецПроцедурыРазбор по шагам
Получаем настоящий поток из собственных неизменяемых ДвоичныеДанные.
Каждый Ждать находится в собственном блоке: учитывается и немедленная ошибка вызова, и отклонение обещания.
Счётчик двух отказов проверяем после перехватов, затем отдельно проверяем исходный ABC123.
Сброс буферов диагностируем отдельно: он не должен включить доступ к записи, но его завершение не обещаем для всякого источника.
Как проверить результат
Два отказа изменения ожидаемы; пять сравнений Истина, исходный текст ABC123.
Сообщение о сбросе отражает фактическое завершение или отказ; оно не учитывается в счётчике двух запрещённых изменений.
Ожидаемый результат
Показаны ошибки обещаний и неизменность собственного readonly-источника.
На что обратить внимание
В рабочем коде используйте ДоступнаЗапись до начала операции, этот урок намеренно проверяет запреты.
Перехват исключения не означает, что обещание записало данные.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.