Дождаться ожидаемого запрета изменения readonly-данных

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

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

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

Модуль пустой управляемой формы учебной внешней обработки; тонкий или толстый клиент Windows. Вставьте весь модуль. Это не серверный код.

Подготовка

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

  2. В свойстве команды Действие выберите процедуру УчебныйПример. Вставьте полный приведённый модуль формы.

  3. Откройте EPF в тонком или толстом клиенте Windows и нажмите кнопку. Не переносите Ждать и Асинх в серверный общий модуль.

  4. Пример работает только со своими данными в памяти; записи в базу, файлы и сеть нет.

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

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

  1. Получаем настоящий поток из собственных неизменяемых ДвоичныеДанные.

  2. Каждый Ждать находится в собственном блоке: учитывается и немедленная ошибка вызова, и отклонение обещания.

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

  4. Сброс буферов диагностируем отдельно: он не должен включить доступ к записи, но его завершение не обещаем для всякого источника.

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

  1. Два отказа изменения ожидаемы; пять сравнений Истина, исходный текст ABC123.

  2. Сообщение о сбросе отражает фактическое завершение или отказ; оно не учитывается в счётчике двух запрещённых изменений.

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

Показаны ошибки обещаний и неизменность собственного readonly-источника.

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

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

  2. Перехват исключения не означает, что обещание записало данные.

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

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

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

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

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