ФайловыйПоток.НачатьЧтение

Методы · BeginRead

Начинает чтение заданного количества байтов в указанный буфер по указанному смещению. Текущая позиция смещается вперед на фактическое количество прочитанных байтов. Чтение из потока возможно только, если поток поддерживает чтение. В противном случае, будет вызвано исключение.

Синтаксис

НачатьЧтение(<ОписаниеОповещения>, <Буфер>, <ПозицияВБуфере>, <Количество>)
Полное описание, параметры и ограничения

ФайловыйПоток.НачатьЧтение (FileStream.BeginRead)

ФайловыйПоток (FileStream)

НачатьЧтение (BeginRead)

Доступен, начиная с версии 8.3.9.

Синтаксис:
НачатьЧтение(<ОписаниеОповещения>, <Буфер>, <ПозицияВБуфере>, <Количество>)
Параметры:

<ОписаниеОповещения> (обязательный)
Тип: ОписаниеОповещения.
Содержит описание процедуры, которая будет вызвана после завершения работы метода со следующими параметрами:
<Количество> - тип Число. Результат выполнения метода.

<ДополнительныеПараметры> - значение, которое было указано при создании объекта ОписаниеОповещения.

<Буфер> (обязательный)
Тип: БуферДвоичныхДанных.
Буфер, в который выполняется чтение.

<ПозицияВБуфере> (обязательный)
Тип: Число.
Позиция в целевом буфере, начиная с которой требуется записывать данные из потока.

<Количество> (обязательный)
Тип: Число.
Количество байтов, которые требуется записать в целевой буфер.
Описание:

Начинает чтение заданного количества байтов в указанный буфер по указанному смещению. Текущая позиция смещается вперед на фактическое количество прочитанных байтов.
Чтение из потока возможно только, если поток поддерживает чтение. В противном случае, будет вызвано исключение.

Доступность:

Тонкий клиент, веб-клиент, толстый клиент.

См. также:
Поток, метод Прочитать
Поток, метод ПрочитатьАсинх

Использование в версии:

Доступен, начиная с версии 8.3.9.

Описание изменено в версии 8.3.18.

Методическая информация

Практические примеры

Соединить восемь файловых операций через оповещения

Полный модуль формы пишет собственный ABC123 и проходит цепочку запись → сброс → размер → переход → чтение → копирование → сокращение → закрытие. Новый запуск заблокирован до завершения.

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

Модуль пустой управляемой формы учебной внешней обработки; тонкий или толстый клиент Windows. Вставьте весь модуль. Это не серверный код.

Подготовка

  1. Создайте учебную внешнюю обработку с пустой управляемой основной формой. Создайте команду УчебныйПример и кнопку этой команды.

  2. В свойстве команды Действие выберите процедуру УчебныйПример. Вставьте полный приведённый модуль формы.

  3. Откройте EPF в тонком или толстом клиенте Windows и нажмите кнопку. Не переносите Ждать и Асинх в серверный общий модуль.

  4. Файл создаётся на компьютере клиента Windows во временном каталоге. Веб-клиент и сервер для данного модуля не используйте.

  5. Требуется разрешённый в учебной базе доступ к локальной файловой системе. Не отключайте профиль безопасности рабочей базы ради запуска.

  6. Создаётся только собственный временный файл с режимом СоздатьНовый. После ожидания операций ресурсы закрываются, точное собственное имя удаляется.

  7. Это вариант без Асинх/Ждать. Вставьте весь модуль: все вызываемые оповещением процедуры должны иметь Экспорт.

  8. Сохранение буфера, приёмника и имени в Состояние необходимо до завершения оповещений. Не удаляйте файл сразу после НачатьЗапись.

Перем Выполняется;

&НаКлиенте
Процедура УчебныйПример(Команда)
    Если Выполняется = Истина Тогда
        Сообщить("Дождитесь окончания предыдущего примера");
        Возврат;
    КонецЕсли;
    Состояние = Новый Структура("Поток,Копия,Буфер,Прочитанный,ИмяФайла,СвойФайл",
        Неопределено, Неопределено, Неопределено, Неопределено, "", Ложь);
    Попытка
        Состояние.ИмяФайла = ПолучитьИмяВременногоФайла("bin");
        Файл = Новый Файл(Состояние.ИмяФайла);
        Если Файл.Существует() Тогда
            ВызватьИсключение "Имя уже занято: существующий файл не открываем";
        КонецЕсли;
        Состояние.Поток = Новый ФайловыйПоток(Состояние.ИмяФайла,
            РежимОткрытияФайла.СоздатьНовый, ДоступКФайлу.ЧтениеИЗапись);
        Состояние.СвойФайл = Истина;
        Состояние.Буфер = ПолучитьБуферДвоичныхДанныхИзСтроки("ABC123", КодировкаТекста.UTF8, Ложь);
        Состояние.Прочитанный = Новый БуферДвоичныхДанных(6);
    Исключение
        ОсвободитьРесурсы(Состояние);
        ВызватьИсключение;
    КонецПопытки;
    Выполняется = Истина;
    Попытка
        Состояние.Поток.НачатьЗапись(ОповещениеДля("ПослеЗаписи", Состояние), Состояние.Буфер, 0, 6);
    Исключение
        ОсвободитьРесурсы(Состояние);
        Выполняется = Ложь;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Функция ОповещениеДля(Имя, Состояние)
    Возврат Новый ОписаниеОповещения(Имя, ЭтотОбъект, Состояние,
        "ОшибкаОперации", ЭтотОбъект);
КонецФункции

&НаКлиенте
Процедура ОсвободитьРесурсы(Состояние)
    Если Состояние.Копия <> Неопределено Тогда
        Попытка
            Состояние.Копия.Закрыть();
            Состояние.Копия = Неопределено;
        Исключение
            Сообщить("Не удалось закрыть собственную копию: " + ОписаниеОшибки());
        КонецПопытки;
    КонецЕсли;
    Если Состояние.Поток <> Неопределено Тогда
        Попытка
            Состояние.Поток.Закрыть();
            Состояние.Поток = Неопределено;
        Исключение
            Сообщить("Не удалось закрыть собственный источник: " + ОписаниеОшибки());
        КонецПопытки;
    КонецЕсли;
    Если Состояние.СвойФайл Тогда
        Если Состояние.Поток = Неопределено Тогда
            Попытка
                Файл = Новый Файл(Состояние.ИмяФайла);
                Если Файл.Существует() Тогда
                    УдалитьФайлы(Состояние.ИмяФайла);
                КонецЕсли;
                Сообщить(Не Файл.Существует());
                Состояние.СвойФайл = Ложь;
            Исключение
                Сообщить("Свой временный файл остался: " + Состояние.ИмяФайла);
                Сообщить(ОписаниеОшибки());
            КонецПопытки;
        Иначе
            Сообщить("Источник не закрыт; собственный файл не удаляем: " + Состояние.ИмяФайла);
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ОшибкаОперации(Ошибка, СтандартнаяОбработка, Состояние) Экспорт
    ОсвободитьРесурсы(Состояние);
    Выполняется = Ложь;
    СтандартнаяОбработка = Истина;
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗаписи(Состояние) Экспорт
    Попытка
        Состояние.Поток.НачатьСбросБуферов(ОповещениеДля("ПослеСброса", Состояние));
    Исключение
        ОсвободитьРесурсы(Состояние);
        Выполняется = Ложь;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура ПослеСброса(Состояние) Экспорт
    Попытка
        Состояние.Поток.НачатьПолучениеРазмера(ОповещениеДля("РазмерДоЧтения", Состояние));
    Исключение
        ОсвободитьРесурсы(Состояние);
        Выполняется = Ложь;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура РазмерДоЧтения(Размер, Состояние) Экспорт
    Попытка
        Сообщить(Размер = 6);
        Состояние.Поток.НачатьПереход(ОповещениеДля("ПозицияДоЧтения", Состояние), 0, ПозицияВПотоке.Начало);
    Исключение
        ОсвободитьРесурсы(Состояние);
        Выполняется = Ложь;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура ПозицияДоЧтения(Позиция, Состояние) Экспорт
    Попытка
        Сообщить(Позиция = 0);
        Состояние.Поток.НачатьЧтение(ОповещениеДля("ПослеЧтения", Состояние), Состояние.Прочитанный, 0, 6);
    Исключение
        ОсвободитьРесурсы(Состояние);
        Выполняется = Ложь;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура ПослеЧтения(Количество, Состояние) Экспорт
    Попытка
        Если Количество <> 6 Тогда
            ВызватьИсключение "Не получены шесть собственных учебных байтов";
        КонецЕсли;
        Сообщить(Количество = 6);
        Сообщить(ПолучитьСтрокуИзБуфераДвоичныхДанных(Состояние.Прочитанный, КодировкаТекста.UTF8) = "ABC123");
        Состояние.Поток.НачатьПереход(ОповещениеДля("ПозицияДоКопии", Состояние), 2, ПозицияВПотоке.Начало);
    Исключение
        ОсвободитьРесурсы(Состояние);
        Выполняется = Ложь;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура ПозицияДоКопии(Позиция, Состояние) Экспорт
    Попытка
        Сообщить(Позиция = 2);
        Состояние.Копия = Новый ПотокВПамяти;
        Состояние.Поток.НачатьКопированиеВ(ОповещениеДля("ПослеКопии", Состояние), Состояние.Копия, 3);
    Исключение
        ОсвободитьРесурсы(Состояние);
        Выполняется = Ложь;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура ПослеКопии(Количество, Состояние) Экспорт
    Попытка
        Сообщить(Количество = 3);
        ДанныеКопии = Состояние.Копия.ЗакрытьИПолучитьДвоичныеДанные();
        Состояние.Копия = Неопределено;
        Сообщить(ПолучитьСтрокуИзДвоичныхДанных(ДанныеКопии, КодировкаТекста.UTF8) = "C12");
        Состояние.Поток.НачатьУстановкуРазмера(ОповещениеДля("ПослеРазмера", Состояние), 3);
    Исключение
        ОсвободитьРесурсы(Состояние);
        Выполняется = Ложь;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура ПослеРазмера(Состояние) Экспорт
    Попытка
        Состояние.Поток.НачатьПолучениеРазмера(ОповещениеДля("РазмерПослеСокращения", Состояние));
    Исключение
        ОсвободитьРесурсы(Состояние);
        Выполняется = Ложь;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура РазмерПослеСокращения(Размер, Состояние) Экспорт
    Попытка
        Сообщить(Размер = 3);
        Состояние.Поток.НачатьЗакрытие(ОповещениеДля("ПослеЗакрытия", Состояние));
    Исключение
        ОсвободитьРесурсы(Состояние);
        Выполняется = Ложь;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗакрытия(Состояние) Экспорт
    Попытка
        Состояние.Поток = Неопределено;
        ОсвободитьРесурсы(Состояние);
        Выполняется = Ложь;
        Сообщить("Цепочка файловых операций завершена");
    Исключение
        ОсвободитьРесурсы(Состояние);
        Выполняется = Ложь;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

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

  1. УчебныйПример создаёт Структура состояния, новый защищённый от перезаписи файл и сохраняет оба буфера.

  2. Следующая операция запускается только в обработчике завершения предыдущей. Начать… не возвращает конечные числа немедленно.

  3. ПослеЗаписи/ПослеСброса получают только Состояние; размер/позиция/количество передаются первым аргументом своих обработчиков.

  4. Чтение проверяет фактические 6 до декодирования. С позиции 2 копируются только 3 байта C12.

  5. Установка размера до 3 проверяется новым асинхронным получением размера.

  6. ПослеЗакрытия очищает собственный файл. Ошибка операции и немедленная ошибка запуска освобождают ресурсы отдельным путём.

  7. Если закрытие или удаление не удалось, выводится конкретный собственный путь, успех очистки не выдумывается.

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

  1. Восемь сравнений по цепочке Истина: 6, 0, чтение 6/ABC123, переход 2, копирование 3/C12, итог 3.

  2. При успешной очистке ещё Истина (файл отсутствует) и сообщение завершения; повторное раннее нажатие даёт предупреждение, второй файл не создаётся.

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

Отработана последовательная клиентская цепочка оповещений с жизненным циклом собственных ресурсов.

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

  1. УчебныйПример закончит выполнение раньше цепочки: его возврат не означает, что запись завершена.

  2. Обычная ошибка асинхронной операции не обязательно попадает в первоначальную Попытка — нужен обработчик ошибки в ОписаниеОповещения.

  3. Сокращение допустимо здесь только для нового собственного файла, не для конфигурации или журнала рабочей базы.

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

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

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

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

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