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