Из ABCDE получаем первые три байта. Два преобразования результата выполняются последовательно, а ресурсы удерживаются структурой состояния.
Где и как запускать
Модуль пустой управляемой формы учебной внешней обработки; тонкий или толстый клиент Windows. Вставьте весь модуль. Это не серверный код.
Подготовка
Создайте учебную внешнюю обработку с пустой управляемой основной формой. Создайте команду УчебныйПример и кнопку этой команды.
В свойстве команды Действие выберите процедуру УчебныйПример. Вставьте полный приведённый модуль формы.
Откройте EPF в тонком или толстом клиенте Windows и нажмите кнопку. Не переносите Ждать и Асинх в серверный общий модуль.
Пример работает только со своими данными в памяти; записи в базу, файлы и сеть нет.
Перем Выполняется;
&НаКлиенте
Процедура УчебныйПример(Команда)
Если Выполняется = Истина Тогда
Сообщить("Дождитесь завершения предыдущей учебной цепочки");
Возврат;
КонецЕсли;
Данные = ПолучитьДвоичныеДанныеИзСтроки("ABCDE", КодировкаТекста.UTF8, Ложь);
Чтение = Новый ЧтениеДанных(Данные);
Состояние = Новый Структура("Чтение,ЧтениеЗакрыто,Часть", Чтение, Ложь, Неопределено);
Выполняется = Истина;
Попытка
Состояние.Чтение.НачатьЧтение(ОповещениеДля("ПослеЧтения", Состояние), 3);
Исключение
ОсвободитьУчебныеРесурсы(Состояние);
Выполняется = Ложь;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Функция ОповещениеДля(ИмяОбработчика, Состояние)
Возврат Новый ОписаниеОповещения(ИмяОбработчика, ЭтотОбъект, Состояние,
"ОшибкаОперации", ЭтотОбъект);
КонецФункции
&НаКлиенте
Процедура ОшибкаОперации(Ошибка, СтандартнаяОбработка, Состояние) Экспорт
ОсвободитьУчебныеРесурсы(Состояние);
Выполняется = Ложь;
СтандартнаяОбработка = Истина;
КонецПроцедуры
&НаКлиенте
Процедура ОсвободитьУчебныеРесурсы(Состояние)
Попытка
Если Не Состояние.ЧтениеЗакрыто Тогда
Состояние.Чтение.Закрыть();
Состояние.ЧтениеЗакрыто = Истина;
КонецЕсли;
Исключение
// Не заменяем первичную ошибку вторичной ошибкой освобождения ресурсов.
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура ПослеЧтения(Результат, Состояние) Экспорт
Состояние.Часть = Результат;
Сообщить(Результат.Размер = 3);
Результат.НачатьПолучениеБуфераДвоичныхДанных(ОповещениеДля("ПослеБуфера", Состояние));
КонецПроцедуры
&НаКлиенте
Процедура ПослеБуфера(Буфер, Состояние) Экспорт
Сообщить(Буфер.Размер = 3);
Сообщить(ПолучитьСтрокуИзБуфераДвоичныхДанных(Буфер, КодировкаТекста.UTF8) = "ABC");
Состояние.Часть.НачатьПолучениеДвоичныхДанных(ОповещениеДля("ПослеДвоичных", Состояние));
КонецПроцедуры
&НаКлиенте
Процедура ПослеДвоичных(Двоичные, Состояние) Экспорт
Сообщить(Двоичные.Размер() = 3);
Сообщить(ПолучитьСтрокуИзДвоичныхДанных(Двоичные, КодировкаТекста.UTF8) = "ABC");
Состояние.Чтение.НачатьЗакрытие(ОповещениеДля("ПослеЗакрытияЧтения", Состояние));
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗакрытияЧтения(Состояние) Экспорт
Состояние.ЧтениеЗакрыто = Истина;
Выполняется = Ложь;
КонецПроцедурыРазбор по шагам
НачатьЧтение запускает чтение, не возвращая сами данные в присваивание. Они поступают в ПослеЧтения.
РезультатЧтенияДанных сохраняем в состоянии, поскольку он нужен в следующем callback.
ПослеБуфера принимает БуферДвоичныхДанных, ПослеДвоичных — ДвоичныеДанные. Это разные типы с разным синтаксисом размера.
Размер результата/буфера — свойство .Размер; размер ДвоичныеДанные — метод .Размер().
Ошибка операции передаётся отдельной экспортной процедуре с тремя аргументами. Конец цепочки закрывает чтение.
Как проверить результат
Все пять сообщений Истина; оба преобразования дают ABC длиной три байта.
Буквы DE не попадают в результат, повторный запуск разрешён после закрытия.
Ожидаемый результат
Разобраны типы результатов и корректное хранение контекста между callback-процедурами.
На что обратить внимание
Оба преобразования нужны здесь для сравнения API. В рабочем алгоритме выбирайте действительно нужное представление.
Большой буфер загружает данные в оперативную память; этот пример намеренно имеет только три байта.
Нельзя заменить два аргумента callback преобразования одним: дополнительное состояние тоже передаётся.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.