Дождаться скрытия и восстановления собственного файла

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

Каждую установку Hidden ожидаем до чтения нового значения. Два действия не запускаются одновременно, файл остаётся прежним.

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

Полный модуль пустой управляемой формы учебной 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. Размер проверяем отдельно, а общий обработчик очистки снимает Hidden даже при ошибке в середине урока.

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

  1. Три сравнения Истина, промежуточно Hidden=True, затем False.

  2. Содержимое осталось шестибайтным и не передавалось в сеть.

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

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

Отработана последовательная асинхронная смена Hidden с обратной проверкой.

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

  1. ПолучитьНевидимостьАсинх без Ждать возвращает не готовый Булево-результат.

  2. Hidden не заменяет управление правами или защиту секретов.

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

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

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

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

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