Начинает запись в поток заданного количества байтов из буфера по заданному смещению.
Синтаксис
НачатьЗапись(<ОписаниеОповещения>, <Буфер>, <ПозицияВБуфере>, <Количество>)Полное описание, параметры и ограничения
Поток.НачатьЗапись (Stream.BeginWrite)
Поток (Stream)
НачатьЗапись (BeginWrite)
Доступен, начиная с версии 8.3.9.
Синтаксис:
НачатьЗапись(<ОписаниеОповещения>, <Буфер>, <ПозицияВБуфере>, <Количество>)
Параметры:
<ОписаниеОповещения> (обязательный)
Тип: ОписаниеОповещения.
Содержит описание процедуры, которая будет вызвана после завершения записи потока со следующими параметрами:
<ДополнительныеПараметры> - значение, которое было указано при создании объекта ОписаниеОповещения.
<Буфер> (обязательный)
Тип: БуферДвоичныхДанных.
Буфер, данные которого получаются для записи.
<ПозицияВБуфере> (обязательный)
Тип: Число.
Позиция в буфере, начиная с которой требуется получить данные для записи в поток.
<Количество> (обязательный)
Тип: Число.
Количество байт, которые требуется записать.
Описание:
Начинает запись в поток заданного количества байтов из буфера по заданному смещению.
Доступность:
Тонкий клиент, веб-клиент, толстый клиент.
Примечание:
Запись возможна только если поток поддерживает запись. В противном случае при вызове метода будет вызвано исключение.
См. также:
Поток, метод Записать
Поток, метод ЗаписатьАсинх
Использование в версии:
Доступен, начиная с версии 8.3.9.
Описание изменено в версии 8.3.18.
Методическая информация
Практические примеры
Получить ожидаемый отказ НачатьЗапись readonly-потока
Проверяем ровно одну запрещённую операцию на собственном ABC123. Немедленный отказ запуска и ошибка через оповещение проходят отдельными путями, но оба явно проверяют неизменность.
Где и как запускать
Модуль пустой управляемой формы учебной внешней обработки; тонкий или толстый клиент Windows. Вставьте весь модуль. Это не серверный код.
Подготовка
Создайте учебную внешнюю обработку с пустой управляемой основной формой. Создайте команду УчебныйПример и кнопку этой команды.
В свойстве команды Действие выберите процедуру УчебныйПример. Вставьте полный приведённый модуль формы.
Откройте EPF в тонком или толстом клиенте Windows и нажмите кнопку. Не переносите Ждать и Асинх в серверный общий модуль.
Пример работает только со своими данными в памяти; записи в базу, файлы и сеть нет.
Перем Выполняется;
&НаКлиенте
Процедура УчебныйПример(Команда)
Если Выполняется = Истина Тогда
Сообщить("Дождитесь окончания предыдущего примера");
Возврат;
КонецЕсли;
Состояние = Новый Структура("Поток,Копия,Буфер,Прочитанный,ИмяФайла,СвойФайл",
Неопределено, Неопределено, Неопределено, Неопределено, "", Ложь);
Попытка
Данные = ПолучитьДвоичныеДанныеИзСтроки("ABC123", КодировкаТекста.UTF8, Ложь);
Состояние.Поток = Данные.ОткрытьПотокДляЧтения();
Состояние.Вставить("Данные", Данные);
Состояние.Буфер = ПолучитьБуферДвоичныхДанныхИзСтроки("ZZ", КодировкаТекста.UTF8, Ложь);
Исключение
ОсвободитьРесурсы(Состояние);
ВызватьИсключение;
КонецПопытки;
Выполняется = Истина;
Попытка
Состояние.Поток.НачатьЗапись(ОповещениеДля("НеожиданныйУспех", Состояние), Состояние.Буфер, 0, 2);
Исключение
Сообщить(ОписаниеОшибки());
ЗавершитьПроверку(Состояние, Истина);
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Функция ОповещениеДля(Имя, Состояние)
Возврат Новый ОписаниеОповещения(Имя, ЭтотОбъект, Состояние,
"ОшибкаОперации", ЭтотОбъект);
КонецФункции
&НаКлиенте
Процедура ОсвободитьРесурсы(Состояние)
Если Состояние.Копия <> Неопределено Тогда
Попытка
Состояние.Копия.Закрыть();
Состояние.Копия = Неопределено;
Исключение
Сообщить("Не удалось закрыть собственную копию: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
Если Состояние.Поток <> Неопределено Тогда
Попытка
Состояние.Поток.Закрыть();
Состояние.Поток = Неопределено;
Исключение
Сообщить("Не удалось закрыть собственный источник: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
Если Состояние.СвойФайл Тогда
Если Состояние.Поток = Неопределено Тогда
Попытка
Файл = Новый Файл(Состояние.ИмяФайла);
Если Файл.Существует() Тогда
УдалитьФайлы(Состояние.ИмяФайла);
КонецЕсли;
Сообщить(Не Файл.Существует());
Состояние.СвойФайл = Ложь;
Исключение
Сообщить("Свой временный файл остался: " + Состояние.ИмяФайла);
Сообщить(ОписаниеОшибки());
КонецПопытки;
Иначе
Сообщить("Источник не закрыт; собственный файл не удаляем: " + Состояние.ИмяФайла);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОшибкаОперации(Ошибка, СтандартнаяОбработка, Состояние) Экспорт
СтандартнаяОбработка = Ложь;
Сообщить("Ожидаемый отказ readonly-операции");
Сообщить(Ошибка);
ЗавершитьПроверку(Состояние, Истина);
КонецПроцедуры
&НаКлиенте
Процедура НеожиданныйУспех(Состояние) Экспорт
Попытка
ЗавершитьПроверку(Состояние, Ложь);
Исключение
ОсвободитьРесурсы(Состояние);
Выполняется = Ложь;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура ЗавершитьПроверку(Состояние, Отказ) Экспорт
Попытка
Сообщить(Отказ);
Сообщить(Не Состояние.Поток.ДоступнаЗапись);
Сообщить(Состояние.Поток.Размер() = 6);
Сообщить(ПолучитьСтрокуИзДвоичныхДанных(Состояние.Данные, КодировкаТекста.UTF8) = "ABC123");
ОсвободитьРесурсы(Состояние);
Выполняется = Ложь;
Исключение
ОсвободитьРесурсы(Состояние);
Выполняется = Ложь;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Разбор по шагам
Получаем настоящий readonly-поток и сохраняем исходные ДвоичныеДанные в состоянии.
Оповещение содержит обработчик успеха и отдельный обработчик ошибки. Для ожидаемой ошибки СтандартнаяОбработка выключается только в этом учебном отрицательном тесте.
Немедленное исключение вызова Начать… также проверяется и освобождает ресурс, не остаётся без обработки.
НеожиданныйУспех передаёт Ложь: такой исход не называется выполненной отрицательной проверкой. После любой ветки ресурс закрывается.
Как проверить результат
Четыре сравнения Истина: отказ, отсутствие записи, размер 6, исходный ABC123.
Если первое сравнение Ложь, тест не пройден; остальные проверки не заменяют факт ожидаемого отказа.
Ожидаемый результат
Отличены ожидаемый отказ readonly-операции и неожиданный успех запуска/завершения.
На что обратить внимание
Не подавляйте СтандартнаяОбработка для всех ошибок рабочей интеграции: здесь ошибка ожидаема и выводится.
В обычном коде сначала проверяйте ДоступнаЗапись. Здесь запрет намеренно тестируется на своём источнике.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.