Пропустить заголовок и не перепутать успешный индекс 0 с Ложь

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

В собственном пакете HDR|BODY пропускаем три байта заголовка и односимвольную границу. Метод поиска возвращает 0 при успехе, -1 при отсутствии.

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

Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.

Подготовка

  1. Используйте отдельную учебную базу. Фрагмент без директив вставьте в тело серверной процедуры ВыполнитьПример() Экспорт общего модуля УчебныеЗадачи.

  2. Все исходные байты создаются самим примером в памяти. Файлы, сеть, справочники и документы не нужны.

  3. Запускайте задачи отдельно. После закрытия ЧтениеДанных/ЗаписьДанных не используйте этот экземпляр повторно.

Данные = ПолучитьДвоичныеДанныеИзСтроки("HDR|BODY", КодировкаТекста.UTF8, Ложь);
Чтение = Новый ЧтениеДанных(Данные, КодировкаТекста.UTF8);
Попытка
    Сообщить(Чтение.Пропустить(3) = 3);
    ИндексМаркера = Чтение.ПропуститьДо("|", КодировкаТекста.UTF8);
    Если ИндексМаркера = -1 Тогда
        ВызватьИсключение "После заголовка нет разделителя |";
    КонецЕсли;
    Сообщить(ИндексМаркера = 0);
    Сообщить(Чтение.ПрочитатьСимволы() = "BODY");
    Сообщить(Чтение.Пропустить(10) = 0);
    Сообщить(Чтение.ПропуститьДо("|", КодировкаТекста.UTF8) = -1);
Исключение
    Чтение.Закрыть();
    ВызватьИсключение;
КонецПопытки;
Чтение.Закрыть();

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

  1. Пропустить считает байты, а не текстовые символы. Здесь HDR — ASCII, поэтому три символа равны трём байтам.

  2. ПропуститьДо с одним маркером возвращает 0 при успехе. Это число не нужно превращать в Булево.

  3. После найденного маркера позиция находится на первом байте BODY; сам разделитель уже пропущен.

  4. После чтения хвоста пропуск десяти байтов фактически пропускает ноль. Всегда смотрим фактическое количество.

  5. Повторный поиск границы после конца возвращает -1, а не исключение успеха.

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

  1. Получен BODY; успешный индекс 0, отсутствующий маркер -1.

  2. Проверки количества пропущенных байтов дают 3 и 0; все пять сравнений Истина.

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

Корректно обработаны пропуск фиксированной длины, найденная граница и конец данных.

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

  1. При неполном фиксированном заголовке следует прекратить разбор, а не продолжать со сдвинутой позиции.

  2. Не используйте ЗначениеЗаполнено(ИндексМаркера) как тест успеха: индекс 0 допустим.

  3. Для UTF-8 пропуск N байтов не гарантирует пропуск N букв.

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

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

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

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

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