Дождаться инициализации карточки уже созданного файла

Учебные задачи

ИнициализироватьАсинх возвращает обещание с объектом Файл. Сам учебный файл создан ранее потоком: инициализация карточки не записывает ABC123 повторно.

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

Полный модуль пустой управляемой формы учебной EPF; клиент Windows с разрешённым доступом к своим временным файлам.

Подготовка

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

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

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

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

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

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

  7. Файл содержит только собственную ASCII-строку ABC123 (6 байтов без BOM). Поток записи закрывается перед чтением/изменением атрибутов.

  8. Все файлы примера создаются заново. Скрытость/readonly при очистке снимаются только у собственного файла после закрытия, затем точное имя удаляется.

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

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

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

  1. Перед вызовом уже существует собственный шестибайтный файл с закрытым потоком записи.

  2. Ждать извлекает результат типа Файл из обещания; тип проверяем до ПолноеИмя.

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

  4. Проверки существования и размера также ожидаются. Без Ждать это были бы обещания, не конечные значения.

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

  1. Три сравнения Истина: правильное имя, существование и размер 6.

  2. Возвращённая Карточка не является файловым потоком; метод не создал новые данные.

  3. Последнее сравнение Истина: собственный временный файл удалён после снятия readonly/скрытости.

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

Получен типизированный результат асинхронной инициализации карточки собственного файла.

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

  1. Не называйте ИнициализироватьАсинх записью файла: это инициализация объекта Файл.

  2. Мобильные content:-пути и веб-клиент имеют отдельную подготовку; данный пример только Windows.

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

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

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

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

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