ДвоичныеДанные.ЗаписатьАсинх

Методы · WriteAsync

Асинхронная функция. Записывает двоичные данные в файл или поток.

Синтаксис

ЗаписатьАсинх(<ИмяФайла>)
ЗаписатьАсинх()
ЗаписатьАсинх(<Поток>)
Полное описание, параметры и ограничения

ДвоичныеДанные.ЗаписатьАсинх (BinaryData.WriteAsync)

ДвоичныеДанные (BinaryData)

ЗаписатьАсинх (WriteAsync)

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

Вариант синтаксиса: В файл

Синтаксис:
ЗаписатьАсинх(<ИмяФайла>)
Параметры:

<ИмяФайла> (обязательный)
Тип: Строка.
Имя файла, в который требуется записать двоичные данные.
Описание варианта метода:
Записать двоичные данные в файл с заданным именем.
Вариант синтаксиса: Запись в файл

Синтаксис:
ЗаписатьАсинх()
Описание варианта метода:
Записывает двоичные данные в файл с указанным именем.
Вариант синтаксиса: Запись в поток

Синтаксис:
ЗаписатьАсинх(<Поток>)
Параметры:

<Поток> (обязательный)
Тип: Поток.
Поток, в который требуется записать двоичные данные.
Описание варианта метода:
Записывает двоичные данные в заданный поток.
Возвращаемое значение:
Тип: Обещание.
Результат выполнения обещания - Неопределено.
Описание:

Асинхронная функция. Записывает двоичные данные в файл или поток.

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

Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер).

См. также:
ДвоичныеДанные, метод Записать
ДвоичныеДанные, метод НачатьЗапись

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

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

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

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

Ждать: записать только свой новый UTF8 payload и прочитать реальные bytes

Реальный собственный UUID-файл с запретом перезаписи, полным guard, ожиданием/экспортируемым native callback и exact-size/bytes readback. Completion не заменяет проверку фактического содержимого.

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

Полный собственный толстоклиентский модуль управляемой формы Windows; server только guard, actualfiles/1C0.

Подготовка

  1. Создайте отдельную новую пустую файловую ИБ на платформе ровно8.5.1.1343: корень конфигурации УчебныеАрхивыИБуферы85, управляемое приложение, русский встроенный язык, совместимость Не использовать. Рабочие базы/каталоги/архивы в этом уроке запрещены.

  2. В конфигурации0предметных объектов/регистров/общих реквизитов/подписок/заданий/внешних источников. Никаких расширений базы или сеанса. Полный guard server-процедуры проверяет это и отсутствие активной транзакции.

  3. Запускайте только толстый управляемый Windows-клиент8.5.1.1343, не сервер/тонкий/веб/мобильный. Желательно отдельный учебный Windows-профиль с ASCII именем OwnArchive85: legacyZIP API ограничивает национальные символы в исходных путях. SHA256 API доступен в толстом клиенте.

  4. Создайте отдельную внешнюю обработку OwnArchive85 с управляемой формой. Реквизиты ПодтверждаюСвойОпыт85 Булево исходноЛожь; ПутьОпыта85 Строка0 ТолькоПросмотр; Статус85 Строка0 многострочный ТолькоПросмотр. Назначьте ПриОткрытии; команда Выполнить85 и одноименный обработчик/кнопка, ИзменяетСохраняемыеДанныеЛожь.

  5. Вставьте весь основной модуль одного выбранного урока в форму. Уроки самостоятельны: не объединяйте одноименные процедуры. Буферный урок не создает файлов и не использует ПутьОпыта85.

  6. После подтверждения нового пустого стенда каждая файловая команда генерирует свой свежий UUID и проверяет отсутствие OwnArchive85-UUID в native клиентском временном каталоге. Путь не берется из пользовательской строки. Existing-файлы никогда не перезаписываются.

  7. Архивный fixture — только свои card.txt UTF8безBOM Книга;3;250;750 и manifest.txt со своим UUID/files=2. Файлы сначала реально записываются и сверяются с исходными bytes/размером/SHA256. Пути/маски/имена пользователя в writer не передаются.

  8. Архивы создаются в ПотокВПамяти двумя реальными API-путями: constructor(stream) и new-uninitialized→Открыть(stream). Для modern явно ТипФайлаАрхива.ZIP; пароль пустой, шифрование не заявляется. Записать финализирует writer; метода Закрыть у writer нет, он не выдумывается.

  9. Перед ИзвлечьВсе проверяются ровно2entry, exact whitelist плоских имен,0дубликатов/шифрования и точные размеры исходных байтов. Неизвестные/абсолютные пути/каталоги/traversal отказываются до распаковки. Это только свой только что построенный архив, не универсальный валидатор чужих ZIP.

  10. Output out-1/out-2 создаются внутри только своего UUID каталога после проверки отсутствия/пустоты. ИзвлечьВсе передается лишь обязательный Путь: native modern8.5 описывает второй параметр как Строка, поэтому неподтвержденное enum-значение туда не подставляется. Плоский whitelist не требует восстановленных каталогов.

  11. У ExtractAll результат подтверждается по обоим файлам: exact bytes, размеры иSHA256file=mempayload. Legacy Найти/Получить проверяются на реально полученной коллекции, с missing-name и index=count. Modern Find/Get native ошибочно описаны без аргументов и в этом уроке не угадываются.

  12. Ждать и callback уроки записывают отдельный свой новый payload.txt. Promise дает Неопределено; callback — только К; error callback3аргумента. Имя/bytes не принимаются от незнакомого объекта и completion не выдается за успешность без readback.

  13. Новые собственные учебные файлы/output-папки после ВАШЕГО ручного опыта остаются по показанному пути для контроля. Автоматического/рекурсивного удаления нет. При ошибке не повторяйте запись в старую UUID-папку; не подставляйте рабочий каталог.

  14. Здесь actual1C/files/archivewrites/network0: написаны только примеры и статические тесты. Архивные fixtures в offline-тестах исключительно in-memory и не являются резервными копиями. До ручного запуска итоговые сообщения — ожидаемый протокол.

&НаКлиенте
Асинх Процедура Выполнить85(Команда)
    Если Занято85 Тогда
        ВызватьИсключение "Дождитесь своей предыдущей записи";
    КонецЕсли;
    Занято85 = Истина;
    Статус85 = "Своя асинхронная запись еще не подтверждена";
    Попытка
        К = ПодготовитьСвойКаталог85();
        ПутьОпыта85 = К.Корень;
        Данные = ПолучитьДвоичныеДанныеИзСтроки("Own payload " + К.UUID + ": Книга;3;250;750", КодировкаТекста.UTF8, Ложь);
        ПроверитьНовыйСвойФайл85(К, "payload.txt");
        Результат = Ждать Данные.ЗаписатьАсинх(СвоеИмяФайла85(К, "payload.txt"));
        Если Результат <> Неопределено Тогда
            ВызватьИсключение "WriteAsync promise должен завершиться Неопределено, не файлом или Bool";
        КонецЕсли;
        ПроверитьСвойФайл85(К, "payload.txt", Данные);
        Статус85 = "UUID " + К.UUID + ": Ждать записал свой новый payload.txt, размер и bytes совпали. Файл оставлен, ничего не удалено";
    Исключение
        Статус85 = "Своя async запись/bytes не подтверждены. Своя папка при наличии оставлена";
    КонецПопытки;
    Занято85 = Ложь;
КонецПроцедуры

&НаКлиенте
Функция ПодготовитьСвойКаталог85()
    ПроверитьСвоегоКлиента85();
    UUIDОпыта = Строка(Новый УникальныйИдентификатор);
    Если UUIDОпыта = "00000000-0000-0000-0000-000000000000" Тогда
        ВызватьИсключение "Нельзя использовать пустой UUID";
    КонецЕсли;
    База = КаталогВременныхФайлов();
    Если Прав(База, 1) <> "\" Тогда
        База = База + "\";
    КонецЕсли;
    Корень = База + "OwnArchive85-" + UUIDОпыта + "\";
    Папка = Новый Файл(Корень);
    Если Папка.Существует() Тогда
        ВызватьИсключение "Свой UUID-каталог должен быть новым; перезапись запрещена";
    КонецЕсли;
    СоздатьКаталог(Корень);
    Если Не Папка.Существует() Или Не Папка.ЭтоКаталог() Тогда
        ВызватьИсключение "Собственный новый каталог не создан";
    КонецЕсли;
    Возврат Новый Структура("UUID,Корень", UUIDОпыта, Корень);
КонецФункции

&НаКлиенте
Функция СвоеИмяФайла85(К, Имя)
    Если СтрРазделить("card.txt,manifest.txt,payload.txt", ",").Найти(Имя) = Неопределено Тогда
        ВызватьИсключение "Разрешены только свои три фиксированных имени без путей/масок";
    КонецЕсли;
    Возврат К.Корень + Имя;
КонецФункции

&НаКлиенте
Процедура ПроверитьНовыйСвойФайл85(К, Имя)
    Файл = Новый Файл(СвоеИмяФайла85(К, Имя));
    Если Файл.Существует() Тогда
        ВызватьИсключение "В собственном UUID опыте перезаписывать файл нельзя";
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьСвойФайл85(К, Имя, Данные)
    Путь = СвоеИмяФайла85(К, Имя);
    Файл = Новый Файл(Путь);
    Если Не Файл.Существует() Или Не Файл.ЭтоФайл() Или Файл.Размер() <> Данные.Размер() Тогда
        ВызватьИсключение "Нужен свой реальный файл с точным размером";
    КонецЕсли;
    Факт = Новый ДвоичныеДанные(Путь);
    Если Base64Строка(Факт) <> Base64Строка(Данные) Тогда
        ВызватьИсключение "Свой файл не совпадает побайтно с исходным payload";
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Перем Занято85;

&НаКлиенте
Процедура ПриОткрытии(Отказ)
    Занято85 = Ложь;
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьСвоегоКлиента85()
    ПроверитьСеанс85();
    #Если ТолстыйКлиентУправляемоеПриложение Тогда
        Система = Новый СистемнаяИнформация;
        Если (Система.ТипПлатформы <> ТипПлатформы.Windows_x86 И Система.ТипПлатформы <> ТипПлатформы.Windows_x86_64) Или Не ПодтверждаюСвойОпыт85 Тогда
            ВызватьИсключение "Только свой новый пустой Windows-стенд и толстый управляемый клиент8.5.1.1343";
        КонецЕсли;
    #Иначе
        ВызватьИсключение "Этот own файловый урок не предназначен для сервера, тонкого, веб или мобильного клиента";
    #КонецЕсли
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ПроверитьСеанс85()
    ПроверитьСвойПустойСтенд();
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ПроверитьСвойПустойСтенд()
    Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
        ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
    КонецЕсли;
    Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
        ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
    КонецЕсли;
    Источники = Новый Массив;
    Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
    Для Каждого Источник Из Источники Цикл
        Расширения = РасширенияКонфигурации.Получить(, Источник);
        Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
            ВызватьИсключение "Native список расширений должен иметь тип Массив";
        КонецЕсли;
        Если Расширения.Количество() <> 0 Тогда
            ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
        КонецЕсли;
    КонецЦикла;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
    КонецЕсли;
КонецПроцедуры

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

  1. В своей пустой Windows ИБ подтвердите только собственный новый опыт; перед файловой записью проверяются версия,metadata,0расширений/транзакций и нужный client.

  2. Создаем actual fresh UUID-temp-root; payload.txt ограничен собственным whitelist и должен отсутствовать.

  3. UTF8безBOM payload содержит собственныйUUID и Книга/3/250/750. Он создается здесь, а не передается неизвестным исходным объектом.

  4. Ждать Данные.ЗаписатьАсинх(свойПуть) должен дать Неопределено. Нельзя считать результатом имя файла или Булево.

  5. После completion настоящий файл существует, это файл, его размер равен собственным bytes. Читаем новый ДвоичныеДанные(путь), сравниваем Base64 побайтно с собственным payload.

  6. При исключении итог неподтвержден, Занято85 снято. Никакого автоматического перезапуска или перезаписи частичного output.

  7. Повторная команда во время ожидания/вызова запрещена; закрытие клиента не гарантирует callback. Дождитесь результата в своей форме.

  8. После вашего ручного запуска own payload остается по ПутьОпыта85. Ничего не удаляем, рабочие файлы не открываем; actualfiles/1C0.

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

  1. Свой файл отсутствует до записи; после совпадают exact bytes/размер, не только отсутствие исключения.

  2. Promise=Неопределено либо successCallback1arg, errorCallback3args — native контракты соблюдены.

  3. Только свой свежий UUID-temp-path и whitelist имя, без overwrite или непроверенного input.

  4. Занято снимается после результата/ошибки, не до записи. File/root остаются для пользователя, runtime0.

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

Ожидаемый ручной результат: свой новый payload.txt exact UTF8 bytes/размер, правильный completion и отображенный own путь. Фактическая запись здесь не выполнялась.

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

  1. WriteAsync/BeginWrite перезаписывают указанный путь; потому новый собственный UUID и отсутствие файла проверяются до вызова.

  2. Если форма/процесс закрыты во время операции, completion не гарантируется. Проверьте только собственную папку вручную, автоматической очистки нет.

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

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

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

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

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