Асинхронная функция. Пропускает заданное количество байтов в потоке.
Синтаксис
ПропуститьАсинх(<Количество>)Полное описание, параметры и ограничения
ЧтениеДанных.ПропуститьАсинх (DataReader.SkipAsync)
ЧтениеДанных (DataReader)
ПропуститьАсинх (SkipAsync)
Доступен, начиная с версии 8.3.18.
Синтаксис:
ПропуститьАсинх(<Количество>)
Параметры:
<Количество> (обязательный)
Тип: Число.
Количество байтов, которые требуется пропустить.
Возвращаемое значение:
Тип: Обещание.
Результат выполнения обещания - количество фактически пропущенных данных.
Описание:
Асинхронная функция. Пропускает заданное количество байтов в потоке.
Доступность:
Тонкий клиент, толстый клиент.
См. также:
ЧтениеДанных, метод Пропустить
ЧтениеДанных, метод НачатьПропуск
Использование в версии:
Доступен, начиная с версии 8.3.18.
Методическая информация
Практические примеры
Асинхронно скопировать непрочитанное тело в свой поток
В собственном наборе HDRBODY пропускаем заголовок и ожидаем копирование оставшихся четырёх байтов.
Где и как запускать
Модуль пустой управляемой формы учебной внешней обработки; тонкий или толстый клиент Windows. Вставьте весь модуль. Это не серверный код.
Подготовка
Создайте учебную внешнюю обработку с пустой управляемой основной формой. Создайте команду УчебныйПример и кнопку этой команды.
В свойстве команды Действие выберите процедуру УчебныйПример. Вставьте полный приведённый модуль формы.
Откройте EPF в тонком или толстом клиенте Windows и нажмите кнопку. Не переносите Ждать и Асинх в серверный общий модуль.
Пример работает только со своими данными в памяти; записи в базу, файлы и сеть нет.
&НаКлиенте
Асинх Процедура УчебныйПример(Команда)
Данные = ПолучитьДвоичныеДанныеИзСтроки("HDRBODY", КодировкаТекста.UTF8, Ложь);
Чтение = Новый ЧтениеДанных(Данные);
Целевой = Новый ПотокВПамяти;
Попытка
Пропущено = Ждать Чтение.ПропуститьАсинх(3);
Если Пропущено <> 3 Тогда
ВызватьИсключение "Учебный заголовок неполный";
КонецЕсли;
Скопировано = Ждать Чтение.КопироватьВАсинх(Целевой);
Сообщить(Скопировано = 4);
Ждать Чтение.ЗакрытьАсинх();
Исключение
Чтение.Закрыть();
Целевой.Закрыть();
ВызватьИсключение;
КонецПопытки;
Тело = Целевой.ЗакрытьИПолучитьДвоичныеДанные();
Сообщить(ПолучитьСтрокуИзДвоичныхДанных(Тело, КодировкаТекста.UTF8) = "BODY");
КонецПроцедурыРазбор по шагам
Создаём независимые источник и приёмник; оба принадлежат только этому запуску.
Ждать ПропуститьАсинх продвигает позицию на три байта. Проверяем фактическое количество.
Ждать КопироватьВАсинх возвращает количество скопированных байтов, а не поток и не текст.
Закрываем чтение, получаем данные из собственного приёмника и декодируем их явно.
Как проверить результат
Скопировано 4, восстановлен BODY; оба сравнения Истина.
Заголовок HDR не попадает в приёмник и файлы не создаются.
Ожидаемый результат
Получено тело сообщения без предварительного чтения остатка в строку.
На что обратить внимание
Не закрывайте целевой поток, пока ожидаемое копирование не завершено.
Операция переносит остаток, а не все исходные данные от начала.
Это память, не загрузка на сервер и не сохранение файла.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Асинхронно пропустить служебную часть и прочитать поле до границы
Разбираем HDR|Книга#TAIL: сначала пропуск байтов и границы, затем получение поля и хвоста с обработкой отсутствующего маркера.
Где и как запускать
Модуль пустой управляемой формы учебной внешней обработки; тонкий или толстый клиент Windows. Вставьте весь модуль. Это не серверный код.
Подготовка
Создайте учебную внешнюю обработку с пустой управляемой основной формой. Создайте команду УчебныйПример и кнопку этой команды.
В свойстве команды Действие выберите процедуру УчебныйПример. Вставьте полный приведённый модуль формы.
Откройте EPF в тонком или толстом клиенте Windows и нажмите кнопку. Не переносите Ждать и Асинх в серверный общий модуль.
Пример работает только со своими данными в памяти; записи в базу, файлы и сеть нет.
&НаКлиенте
Асинх Процедура УчебныйПример(Команда)
Данные = ПолучитьДвоичныеДанныеИзСтроки("HDR|Книга#TAIL", КодировкаТекста.UTF8, Ложь);
Чтение = Новый ЧтениеДанных(Данные, КодировкаТекста.UTF8);
Попытка
Пропущено = Ждать Чтение.ПропуститьАсинх(3);
Если Пропущено <> 3 Тогда
ВызватьИсключение "Учебный заголовок неполный";
КонецЕсли;
Граница = Ждать Чтение.ПропуститьДоАсинх("|", КодировкаТекста.UTF8);
Если Граница = -1 Тогда
ВызватьИсключение "Обязательная граница не найдена";
КонецЕсли;
Поле = Ждать Чтение.ПрочитатьДоАсинх("#", КодировкаТекста.UTF8);
Если Не Поле.МаркерНайден Тогда
ВызватьИсключение "Не найдена граница поля";
КонецЕсли;
Двоичные = Ждать Поле.ПолучитьДвоичныеДанныеАсинх();
Сообщить(Граница = 0);
Сообщить(ПолучитьСтрокуИзДвоичныхДанных(Двоичные, КодировкаТекста.UTF8) = "Книга");
Хвост = Ждать Чтение.ПрочитатьСимволыАсинх();
Сообщить(Хвост = "TAIL");
НетГраницы = Ждать Чтение.ПропуститьДоАсинх("|", КодировкаТекста.UTF8);
Сообщить(НетГраницы = -1);
Ждать Чтение.ЗакрытьАсинх();
Исключение
Чтение.Закрыть();
ВызватьИсключение;
КонецПопытки;
КонецПроцедурыРазбор по шагам
Ждать ПропуститьАсинх возвращает фактическое число байтов, а не признак успеха.
Обязательную границу | ищем только после проверки полного трёхбайтового заголовка.
Результат ПропуститьДоАсинх с одним найденным маркером равен 0. При отсутствии возвращается -1.
ПрочитатьДоАсинх даёт РезультатЧтенияДанных. Проверяем его МаркерНайден перед преобразованием текстового поля.
TAIL читается после #; повторный поиск | на конце подтверждает отсутствие маркера.
Как проверить результат
Получены Книга и TAIL; успешный индекс 0, неуспешный -1; четыре сообщения Истина.
Измените первый разделитель на /: пример прекращает разбор с понятной ошибкой, а не объявляет сообщение корректным.
Ожидаемый результат
Учебное сообщение разобрано асинхронно с явными проверками границ.
На что обратить внимание
Пропуск трёх байтов подходит именно для ASCII-заголовка HDR.
Ошибки обязательных границ нельзя скрывать и продолжать разбор как будто сообщение корректно.
Пример не осуществляет HTTP-запрос и не является спецификацией внешнего протокола.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.