Получить результат чтения, буфер и двоичные данные через callback

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

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

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

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

Подготовка

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

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

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

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

Перем Выполняется;

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

&НаКлиенте
Функция ОповещениеДля(ИмяОбработчика, Состояние)
    Возврат Новый ОписаниеОповещения(ИмяОбработчика, ЭтотОбъект, Состояние,
        "ОшибкаОперации", ЭтотОбъект);
КонецФункции

&НаКлиенте
Процедура ОшибкаОперации(Ошибка, СтандартнаяОбработка, Состояние) Экспорт
    ОсвободитьУчебныеРесурсы(Состояние);
    Выполняется = Ложь;
    СтандартнаяОбработка = Истина;
КонецПроцедуры

&НаКлиенте
Процедура ОсвободитьУчебныеРесурсы(Состояние)
    Попытка
        Если Не Состояние.ЧтениеЗакрыто Тогда
            Состояние.Чтение.Закрыть();
            Состояние.ЧтениеЗакрыто = Истина;
        КонецЕсли;
    Исключение
        // Не заменяем первичную ошибку вторичной ошибкой освобождения ресурсов.
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура ПослеЧтения(Результат, Состояние) Экспорт
    Состояние.Часть = Результат;
    Сообщить(Результат.Размер = 3);
    Результат.НачатьПолучениеБуфераДвоичныхДанных(ОповещениеДля("ПослеБуфера", Состояние));
КонецПроцедуры

&НаКлиенте
Процедура ПослеБуфера(Буфер, Состояние) Экспорт
    Сообщить(Буфер.Размер = 3);
    Сообщить(ПолучитьСтрокуИзБуфераДвоичныхДанных(Буфер, КодировкаТекста.UTF8) = "ABC");
    Состояние.Часть.НачатьПолучениеДвоичныхДанных(ОповещениеДля("ПослеДвоичных", Состояние));
КонецПроцедуры

&НаКлиенте
Процедура ПослеДвоичных(Двоичные, Состояние) Экспорт
    Сообщить(Двоичные.Размер() = 3);
    Сообщить(ПолучитьСтрокуИзДвоичныхДанных(Двоичные, КодировкаТекста.UTF8) = "ABC");
    Состояние.Чтение.НачатьЗакрытие(ОповещениеДля("ПослеЗакрытияЧтения", Состояние));
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗакрытияЧтения(Состояние) Экспорт
    Состояние.ЧтениеЗакрыто = Истина;
    Выполняется = Ложь;
КонецПроцедуры

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

  1. НачатьЧтение запускает чтение, не возвращая сами данные в присваивание. Они поступают в ПослеЧтения.

  2. РезультатЧтенияДанных сохраняем в состоянии, поскольку он нужен в следующем callback.

  3. ПослеБуфера принимает БуферДвоичныхДанных, ПослеДвоичных — ДвоичныеДанные. Это разные типы с разным синтаксисом размера.

  4. Размер результата/буфера — свойство .Размер; размер ДвоичныеДанные — метод .Размер().

  5. Ошибка операции передаётся отдельной экспортной процедуре с тремя аргументами. Конец цепочки закрывает чтение.

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

  1. Все пять сообщений Истина; оба преобразования дают ABC длиной три байта.

  2. Буквы DE не попадают в результат, повторный запуск разрешён после закрытия.

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

Разобраны типы результатов и корректное хранение контекста между callback-процедурами.

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

  1. Оба преобразования нужны здесь для сравнения API. В рабочем алгоритме выбирайте действительно нужное представление.

  2. Большой буфер загружает данные в оперативную память; этот пример намеренно имеет только три байта.

  3. Нельзя заменить два аргумента callback преобразования одним: дополнительное состояние тоже передаётся.

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

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

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

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

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