Получить временный каталог асинхронно и спланировать свой отчёт

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

Ждать получает строку каталога текущего клиента. Проверяем каталог и свободное собственное имя, рассчитываем отчёт на 750, но не записываем файл.

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

Модуль новой управляемой формы учебной внешней обработки. Код содержит готовые процедуры с директивами; вставляйте на уровне модуля, не внутрь другого обработчика. Каждую задачу запускайте в отдельной копии формы.

Подготовка

  1. В отдельной учебной базе 8.5.1.1343 создайте внешнюю обработку УчебныйПланФайла с пустой управляемой основной формой. Для этого урока используйте тонкий клиент Windows.

  2. В свойствах формы → События назначьте ПриСозданииНаСервере. Вставьте весь код на уровне модуля формы, включая Перем Занято и асинхронный обработчик команды.

  3. Не создавайте кнопку вручную: она добавляется серверным обработчиком. Каждый урок запускайте в отдельной копии формы, сохранённой в своей EPF.

  4. Кнопка получает настоящий каталог клиентского компьютера и составляет план собственного текстового отчёта о трёх книгах по 250. Она не записывает, не открывает и не удаляет этот файл.

  5. Объект Файл описывает путь, но его создание в коде не создаёт файл на диске. Проверки существования и типа каталога используют асинхронные методы с Ждать.

  6. РабочийКаталогДанныхПользователяАсинх может сам создать отсутствующий пользовательский каталог этой базы. Для соответствующего урока сначала показывается вопрос с Нет по умолчанию.

  7. Веб-клиенту для этих методов нужно предварительно подключённое расширение работы с файлами; данный урок не устанавливает его и не обещает работу в браузере без расширения.

  8. Запуск в 1С не проверен. Пути зависят от текущего клиента и пользователя; не копируйте чужой абсолютный путь и не публикуйте личные пути из сообщений.

Перем Занято;

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    КомандаДействия = ЭтаФорма.Команды.Добавить("УчебноеДействие");
    КомандаДействия.Действие = "УчебноеДействие";
    КомандаДействия.Заголовок = "Составить собственный план файла без записи";
    КомандаДействия.Подсказка = "Действие только над данными учебной формы";
    КомандаДействия.ИзменяетСохраняемыеДанные = Ложь;
    Кнопка = Элементы.Добавить("КнопкаУчебноеДействие", Тип("КнопкаФормы"));
    Кнопка.ИмяКоманды = КомандаДействия.Имя;
    Кнопка.Заголовок = КомандаДействия.Заголовок;
КонецПроцедуры

&НаКлиенте
Асинх Процедура УчебноеДействие(Команда)
    Если Занято = Истина Тогда
        Возврат;
    КонецЕсли;
    Занято = Истина;
    Элементы.КнопкаУчебноеДействие.Доступность = Ложь;
    Попытка
        ИмяКаталога = Ждать КаталогВременныхФайловАсинх();
        Если ТипЗнч(ИмяКаталога) <> Тип("Строка") Тогда
            ВызватьИсключение "Каталог должен быть строкой, а не объектом Обещание";
        КонецЕсли;
        Если ПустаяСтрока(ИмяКаталога) Тогда
            ВызватьИсключение "Клиент не вернул каталог для учебного плана";
        КонецЕсли;
        Каталог = Новый Файл(ИмяКаталога);
        СуществуетКаталог = Ждать Каталог.СуществуетАсинх();
        Если Не СуществуетКаталог Тогда
            ВызватьИсключение "Полученный каталог отсутствует: вручную создавать его этот урок не будет";
        КонецЕсли;
        ЭтоКаталог = Ждать Каталог.ЭтоКаталогАсинх();
        Если Не ЭтоКаталог Тогда
            ВызватьИсключение "Полученный путь не соответствует каталогу";
        КонецЕсли;
        Разделитель = ПолучитьРазделительПутиКлиента();
        Если Разделитель <> "\" И Разделитель <> "/" Тогда
            ВызватьИсключение "Неожиданный разделитель клиентского пути";
        КонецЕсли;
        Если Прав(ИмяКаталога, 1) <> Разделитель Тогда
            ИмяКаталога = ИмяКаталога + Разделитель;
        КонецЕсли;
        СобственноеИмя = "guide-owned-" + Строка(Новый УникальныйИдентификатор) + ".txt";
        ПолноеИмя = ИмяКаталога + СобственноеИмя;
        ПланФайла = Новый Файл(ПолноеИмя);
        ИмяЗанято = Ждать ПланФайла.СуществуетАсинх();
        Если ИмяЗанято Тогда
            ВызватьИсключение "Имя уже занято: не открываем и не перезаписываем чужой файл";
        КонецЕсли;
        Количество = 3;
        Цена = 250;
        Сумма = Количество * Цена;
        ТекстОтчета = СтрШаблон("Учебные книги: %1 шт. по %2; сумма %3", Количество, Цена, Сумма);
        Сообщить(Сумма = 750);
        Сообщить(ПланФайла.Имя = СобственноеИмя);
        Сообщить(ПланФайла.Расширение = ".txt");
        Сообщить("Планируемый собственный путь, файл не создан: " + ПланФайла.ПолноеИмя);
        Сообщить(ТекстОтчета);
        Сообщить("Проверка свободного имени не резервирует его. Перед будущей записью требуется безопасное создание нового файла");
    Исключение
        Занято = Ложь;
        Элементы.КнопкаУчебноеДействие.Доступность = Истина;
        ВызватьИсключение;
    КонецПопытки;
    Занято = Ложь;
    Элементы.КнопкаУчебноеДействие.Доступность = Истина;
КонецПроцедуры

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

  1. Команда объявлена Асинх Процедура. Занято и отключённая кнопка не дают запустить второй проход во время ожидания.

  2. КаталогВременныхФайловАсинх возвращает Обещание; только после Ждать проверяем строку и отсутствие пустого результата.

  3. Два асинхронных метода Файл отдельно проверяют существование и то, что путь соответствует каталогу.

  4. Разделитель берём для клиентского компьютера. Уже имеющийся конечный разделитель не дублируем; собственное имя содержит новый UUID.

  5. После проверки незанятости имени вычисляем 3 × 250 = 750 и выводим план. На исключении и обычном завершении кнопка снова доступна.

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

  1. Ожидаются три Истина, текст отчёта с количеством 3, ценой 250 и суммой 750. Путь соответствует временному каталогу фактического клиента.

  2. Нажмите снова: UUID и имя отличаются. Файл не появляется; проверка свободного имени не означает резервирование.

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

Готов настоящий план собственного временного отчёта с проверкой каталога, формулы и будущего имени без записи.

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

  1. Не присваивайте переменной результат без Ждать: тогда в ней Обещание, а не путь.

  2. Клиентский временный каталог не является серверным; передача строки на сервер не даёт серверу доступ к этому пути.

  3. Временный каталог не подходит для бессрочного хранения: этот урок намеренно не создаёт постоянный документ.

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

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

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

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

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