Возвращает текущую позицию в потоке.
Синтаксис
ТекущаяПозиция()Полное описание, параметры и ограничения
Поток.ТекущаяПозиция (Stream.CurrentPosition)
Поток (Stream)
ТекущаяПозиция (CurrentPosition)
Доступен, начиная с версии 8.3.9.
Синтаксис:
ТекущаяПозиция()
Возвращаемое значение:
Тип: Число.
Описание:
Возвращает текущую позицию в потоке.
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер, интеграция.
Использование в версии:
Доступен, начиная с версии 8.3.9.
Методическая информация
Практические примеры
Получить поток только для чтения и увидеть общую позицию
Readonly-вид разделяет данные и позицию с файловым потоком. Это не независимая копия файла и не запрет изменения файла всеми процессами.
Где и как запускать
Серверная процедура отдельной учебной базы; локальный временный файл сервера.
Подготовка
Каждый фрагмент запускайте отдельно в серверной процедуре своей учебной базы. Файл создаётся во временном каталоге сервера, не на компьютере клиента.
Пример получает новое временное имя и использует СоздатьНовый, не Создать. Чужой существующий файл никогда не открывается для перезаписи.
После завершения/ошибки закрываются только созданные потоки и удаляется только точное собственное имя. Это не резервная копия и не операция над вашими XML.
ИмяФайла = ПолучитьИмяВременногоФайла("bin");
УчебныйФайл = Новый Файл(ИмяФайла);
Если УчебныйФайл.Существует() Тогда
ВызватьИсключение "Временное имя уже занято: чужой файл не открываем";
КонецЕсли;
Поток = Неопределено;
Вид = Неопределено;
Копия = Неопределено;
СозданСвойФайл = Ложь;
Попытка
Поток = Новый ФайловыйПоток(ИмяФайла, РежимОткрытияФайла.СоздатьНовый, ДоступКФайлу.ЧтениеИЗапись);
СозданСвойФайл = Истина;
Буфер = ПолучитьБуферДвоичныхДанныхИзСтроки("ABC123", КодировкаТекста.UTF8, Ложь);
Поток.Записать(Буфер, 0, Буфер.Размер);
Поток.Перейти(0, ПозицияВПотоке.Начало);
Вид = Поток.ПолучитьПотокТолькоДляЧтения();
Сообщить(Вид.ДоступноЧтение);
Сообщить(Не Вид.ДоступнаЗапись);
Сообщить(Вид.ДоступноИзменениеПозиции);
Сообщить(Вид.Размер() = 6);
Сообщить(Вид.Перейти(2, ПозицияВПотоке.Начало) = 2);
Сообщить(Поток.ТекущаяПозиция() = 2);
Часть = Новый БуферДвоичныхДанных(2);
Сообщить(Вид.Прочитать(Часть, 0, 2) = 2);
Сообщить(ПолучитьСтрокуИзБуфераДвоичныхДанных(Часть, КодировкаТекста.UTF8) = "C1");
Сообщить(Вид.ТекущаяПозиция() = 4);
Сообщить(Поток.ТекущаяПозиция() = 4);
Исключение
Если Вид <> Неопределено Тогда
Вид.Закрыть();
КонецЕсли;
Если Копия <> Неопределено Тогда
Копия.Закрыть();
КонецЕсли;
Если Поток <> Неопределено Тогда
Поток.Закрыть();
КонецЕсли;
Если СозданСвойФайл И УчебныйФайл.Существует() Тогда
УдалитьФайлы(ИмяФайла);
КонецЕсли;
ВызватьИсключение;
КонецПопытки;
Если Вид <> Неопределено Тогда
Вид.Закрыть();
КонецЕсли;
Если Копия <> Неопределено Тогда
Копия.Закрыть();
КонецЕсли;
Если Поток <> Неопределено Тогда
Поток.Закрыть();
КонецЕсли;
Если СозданСвойФайл Тогда
УдалитьФайлы(ИмяФайла);
КонецЕсли;
Сообщить(Не УчебныйФайл.Существует());Разбор по шагам
Заполняем собственный файл и возвращаемся в начало до получения readonly-вида.
Читаем реальные возможности Вид, полученного как Поток. ДоступнаЗапись ложна, но изменение позиции допускается.
Переход в виде меняет общую позицию источника; чтение C1 передвигает оба до 4.
Все операции выполняем до закрытия любого из связанных потоков; после этого оба больше не используем.
Как проверить результат
Десять сравнений Истина: возможности, размеры, обе общие позиции и C1.
Данные не копировались во второй файл. Чтение вида не изменяло содержимое ABC123.
Последнее сообщение Истина: точный собственный временный файл удалён после закрытия ресурсов.
Ожидаемый результат
Показано разделение данных и позиции между потоком и readonly-видом.
На что обратить внимание
Если нужен независимый курсор, создайте отдельную копию/поток, а не ещё один readonly-вид.
Readonly относится к данному API доступа. Это не ACL, шифрование и не глобальная блокировка файла.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Отличить поток только для чтения от независимой копии
Читающий поток разделяет данные и текущую позицию с исходным: запрет записи не создаёт неизменяемый снимок.
Где и как запускать
Модуль пустой управляемой формы учебной внешней обработки; тонкий или толстый клиент Windows. Вставьте весь модуль. Это не серверный код.
Подготовка
Создайте учебную внешнюю обработку с пустой управляемой основной формой. Создайте команду УчебныйПример и кнопку этой команды.
В свойстве команды Действие выберите процедуру УчебныйПример. Вставьте полный приведённый модуль формы.
Откройте EPF в тонком или толстом клиенте Windows и нажмите кнопку. Не переносите Ждать и Асинх в серверный общий модуль.
Пример работает только со своими данными в памяти; записи в базу, файлы и сеть нет.
Эти методы проверяются по установленной справке 8.5.1.1343, но фактический запуск в 1С здесь не подтверждён.
&НаКлиенте
Процедура УчебныйПример(Команда)
Источник = Неопределено;
ТолькоЧтение = Неопределено;
ОшибкаОперации = "";
Попытка
Источник = Новый ПотокВПамяти;
ИсходныйБуфер = Новый БуферДвоичныхДанных(5);
Для ИндексБайта = 0 По 4 Цикл
ИсходныйБуфер.Установить(ИндексБайта, (ИндексБайта + 1) * 10);
КонецЦикла;
Источник.Записать(ИсходныйБуфер, 0, 3);
Источник.Перейти(0, ПозицияВПотоке.Начало);
ТолькоЧтение = Источник.ПолучитьПотокТолькоДляЧтения();
Сообщить(Не ТолькоЧтение.ДоступнаЗапись);
БуферЧтения = Новый БуферДвоичныхДанных(3);
Сообщить(ТолькоЧтение.Прочитать(БуферЧтения, 0, 1) = 1);
Сообщить(Источник.ТекущаяПозиция() = 1);
Изменение = Новый БуферДвоичныхДанных(1);
Изменение.Установить(0, 42);
Источник.Записать(Изменение, 0, 1);
Сообщить(ТолькоЧтение.ТекущаяПозиция() = 2);
ТолькоЧтение.Перейти(0, ПозицияВПотоке.Начало);
Сообщить(Источник.ТекущаяПозиция() = 0);
Сообщить(ТолькоЧтение.Прочитать(БуферЧтения, 0, 3) = 3);
Сообщить(БуферЧтения.Получить(0) = 10);
Сообщить(БуферЧтения.Получить(1) = 42);
Сообщить(БуферЧтения.Получить(2) = 30);
Исключение
ОшибкаОперации = ОписаниеОшибки();
КонецПопытки;
ОшибкиЗакрытия = ЗакрытьСобственныеПотоки(ТолькоЧтение, Источник);
Если Не ПустаяСтрока(ОшибкаОперации) Или Не ПустаяСтрока(ОшибкиЗакрытия) Тогда
ВызватьИсключение ОшибкаОперации + " " + ОшибкиЗакрытия;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Функция ЗакрытьСобственныеПотоки(Первый, Второй)
Ошибки = "";
Если Первый <> Неопределено Тогда
Попытка
Первый.Закрыть();
Исключение
Ошибки = "Первый поток не закрыт: " + ОписаниеОшибки();
КонецПопытки;
КонецЕсли;
Если Второй <> Неопределено Тогда
Попытка
Второй.Закрыть();
Исключение
Ошибки = Ошибки + " Второй поток не закрыт: " + ОписаниеОшибки();
КонецПопытки;
КонецЕсли;
Возврат Ошибки;
КонецФункцииРазбор по шагам
Создаём собственный поток 10/20/30 и устанавливаем позицию 0. ПолучитьПотокТолькоДляЧтения возвращает обёртку типа Поток, не отдельный ПотокВПамяти с копией байтов.
После чтения одного байта через обёртку текущая позиция исходного потока тоже 1.
Через исходный записывающий поток заменяем второй байт на 42. Текущая позиция обёртки становится 2, потому что позиция общая.
Переход обёртки к началу меняет позицию исходного. Чтение снова получает 10/42/30, то есть видит изменения общего содержимого.
После опыта больше не используем ни один поток; отдельно пытаемся закрыть обе принадлежащие примеру ссылки и сообщаем ошибки закрытия.
Как проверить результат
Девять сравнений дают Истина; фактически прочитан пакет 10/42/30.
Не было попытки записи через поток только для чтения и не было изменения внешних данных.
Ожидаемый результат
На конкретных байтах показано общее содержимое и общая позиция читающей обёртки.
На что обратить внимание
Только чтение защищает этот интерфейс записи, а не исходный поток от другого владельца.
Для независимого снимка нужно отдельно копировать данные; данный метод такого обещания не даёт.
Не используйте потоки после завершения очистки и не выводите из этого примера неподтверждённые гарантии многопоточности.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.