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