Проверяет, является ли переданный адрес адресом файла во временном хранилище.
Синтаксис
ЭтоАдресВременногоХранилища(<Адрес>)Полное описание, параметры и ограничения
Глобальный контекст.ЭтоАдресВременногоХранилища (Global context.IsTempStorageURL)
Глобальный контекст (Global context)
ЭтоАдресВременногоХранилища (IsTempStorageURL)
Доступен, начиная с версии 8.2.
Синтаксис:
ЭтоАдресВременногоХранилища(<Адрес>)
Параметры:
<Адрес> (обязательный)
Тип: Строка.
Адрес файла во временном хранилище, который необходимо проверить.
Возвращаемое значение:
Тип: Булево.
Описание:
Проверяет, является ли переданный адрес адресом файла во временном хранилище.
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
Использование в версии:
Доступен, начиная с версии 8.2.
Методическая информация
Практические примеры
Передать свой TXT старым API: одиночный, пакетный и через оповещения
Одна собственная учебная задача тремя способами: создаёт новый текст «50»/«75», передаёт во временное хранилище, получает новый файл и проверяет настоящие байты, SHA-256, строки и сумму 125. У каждого способа — настоящая кнопка, а у оповещений — настоящие процедуры платформы.
Где и как запускать
Полный модуль своей управляемой формы: толстый управляемый клиент 8.5.1.1343, Windows_x86_64, новая целиком своя файловая база в собственной виртуальной машине. Клиентские пути только клиенту; временное хранилище действительно передаётся через обращения к серверу платформы.
Подготовка
Это урок сопровождения старого API, а не рекомендация для нового рабочего проекта. ПоместитьФайл/ПоместитьФайлы/ПолучитьФайлы не рекомендуются с 8.3.13; ПолучитьФайл и выбранные Начать… — с 8.3.15. Здесь подготовлен только исходник: 1С и передачи не запускались.
Все будущие действия выполняйте вручную только в новой собственной виртуальной машине с 64-битной Windows, отдельным профилем и пустой файловой информационной базой 8.5.1.1343. Создайте новую конфигурацию УчебнаяКлассическаяПередача85, основной режим Управляемое приложение, совместимость Не использовать. Это не рабочая база и не её копия.
Для двух синхронных вариантов разрешите модальность в свойствах своей конфигурации; не выбирайте НеИспользовать. Именно для НеИспользовать справка ПоместитьФайл рекомендует НачатьПомещениеФайла. Не меняйте этот режим программно и не переносите синхронные варианты в веб-клиент, мобильный клиент или фоновый серверный модуль.
Вручную подготовьте отдельный собственный каталог C:\OneCClassic125\ в этом новом стенде и права своего пользователя на него. Без посторонних писателей, ссылок и сетевых папок. Код создаёт новые имена сам; пути, адреса и содержимое пользователь в форме не вводит.
Конфигуратор → Общие → Общие формы: создайте управляемую КлассическаяПередача12585. ПодтверждаюСвоиФайлы85: Булево, начальное значение Ложь; Протокол85: Строка длиной 0 (неограниченная), многострочное поле ТолькоПросмотр. Внутренние переменные модуля не создавайте как редактируемые реквизиты.
У формы вручную задайте оба разных свойства: АвтоматическоеСохранениеДанныхВНастройках = АвтоматическоеСохранениеДанныхФормыВНастройках.НеИспользовать; СохранениеДанныхВНастройках = СохранениеДанныхФормыВНастройках.НеИспользовать. Обработчика ПриОткрытии здесь нет: открытие формы не запускает передачу.
В форме → Команды создайте СинхОдин85, СинхНабор85, ЧерезОповещения85; у каждой Действие = одноимённая процедура, использование текущей/выделенных строк НеИспользует. Добавьте три кнопки. Основной блок вставьте целиком в пустой модуль этой формы вместо пустых автоматически созданных процедур.
Общие → Подсистемы: собственная УчебныеФайлы12585. Общие → Общие команды: ОткрытьКлассическуюПередачу12585 без параметра, включите в состав своей подсистемы и её командный интерфейс. Второй блок целиком вставьте в пустой модуль именно этой общей команды. Оповещения не привязываются к кнопкам: их вызовет платформа через ОписаниеОповещения.
F7: проверьте свою конфигурацию для клиента/сервера и обновите только свой стенд. Запустите толстый управляемый клиент 8.5.1.1343 в 64-битной Windows, откройте форму настоящей общей командой, вручную установите свой флажок и выберите ровно одну кнопку. Каждый следующий вариант — только новый экземпляр формы.
&НаКлиенте
Перем Фаза85;
&НаКлиенте
Перем НомерОпыта85;
&НаКлиенте
Перем ИдентификаторФормы85;
&НаКлиенте
Перем Исходник85;
&НаКлиенте
Перем Приемник85;
&НаКлиенте
Перем ИмяПриемника85;
&НаКлиенте
Перем Текст85;
&НаКлиенте
Перем КодБайтов85;
&НаКлиенте
Перем Хеш85;
&НаКлиенте
Перем Адрес85;
&НаКлиенте
Процедура Стоп85()
Фаза85 = "СТОП";
Протокол85 = "СТОП. Передача и расчёт не подтверждены. Автоматической повторной попытки и очистки нет.";
КонецПроцедуры
&НаКлиенте
Процедура СинхОдин85(Команда)
Протокол85 = "";
#Если ТолстыйКлиентУправляемоеПриложение Тогда
Попытка
НачатьОпыт85(Команда, "СинхОдин85", "single");
Адрес85 = "";
ВыбранноеИмя85 = "";
Помещен85 = ПоместитьФайл(Адрес85, Исходник85, ВыбранноеИмя85, Ложь, ИдентификаторФормы85);
Если ТипЗнч(Помещен85) <> Тип("Булево") Или Не Помещен85
Или ТипЗнч(ВыбранноеИмя85) <> Тип("Строка") Или ВыбранноеИмя85 <> Исходник85 Тогда
ВызватьИсключение "Одиночное помещение не подтверждено";
КонецЕсли;
ПроверитьХранилище85();
ПроверитьПустоеНазначение85();
Фаза85 = "ПОЛУЧЕНИЕ";
Получен85 = ПолучитьФайл(Адрес85, Приемник85, Ложь);
Если ТипЗнч(Получен85) <> Тип("Булево") Или Не Получен85 Тогда
ВызватьИсключение "Нужен настоящий успешный Булево, не Неопределено";
КонецЕсли;
Завершить85("ПолучитьФайл вернул: " + Строка(Получен85));
Исключение
Стоп85();
КонецПопытки;
#Иначе
Если ТипЗнч(Команда) <> Тип("КомандаФормы") Тогда
ВызватьИсключение "Нужна настоящая команда формы";
КонецЕсли;
Стоп85();
#КонецЕсли
КонецПроцедуры
&НаКлиенте
Процедура СинхНабор85(Команда)
Протокол85 = "";
#Если ТолстыйКлиентУправляемоеПриложение Тогда
Попытка
НачатьОпыт85(Команда, "СинхНабор85", "batch");
Помещенные85 = Новый Массив;
Помещен85 = ПоместитьФайлы(, Помещенные85, Исходник85, Ложь, ИдентификаторФормы85);
Если ТипЗнч(Помещен85) <> Тип("Булево") Или Не Помещен85 Тогда
ВызватьИсключение "Пакетное помещение не подтверждено";
КонецЕсли;
Адрес85 = ПринятьПомещение85(Помещенные85);
ПроверитьХранилище85();
ПроверитьПустоеНазначение85();
Получаемые85 = ПолучаемыйНабор85();
Полученные85 = Новый Массив;
Фаза85 = "ПОЛУЧЕНИЕ";
Получен85 = ПолучитьФайлы(Получаемые85, Полученные85, "C:\OneCClassic125\", Ложь);
Если ТипЗнч(Получен85) <> Тип("Булево") Или Не Получен85 Тогда
ВызватьИсключение "Пакетное получение не подтверждено";
КонецЕсли;
ПринятьПолучение85(Полученные85);
Завершить85("ПолучитьФайлы вернул: " + Строка(Получен85) + "; фактических описаний: " + Строка(Полученные85.Количество()));
Исключение
Стоп85();
КонецПопытки;
#Иначе
Если ТипЗнч(Команда) <> Тип("КомандаФормы") Тогда
ВызватьИсключение "Нужна настоящая команда формы";
КонецЕсли;
Стоп85();
#КонецЕсли
КонецПроцедуры
&НаКлиенте
Процедура ЧерезОповещения85(Команда)
Протокол85 = "";
#Если ТолстыйКлиентУправляемоеПриложение Тогда
Попытка
НачатьОпыт85(Команда, "ЧерезОповещения85", "callback");
Оповещение85 = Новый ОписаниеОповещения("ПослеПомещения85", ЭтотОбъект, НомерОпыта85, "ПриОшибкеПередачи85", ЭтотОбъект);
Фаза85 = "ОЖИДАНИЕ ПОМЕЩЕНИЯ";
Протокол85 = "Ожидание помещения. Свой источник: " + Исходник85 + "; своё назначение: " + Приемник85;
НачатьПомещениеФайла(Оповещение85, , Исходник85, Ложь, ИдентификаторФормы85);
Исключение
Стоп85();
КонецПопытки;
#Иначе
Если ТипЗнч(Команда) <> Тип("КомандаФормы") Тогда
ВызватьИсключение "Нужна настоящая команда формы";
КонецЕсли;
Стоп85();
#КонецЕсли
КонецПроцедуры
#Если ТолстыйКлиентУправляемоеПриложение Тогда
&НаКлиенте
Процедура НачатьОпыт85(Команда, ИмяКоманды85, Способ85)
Если Фаза85 <> Неопределено Тогда
ВызватьИсключение "Этот экземпляр формы уже использован";
КонецЕсли;
Фаза85 = "ПОДГОТОВКА";
Согласен85 = ПодтверждаюСвоиФайлы85;
ПодтверждаюСвоиФайлы85 = Ложь;
Если ТипЗнч(Согласен85) <> Тип("Булево") Или Не Согласен85 Тогда
ВызватьИсключение "Сначала вручную подтвердите собственный новый стенд";
КонецЕсли;
Если ТипЗнч(Команда) <> Тип("КомандаФормы") Или Команда.Имя <> ИмяКоманды85 Или ИмяФормы <> "ОбщаяФорма.КлассическаяПередача12585" Или АвтоматическоеСохранениеДанныхВНастройках <> АвтоматическоеСохранениеДанныхФормыВНастройках.НеИспользовать Или СохранениеДанныхВНастройках <> СохранениеДанныхФормыВНастройках.НеИспользовать Тогда
ВызватьИсключение "Нужны собственные команда, форма и пустая учебная конфигурация";
КонецЕсли;
Среда85 = Новый СистемнаяИнформация;
Если Среда85.ТипПлатформы <> ТипПлатформы.Windows_x86_64 Тогда
ВызватьИсключение "Нужны толстый клиент 8.5.1.1343 и 64-битная Windows";
КонецЕсли;
ИдентификаторФормы85 = УникальныйИдентификатор;
Если ТипЗнч(ИдентификаторФормы85) <> Тип("УникальныйИдентификатор") Тогда
ВызватьИсключение "Не получен настоящий идентификатор экземпляра формы";
КонецЕсли;
Корень85 = Новый Файл("C:\OneCClassic125\");
ЕстьКорень85 = Корень85.Существует();
Если ТипЗнч(ЕстьКорень85) <> Тип("Булево") Или Не ЕстьКорень85 Тогда
ВызватьИсключение "Вручную подготовьте собственный каталог стенда";
КонецЕсли;
КореньФайл85 = Корень85.ЭтоФайл();
Если ТипЗнч(КореньФайл85) <> Тип("Булево") Или КореньФайл85 Тогда
ВызватьИсключение "Собственный корень должен быть каталогом";
КонецЕсли;
НомерОпыта85 = Новый УникальныйИдентификатор;
Метка85 = Строка(НомерОпыта85);
Исходник85 = "C:\OneCClassic125\seed_" + Метка85 + ".txt";
ИмяПриемника85 = Способ85 + "_" + Метка85 + ".txt";
Приемник85 = "C:\OneCClassic125\" + ИмяПриемника85;
ПроверитьПустоеНазначение85();
Источник85 = Новый Файл(Исходник85);
Если Источник85.Существует() Тогда
ВызватьИсключение "Имя своего источника занято";
КонецЕсли;
Текст85 = "50" + Символы.ПС + "75";
Байты85 = ПолучитьДвоичныеДанныеИзСтроки(Текст85, "UTF-8", Ложь);
Если ТипЗнч(Байты85) <> Тип("ДвоичныеДанные") Тогда
ВызватьИсключение "Не получены настоящие двоичные данные своего текста";
КонецЕсли;
КодБайтов85 = Base64Строка(Байты85);
Хеш85 = ХешДанных85(Байты85);
ПроверитьСодержимое85(Байты85);
Поток85 = Новый ФайловыйПоток(Исходник85, РежимОткрытияФайла.СоздатьНовый);
Фаза85 = "ЗАПИСЬ ИСТОЧНИКА";
Байты85.Записать(Поток85);
Фаза85 = "ЗАКРЫТИЕ ИСТОЧНИКА";
Поток85.Закрыть();
ПроверитьСвойФайл85(Исходник85);
Фаза85 = "ПОМЕЩЕНИЕ";
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьПустоеНазначение85()
Назначение85 = Новый Файл(Приемник85);
Занято85 = Назначение85.Существует();
Если ТипЗнч(Занято85) <> Тип("Булево") Или Занято85 Тогда
ВызватьИсключение "Собственное назначение занято, получение запрещено";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Функция ХешДанных85(Данные85)
Если ТипЗнч(Данные85) <> Тип("ДвоичныеДанные") Тогда
ВызватьИсключение "Хешировать можно только настоящие двоичные данные";
КонецЕсли;
Расчет85 = Новый ХешированиеДанных(ХешФункция.SHA256);
Расчет85.Добавить(Данные85);
ХешБайты85 = Расчет85.ХешСумма;
Если ТипЗнч(ХешБайты85) <> Тип("ДвоичныеДанные") Тогда
ВызватьИсключение "SHA-256 не вернул документированные двоичные данные";
КонецЕсли;
Возврат Base64Строка(ХешБайты85);
КонецФункции
&НаКлиенте
Функция ПроверитьСодержимое85(Данные85)
Если ТипЗнч(Данные85) <> Тип("ДвоичныеДанные") Тогда
ВызватьИсключение "Нет двоичных данных для проверки";
КонецЕсли;
Код85 = Base64Строка(Данные85);
ХешПолученный85 = ХешДанных85(Данные85);
Прочитано85 = ПолучитьСтрокуИзДвоичныхДанных(Данные85, "UTF-8");
Если ТипЗнч(Код85) <> Тип("Строка") Или Код85 <> КодБайтов85
Или ТипЗнч(ХешПолученный85) <> Тип("Строка") Или ХешПолученный85 <> Хеш85
Или ТипЗнч(Прочитано85) <> Тип("Строка") Или Прочитано85 <> Текст85 Тогда
ВызватьИсключение "Полные байты, SHA-256 или текст не совпали с собственным источником";
КонецЕсли;
Строк85 = СтрЧислоСтрок(Прочитано85);
Если ТипЗнч(Строк85) <> Тип("Число") Или Строк85 <> 2 Тогда
ВызватьИсключение "Нужны ровно две фактически прочитанные строки";
КонецЕсли;
Первая85 = СтрПолучитьСтроку(Прочитано85, 1);
Вторая85 = СтрПолучитьСтроку(Прочитано85, 2);
Если ТипЗнч(Первая85) <> Тип("Строка") Или Первая85 <> "50"
Или ТипЗнч(Вторая85) <> Тип("Строка") Или Вторая85 <> "75" Тогда
ВызватьИсключение "Две реальные строки не совпали";
КонецЕсли;
Первое85 = Число(Первая85);
Второе85 = Число(Вторая85);
Если ТипЗнч(Первое85) <> Тип("Число") Или Первое85 <> 50
Или ТипЗнч(Второе85) <> Тип("Число") Или Второе85 <> 75 Тогда
ВызватьИсключение "Преобразование двух настоящих строк не подтверждено";
КонецЕсли;
Сумма85 = Первое85 + Второе85;
Если ТипЗнч(Сумма85) <> Тип("Число") Или Сумма85 <> 125 Тогда
ВызватьИсключение "Расчёт по настоящему содержимому не подтверждён";
КонецЕсли;
Возврат "SHA-256(Base64): " + ХешПолученный85 + "; строк: " + Строка(Строк85)
+ "; " + Строка(Первое85) + " + " + Строка(Второе85) + " = " + Строка(Сумма85);
КонецФункции
&НаКлиенте
Функция ПроверитьСвойФайл85(Путь85)
Файл85 = Новый Файл(Путь85);
Есть85 = Файл85.Существует();
Если ТипЗнч(Есть85) <> Тип("Булево") Или Не Есть85 Тогда
ВызватьИсключение "Собственный файл не существует";
КонецЕсли;
ОбычныйФайл85 = Файл85.ЭтоФайл();
Если ТипЗнч(ОбычныйФайл85) <> Тип("Булево") Или Не ОбычныйФайл85 Тогда
ВызватьИсключение "По собственному пути найден не файл";
КонецЕсли;
Данные85 = Новый ДвоичныеДанные(Путь85);
Возврат ПроверитьСодержимое85(Данные85);
КонецФункции
&НаКлиенте
Процедура ПроверитьХранилище85()
Если ТипЗнч(Адрес85) <> Тип("Строка") Или Адрес85 = "" Тогда
ВызватьИсключение "Не получен настоящий адрес помещения";
КонецЕсли;
Временный85 = ЭтоАдресВременногоХранилища(Адрес85);
Если ТипЗнч(Временный85) <> Тип("Булево") Или Не Временный85 Тогда
ВызватьИсключение "Результат не является адресом временного хранилища";
КонецЕсли;
ДанныеХранилища85 = ПолучитьИзВременногоХранилища(Адрес85);
ПроверитьСодержимое85(ДанныеХранилища85);
ПроверитьСвойФайл85(Исходник85);
КонецПроцедуры
&НаКлиенте
Функция ПринятьПомещение85(Файлы85)
Если ТипЗнч(Файлы85) <> Тип("Массив") Тогда
ВызватьИсключение "Помещение не вернуло настоящий массив";
КонецЕсли;
Если Файлы85.Количество() <> 1 Тогда
ВызватьИсключение "В этом собственном пакете должен быть ровно один результат";
КонецЕсли;
АдресПолученный85 = "";
Для Каждого Результат85 Из Файлы85 Цикл
Если ТипЗнч(Результат85) <> Тип("ОписаниеПереданногоФайла") Тогда
ВызватьИсключение "Нужно настоящее описание помещённого файла";
КонецЕсли;
Хранение85 = Результат85.Хранение;
Если ТипЗнч(Результат85.Имя) <> Тип("Строка") Или Результат85.Имя <> "seed_" + Строка(НомерОпыта85) + ".txt"
Или ТипЗнч(Результат85.ПолноеИмя) <> Тип("Строка") Или Результат85.ПолноеИмя <> Исходник85
Или ТипЗнч(Хранение85) <> Тип("Строка") Или Хранение85 = "" Тогда
ВызватьИсключение "Описание помещения не совпало с собственным источником";
КонецЕсли;
АдресПолученный85 = Хранение85;
КонецЦикла;
Возврат АдресПолученный85;
КонецФункции
&НаКлиенте
Функция ПолучаемыйНабор85()
Файлы85 = Новый Массив;
Файлы85.Добавить(Новый ОписаниеПередаваемогоФайла(ИмяПриемника85, Адрес85));
Возврат Файлы85;
КонецФункции
&НаКлиенте
Процедура ПринятьПолучение85(Файлы85)
Если ТипЗнч(Файлы85) <> Тип("Массив") Тогда
ВызватьИсключение "Отмена или Неопределено не являются полученным пакетом";
КонецЕсли;
Если Файлы85.Количество() <> 1 Тогда
ВызватьИсключение "Нужен ровно один настоящий результат собственного получения";
КонецЕсли;
Для Каждого Результат85 Из Файлы85 Цикл
Если ТипЗнч(Результат85) <> Тип("ОписаниеПереданногоФайла") Тогда
ВызватьИсключение "Нужно настоящее описание полученного файла";
КонецЕсли;
Если ТипЗнч(Результат85.Имя) <> Тип("Строка") Или Результат85.Имя <> ИмяПриемника85
Или ТипЗнч(Результат85.ПолноеИмя) <> Тип("Строка") Или Результат85.ПолноеИмя <> Приемник85
Или ТипЗнч(Результат85.Хранение) <> Тип("Строка") Или Результат85.Хранение <> Адрес85 Тогда
ВызватьИсключение "Результат получения относится не к собственным пути и адресу";
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура Завершить85(ОписаниеРезультата85)
Проверка85 = ПроверитьСвойФайл85(Приемник85);
ПроверитьСвойФайл85(Исходник85);
Фаза85 = "ПРОВЕРЕНО";
Протокол85 = ОписаниеРезультата85 + ". Получен свой файл: " + Приемник85 + ". " + Проверка85;
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьОповещение85(ПолученныйНомер85, ОжидаемаяФаза85)
Если ТипЗнч(ПолученныйНомер85) <> Тип("УникальныйИдентификатор") Или ПолученныйНомер85 <> НомерОпыта85
Или Фаза85 <> ОжидаемаяФаза85 Или УникальныйИдентификатор <> ИдентификаторФормы85
Или ИмяФормы <> "ОбщаяФорма.КлассическаяПередача12585" Тогда
ВызватьИсключение "Не подтверждены собственные опыт, форма и ожидаемая стадия";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПослеПомещения85(Результат85, ПолученныйАдрес85, ВыбранныйФайл85, ПолученныйНомер85) Экспорт
Попытка
ПроверитьОповещение85(ПолученныйНомер85, "ОЖИДАНИЕ ПОМЕЩЕНИЯ");
Если ТипЗнч(Результат85) <> Тип("Булево") Или Не Результат85
Или ТипЗнч(ПолученныйАдрес85) <> Тип("Строка") Или ПолученныйАдрес85 = ""
Или ТипЗнч(ВыбранныйФайл85) <> Тип("Строка") Или ВыбранныйФайл85 <> Исходник85 Тогда
ВызватьИсключение "Настоящее окончание помещения не подтвердило собственный файл";
КонецЕсли;
Адрес85 = ПолученныйАдрес85;
ПроверитьХранилище85();
ПроверитьПустоеНазначение85();
Получаемые85 = ПолучаемыйНабор85();
Оповещение85 = Новый ОписаниеОповещения("ПослеПолучения85", ЭтотОбъект, НомерОпыта85, "ПриОшибкеПередачи85", ЭтотОбъект);
Фаза85 = "ОЖИДАНИЕ ПОЛУЧЕНИЯ";
Протокол85 = "Ожидание получения. Свой источник: " + Исходник85 + "; своё назначение: " + Приемник85;
НачатьПолучениеФайлов(Оповещение85, Получаемые85, "C:\OneCClassic125\", Ложь);
Исключение
Стоп85();
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура ПослеПолучения85(Полученные85, ПолученныйНомер85) Экспорт
Попытка
ПроверитьОповещение85(ПолученныйНомер85, "ОЖИДАНИЕ ПОЛУЧЕНИЯ");
ПринятьПолучение85(Полученные85);
Завершить85("Настоящее оповещение получения, описаний: " + Строка(Полученные85.Количество()));
Исключение
Стоп85();
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура ПриОшибкеПередачи85(Ошибка85, СтандартнаяОбработка, ПолученныйНомер85) Экспорт
Попытка
ИсходнаяСтандартная85 = СтандартнаяОбработка;
Если ТипЗнч(ИсходнаяСтандартная85) <> Тип("Булево") Тогда
ВызватьИсключение "Не получено настоящее Булево стандартной обработки ошибки";
КонецЕсли;
СтандартнаяОбработка = Ложь;
Если Фаза85 <> "ОЖИДАНИЕ ПОМЕЩЕНИЯ" И Фаза85 <> "ОЖИДАНИЕ ПОЛУЧЕНИЯ" Тогда
ВызватьИсключение "Нет ожидаемого собственного оповещения об ошибке";
КонецЕсли;
ПроверитьОповещение85(ПолученныйНомер85, Фаза85);
Если ТипЗнч(Ошибка85) <> Тип("ИнформацияОбОшибке") Тогда
ВызватьИсключение "Не получена настоящая информация об ошибке";
КонецЕсли;
Стоп85();
Протокол85 = Протокол85 + " Исходная стандартная обработка: " + Строка(ИсходнаяСтандартная85) + ".";
Исключение
Стоп85();
КонецПопытки;
КонецПроцедуры
#КонецЕслиМодуль своей общей команды ОткрытьКлассическуюПередачу12585
Своя новая CF → Общие → Общие команды → ОткрытьКлассическуюПередачу12585 → пустой модуль общей команды: вставить весь поддерживающий блок.
Настоящий клиентский ОбработкаКоманды с двумя потреблёнными параметрами платформы; только открывает собственную форму в толстом управляемом клиенте.
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
Если ПараметрКоманды <> Неопределено
Или ТипЗнч(ПараметрыВыполненияКоманды) <> Тип("ПараметрыВыполненияКоманды") Тогда
ВызватьИсключение "Используйте настоящую общую команду без параметра";
КонецЕсли;
#Если ТолстыйКлиентУправляемоеПриложение Тогда
ОткрытьФорму("ОбщаяФорма.КлассическаяПередача12585");
#Иначе
ВызватьИсключение "Этот урок предназначен только для толстого управляемого клиента";
#КонецЕсли
КонецПроцедурыРазбор по шагам
Кнопка сначала очищает старый протокол. Одна попытка расходует флажок согласия до файловых действий; имя своей конфигурации/формы, клиент, версия и два режима без сохранения настроек проверяются. Случайный новый UUID служит только меткой имени, а для времени жизни хранилища читается настоящий UUID этой формы.
Из собственного текста «50», перевод строки, «75» платформа создаёт настоящие UTF-8 двоичные данные без BOM. Считается реальный SHA-256, проверяются все байты, две строки и число 125. Новый ФайловыйПоток с двумя аргументами и СоздатьНовый создаёт seed_<UUID>.txt; запись идёт в настоящий поток, не через способную перезаписать путь запись ДвоичныеДанные.Записать(имя). После нормального Закрыть файл действительно перечитывается.
СинхОдин85: ПоместитьФайл возвращает настоящий Булево, адрес и выбранное имя через переменные; пустой исходный адрес просит новое хранилище. Затем проверяются фактические байты хранилища. ПолучитьФайл с Ложь сохраняет в новое отдельное назначение; Булево/файл/содержимое проверяются заново. Неопределено не считается успехом.
СинхНабор85: передаётся пакет ровно из одного собственного файла, чтобы сравнить тот же опыт. Спорный первый параметр ПоместитьФайлы пропущен; второй — настоящая переменная-массив результата, третий — полный собственный путь без маски. ПолучитьФайлы принимает массив собственных описаний имени/реального адреса и отдельный корневой каталог. Истина означает хотя бы один файл, поэтому весь возвращённый комплект и байты дополнительно проверяются.
ЧерезОповещения85: после создания своего источника выставляется ожидание до НачатьПомещениеФайла. Платформа передаёт процедуре завершения ровно четыре параметра; каждый проверяется, включая свой номер и реальный выбранный путь. Из настоящего адреса читаются байты. Перед НачатьПолучениеФайлов выставляется другое ожидание; его обработчик получает ровно два параметра. После Начать… нет присваивания, способного затереть уже пришедшее окончание. В ожидании протокол показывает только свои подготовленные пути.
ОписаниеОповещения указывает именно ЭтотОбъект своей формы, настоящее имя экспортируемой процедуры, свой UUID-номер и обработчик ошибки. Процедура ошибки имеет ровно три параметра платформы. Сначала сохраняется и проверяется настоящий Булево стандартной обработки, затем ставится Ложь до проверки стадии и номера, чтобы поздняя ошибка после повторной кнопки не показала технические подробности. После своих проверок показывается фиксированный отказ с прежним Булево, без текста исключения.
У действительного описания передачи только читаются Имя, ПолноеИмя и Хранение. Новый ОписаниеПереданногоФайла не создаётся. Все три способа доходят до одного чтения настоящего нового файла: полный Base64/хеш/UTF-8, две реальные строки «50»/«75», два реальных числа и вычисленная сумма 125. Свой исходник перечитывается ещё раз; отчёт использует эти фактические результаты.
Как проверить результат
Без флажка: ни источник, ни скачанный файл не создаются, успешного протокола нет. Повтор кнопки в том же экземпляре даёт СТОП даже после прежнего успеха; для нового опыта откройте новую собственную форму, не вызывайте внутренние процедуры.
При будущем успешном ручном запуске выбранной кнопки протокол показывает новый путь single_/batch_/callback_<UUID>.txt, настоящий SHA-256(Base64), число строк 2 и вычисление 50 + 75 = 125. Откройте только эти свои файлы: источник и копия имеют те же две строки. Все три кнопки проверьте в отдельных новых экземплярах.
Пакетный Булево Истина без настоящего полного описания и чтения файла не даёт успеха. Код требует ровно один фактический результат, его имя/полный путь/адрес и правильное содержимое; положение в массиве не используется.
Только в отдельном собственном учебном стенде возможна ручная отрицательная проба: во время ожидания изменить свой seed-файл или занять именно свой путь назначения из протокола. Должен быть отказ, не подтверждение 125; уже существующее назначение проверяется до получения. Не пробуйте это в рабочих каталогах и не вызывайте процедуры оповещения вручную.
Ложь, Неопределено, ошибка или неожиданный тип/путь/содержимое означают СТОП. Состояние и файлы после ошибки могут быть частичными; код не удаляет, не повторяет и не объявляет ресурсы гарантированно освобождёнными.
Ожидаемый результат
При будущем успешном ручном запуске протокол содержит фактический новый путь, SHA-256, две прочитанные строки и вычисленные 50 + 75 = 125; исходник перечитан неизменным. Отмена, неопределённый результат и ошибка не называются подтверждённой передачей.
На что обратить внимание
Это старые методы. Для нового проекта предпочтительны современные методы с именами НаСервер/ССервера. В текущей справке нет старого НачатьПолучениеФайла: здесь не выдумывается этот вызов и не дублируется уже заполненный НачатьПомещениеФайлов.
У ПоместитьФайлы первый параметр объявлен Строка, но его описание говорит о массиве. Это противоречие справки сохранено: массив в первую позицию не передаётся. Полный путь третьего параметра — документированный допустимый поиск одного файла для НайтиФайлы; маски и перечисление чужих каталогов не используются.
Адрес временного хранилища не является клиентским/серверным путём на диске. Проверка ЭтоАдресВременногоХранилища сама по себе не доказывает владение; здесь адрес получен из собственного помещения через API платформы, а фактические байты сравниваются с собственным источником. Вызовы передачи и ПолучитьИзВременногоХранилища реально обращаются к серверу при будущем запуске.
ХешированиеДанных доступно среди настольных клиентов только толстому клиенту; весь использующий его код исключён препроцессором из остальных клиентов. Клиентский путь не передаётся в серверный файловый конструктор. Для веб-клиента нужны другие ограничения и расширения; здесь их нет.
Существует и UUID-имя не являются атомарным резервированием скачанного пути или защитой от подмены/ссылок. СоздатьНовый защищает создание собственного источника от существующего файла, но API получения файла может перезаписывать. Требуется спокойный целиком свой стенд без других писателей; защищённость рабочей системы и приватность не обещаются.
Записать и Закрыть могут завершиться ошибкой. При ошибке записи дескриптор потока может остаться открытым; при ошибке закрытия его состояние неопределённо. Дополнительных попыток закрыть/перезаписать/удалить нет. Никакой гарантии сохранения первичного исключения или записи, устойчивой к аварии, не заявлено.
Файлы намеренно остаются только в своей учебной папке; автоматической очистки нет. Временное хранилище связано с уничтожением объекта формы, не обещанием мгновенного удаления при простом закрытии окна. Не закрывайте занятую форму до настоящего завершения; авария/завершение клиента не превращаются в успех.
Смена способа в использованной форме не разрешена. СТОП сохраняется в этом экземпляре, а новый опыт требует явного ручного открытия нового собственного экземпляра. Исходные примеры справки/конфигураций и старые уроки не изменялись; запуск 1С здесь не проверен.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Получить две собственные серверные записи: контролируемая папка и ручной диалог
Полный учебный маршрут с собственными данными и настоящими объектами платформы. Две записи UTF8, новые UUID, точные параметры оповещений, сопоставление по имени и независимое чтение результата. Отмена и ограничения выбора папки объясняются отдельно.
Где и как запускать
Полный модуль своей управляемой формы новой пустой файловой ИБ 8.5.1.1343. Толстый управляемый Windows x64 клиент; сервер только проверяет пустой стенд и временные данные. Фактические UI/files/1C/network операции: 0.
Подготовка
Создайте новую собственную пустую файловую информационную базу на платформе 8.5.1.1343. Имя корня конфигурации — УчебныеСсылкиИПередачаФайлов85. Русский встроенный язык, управляемое приложение, совместимость «Не использовать». Не берите рабочую базу или чужие файлы. В конфигурации нет справочников, документов, регистров, планов, задач, подписок, заданий, общих реквизитов, внешних источников и расширений.
Запускайте только толстый управляемый клиент Windows x64 под отдельным учебным профилем Windows. Справка разрешает многие эти API также в тонком, веб- и мобильном клиентах, но там отличаются доступ к файлам и диалоги. Эти варианты здесь не заявляются проверенными. Расширения браузера и внешние сервисы для выбранного маршрута не нужны.
Создайте внешнюю обработку OwnFileTransfer85 и одну управляемую форму. Реквизиты: ПодтверждаюСвойСтенд85 — Булево, начально Ложь; Занято85 — Булево, начально Ложь, ТолькоПросмотр; ПутьОпыта85 — Строка неограниченной длины, ТолькоПросмотр; Статус85 — такая же Строка, многострочная, ТолькоПросмотр. Вставьте целиком модуль выбранной карточки; два модуля не объединяйте.
Для помещения файлов на сервер добавьте реквизит ОтменитьПередНачалом85 — Булево, начально Ложь. Создайте команды и кнопки: СоздатьСвоюПару85, ПоместитьСОбычнымиПараметрами85, ПоместитьСКонструктором85, ПрочитатьСвоиFileRef85. Параметр Команда передает сама кнопка. Оповещения связывают экспортные обработчики с событиями завершения, прогресса, начала и ошибки передачи.
Download форма дополнительно: ПодтверждаюТолькоСвоюПапку85 и ПодтверждаюЗакрытыйДиалог85 Булево, начально Ложь. Кнопки: ВыгрузитьБезДиалога85, ВыгрузитьДиалогПоУмолчанию85, ВыгрузитьДиалогСКонструктором85, ПроверитьРучнойДиалог85. При каждом новом опыте код сбрасывает подтверждение закрытого диалога; поставьте его заново только после фактического ручного закрытия.
Учебные данные создаются программно: настоящий временный каталог клиента → новая отсутствующая папка OwnFileTransfer85-<новый UUID> → ровно два файла без вложенных путей: own-card.txt и own-total.txt. Кодировка UTF8 без BOM. Первая строка — UUID=<свой UUID>, затем LF и Книга;3;250 либо Сумма=750. Размер измеряется в байтах, не символах. Другой путь, лишний файл, каталог и дубликат отвергаются. Автоматического удаления нет.
Фильтр *.txt в диалоге не защищает от выбора чужого содержимого. Обработчик ДоСвоегоUpload85 перед помещением получает настоящие СсылкаНаФайл и проверяет количество два, точные имена, собственную папку, доступный локальный Файл, содержимое и размер. При отказе он устанавливает ОтказОтПомещенияВсехФайлов=Истина. Платформа после этого не вызывает другие оповещения, поэтому Занято85 сбрасывается прямо здесь.
Параметры обработчиков помещения: завершение — два (ПомещенныеФайлы, К); прогресс — шесть (СсылкаНаФайл, процент файла, отказ файлу, процент всех файлов, отказ всем, К); перед началом — три (массив ссылок, отказ всем, К); ошибка — три (ИнформацияОбОшибке, СтандартнаяОбработка, К). К — структура своего текущего опыта. Параметры отказа изменяются обработчиком. Прогресс — проценты, не байты; число и время вызовов не фиксированы.
ИдентификаторФайла — UUID объекта СсылкаНаФайл, НЕ устойчивый UUID файла на диске и не UUID опыта или формы. Код запоминает настоящий UUID каждого исходного объекта из обработчика начала и сверяет тот же объект до и после Ждать. Результаты и прогресс связываются по проверенным имени и пути; их UUID объекта не предполагается равным UUID исходной ссылки.
Время изменения читается в местном времени и UTC. Каждый результат сравнивается с соответствующим методом связанного Файл; местное время не сравнивается напрямую с UTC. Не меняйте исходные файлы между чтениями. Проверки времени, размера и байтов обнаруживают проверяемые отличия, но НЕ делают две Await операции атомарными.
Пятый параметр помещения — настоящий УникальныйИдентификатор своей формы. Он удерживает данные временного хранилища до закрытия формы; без него данные могут исчезнуть после следующего серверного вызова. СсылкаНаФайл остается на клиенте. Сервер получает только собственные имя и адрес и читает реальные байты из хранилища. После закрытия формы платформа удаляет временные данные, но не исходные файлы.
Проверьте два разных вида отмены помещения: кнопка Отмена в выборе файлов дает в обработчике завершения Неопределено; флажок ОтменитьПередНачалом85 устанавливает отказ перед передачей, поэтому файлов помещено ноль и следующих оповещений нет. Отмена одного файла, частичный массив или ошибка не считаются полной передачей. Автоматического повтора или отката нет; возможные собственные адреса сохраняются, чужие данные не удаляются.
Бездиалоговый вариант получения вызывается с тремя аргументами: оповещение, массив описаний, собственная новая папка. Завершение получает два параметра. До вызова в папке ноль файлов. Описания содержат только свои короткие имена без пути и реальные адреса временного хранилища. Результаты сопоставляются по имени, адресу и полному пути; порядок массива не предполагается. Два файла перечитываются и побайтово проверяются.
Диалогный вариант получения вызывается с двумя аргументами и не имеет оповещения о завершении. ПараметрыДиалогаПолученияФайлов.Каталог — только начальный каталог, НЕ запрет выбрать другое место. Сохраняйте вручную исключительно в показанную новую пустую собственную папку; не подтверждайте перезапись, другой путь или открытие сторонним приложением. Если это неудобно, используйте бездиалоговый путь, а диалог изучайте на своей VM с отменой.
После фактического закрытия диалога самостоятельно поставьте ПодтверждаюЗакрытыйДиалог85 и запустите отдельную проверку. Ноль файлов и ваше подтверждение доказывают лишь отсутствие файлов в этой папке — не автоматическую отмену и не отсутствие файлов в другом месте. Один файл, лишние файлы или неверные байты означают частичный либо неизвестный результат, а не отмену. Не пытайтесь продолжать записи или автоматически откатывать такое состояние.
Формы удерживают один собственный контекст и блокируют параллельные операции. Неизвестный или частичный результат не перекрывается новым опытом. Для второго конструктора помещения откройте новую форму и создайте новую пару. Каждый новый опыт получения создает другую UUID-папку и не перезаписывает старую. Не закрывайте форму во время оповещений или Ждать.
Actualfiles/transfers/UI/1C/DB/network0: здесь только авторство и статические проверки кода по установленной справке. Файлы не передавались, интерфейс не запускался, БД и сеть не изменялись. Сообщения кода — ожидаемый протокол будущего ручного опыта, не доказательство выполнения. Корень проекта и конфигурации только читались; резервные копии и архивы не создавались.
&НаКлиенте
Перем Контекст85;
&НаКлиенте
Функция НовыйСвойDownload85()
ПроверитьСвоегоКлиента85();
Если Занято85 Тогда
ВызватьИсключение "Своя передача/диалог еще не закончена";
КонецЕсли;
Если Контекст85 <> Неопределено Тогда
Если Контекст85.Фаза <> "проверено" И Контекст85.Фаза <> "отменено" Тогда
ВызватьИсключение "Неопределенный/частичный опыт не перекрываем новым; сначала ручная read-only диагностика";
КонецЕсли;
КонецЕсли;
UUID = Строка(Новый УникальныйИдентификатор);
К = Новый Структура("UUID,Корень,Фаза,Описания", UUID, СоздатьСвоюПапку85(UUID), "готово", Новый Массив);
К.Описания = СвояПараСервера85(UUID, УникальныйИдентификатор);
ПроверитьОписания85(К);
Контекст85 = К;
ПутьОпыта85 = К.Корень;
ПодтверждаюЗакрытыйДиалог85 = Ложь;
Возврат К;
КонецФункции
&НаСервереБезКонтекста
Функция СвояПараСервера85(UUID, ФормаUUID)
ПроверитьСвойПустойСтенд();
Если ТипЗнч(ФормаUUID) <> Тип("УникальныйИдентификатор") Тогда
ВызватьИсключение "Хранилище привязывается к actual форме, не угаданнойстроке";
КонецЕсли;
Описания = Новый Массив;
Для Каждого Поле Из СвоиТексты85(UUID) Цикл
Данные = ПолучитьДвоичныеДанныеИзСтроки(Поле.Значение, КодировкаТекста.UTF8, Ложь);
Описание = Новый ОписаниеПередаваемогоФайла;
Описание.Имя = Поле.Ключ;
Описание.Хранение = ПоместитьВоВременноеХранилище(Данные, ФормаUUID);
ПроверитьСвоиBytes85(ПолучитьИзВременногоХранилища(Описание.Хранение), Поле.Значение);
Описания.Добавить(Описание);
КонецЦикла;
Возврат Описания;
КонецФункции
&НаКлиенте
Процедура ПроверитьОписания85(К)
ПроверитьСвойКорень85(К);
Если ТипЗнч(К.Описания) <> Тип("Массив") Или К.Описания.Количество() <> 2 Тогда
ВызватьИсключение "Нужны exactly2own native transferable descriptors";
КонецЕсли;
Тексты = СвоиТексты85(К.UUID);
Имена = Новый Соответствие;
Для Каждого Описание Из К.Описания Цикл
Если ТипЗнч(Описание) <> Тип("ОписаниеПередаваемогоФайла")
Или Тексты.Получить(Описание.Имя) = Неопределено
Или Имена.Получить(Описание.Имя) <> Неопределено
Или ТипЗнч(Описание.Хранение) <> Тип("Строка")
Или Не ЭтоАдресВременногоХранилища(Описание.Хранение) Тогда
ВызватьИсключение "Descriptor — собственное flat имя и actual непустойtemp адрес";
КонецЕсли;
Имена.Вставить(Описание.Имя, Истина);
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ВыгрузитьБезДиалога85(Команда)
К = НовыйСвойDownload85();
Если НайтиФайлы(К.Корень, "*", Ложь).Количество() <> 0 Тогда
ВызватьИсключение "До записи callback download-папка должна быть пустой, overwrite запрещен";
КонецЕсли;
Занято85 = Истина;
К.Фаза = "callback";
Завершение = Новый ОписаниеОповещения("СвойDownloadЗавершен85", ЭтотОбъект, К,
"ОшибкаСвоегоDownload85", ЭтотОбъект);
Статус85 = "Native callback-download начат; успех не заявлен";
Попытка
НачатьПолучениеФайловССервера(Завершение, К.Описания, К.Корень);
Исключение
К.Фаза = "ошибка";
Занято85 = Ложь;
Статус85 = "Начало download не подтвердилось; own частичные файлы не удаляются";
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура СвойDownloadЗавершен85(ПолученныеФайлы, К) Экспорт
Попытка
Если Контекст85 = Неопределено Или К.UUID <> Контекст85.UUID Или К.Фаза <> "callback"
Или ТипЗнч(ПолученныеФайлы) <> Тип("Массив") Или ПолученныеФайлы.Количество() <> 2 Тогда
ВызватьИсключение "Нужен actual полный completion2своих файлов, не неизвестнаяотмена";
КонецЕсли;
Ожидания = Новый Соответствие;
Для Каждого Описание Из К.Описания Цикл
Ожидания.Вставить(Описание.Имя, Описание.Хранение);
КонецЦикла;
Найденные = Новый Соответствие;
Для Каждого Результат Из ПолученныеФайлы Цикл
Если ТипЗнч(Результат) <> Тип("ОписаниеПереданногоФайла")
Или Ожидания.Получить(Результат.Имя) = Неопределено
Или Найденные.Получить(Результат.Имя) <> Неопределено
Или Результат.Хранение <> Ожидания.Получить(Результат.Имя)
Или НРег(Результат.ПолноеИмя) <> НРег(К.Корень + Результат.Имя) Тогда
ВызватьИсключение "Mapbyname + exact own path/storage, не result[0] или порядокмассива";
КонецЕсли;
Найденные.Вставить(Результат.Имя, Истина);
КонецЦикла;
ПроверитьСвоиДваФайла85(К);
К.Фаза = "проверено";
Статус85 = "Own callback2args: два exact UTF8 файла подтверждены в своей свежей папке, независимо от порядка";
Исключение
К.Фаза = "ошибка";
Статус85 = "Download callback/readback не подтверждены; partial/unknown не rollback и не успех";
КонецПопытки;
Занято85 = Ложь;
КонецПроцедуры
&НаКлиенте
Процедура ОшибкаСвоегоDownload85(ИнформацияОбОшибке, СтандартнаяОбработка, К) Экспорт
СтандартнаяОбработка = Ложь;
К.Фаза = "ошибка";
Занято85 = Ложь;
Если ТипЗнч(ИнформацияОбОшибке) = Тип("ИнформацияОбОшибке") Тогда
Статус85 = "Native download error3args; original tempaddresses/files сохранены, автоматического retry нет";
Иначе
Статус85 = "Неверный native error callback тип";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ВыгрузитьДиалогПоУмолчанию85(Команда)
К = НовыйСвойDownload85();
Параметры = Новый ПараметрыДиалогаПолученияФайлов;
Параметры.Заголовок = "Сохраните два own файла ТОЛЬКО в показанную UUID-папку";
Параметры.ВыборКаталога = Истина;
Параметры.Каталог = К.Корень;
НачатьСвойДиалогDownload85(К, Параметры);
КонецПроцедуры
&НаКлиенте
Процедура ВыгрузитьДиалогСКонструктором85(Команда)
К = НовыйСвойDownload85();
Параметры = Новый ПараметрыДиалогаПолученияФайлов("Сохраните два own файла ТОЛЬКО в показанную UUID-папку",
Истина, К.Корень);
НачатьСвойДиалогDownload85(К, Параметры);
КонецПроцедуры
&НаКлиенте
Процедура НачатьСвойДиалогDownload85(К, Параметры)
ПроверитьОписания85(К);
Если Не ПодтверждаюТолькоСвоюПапку85 Или НайтиФайлы(К.Корень, "*", Ложь).Количество() <> 0
Или Параметры.Каталог <> К.Корень Или Не Параметры.ВыборКаталога
Или Параметры.Заголовок <> "Сохраните два own файла ТОЛЬКО в показанную UUID-папку" Тогда
ВызватьИсключение "Вы явно подтверждаете сохранение только в новую пустую own UUID-папку";
КонецЕсли;
Занято85 = Истина;
К.Фаза = "диалог";
Статус85 = "Диалогный native overload НЕ имеет completion callback. Только manual сохранение вown root/отмена и отдельная проверка";
Попытка
НачатьПолучениеФайловССервера(К.Описания, Параметры);
Исключение
К.Фаза = "ошибка";
Занято85 = Ложь;
Статус85 = "Начало диалога не подтвердилось; никакого auto rollback";
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьРучнойДиалог85(Команда)
Если Контекст85 = Неопределено Или Не ПодтверждаюЗакрытыйДиалог85 Тогда
ВызватьИсключение "Сначала ВЫ вручную завершаете/закрываете диалог, затем явно подтверждаете это";
КонецЕсли;
К = Контекст85;
Если К.Фаза <> "диалог" Тогда
ВызватьИсключение "Проверка относится только к своему запущенному диалогномуoverload";
КонецЕсли;
ПроверитьСвойКорень85(К);
Количество = НайтиФайлы(К.Корень, "*", Ложь).Количество();
Если Количество = 0 Тогда
К.Фаза = "отменено";
Занято85 = Ложь;
Статус85 = "ВЫ подтверждаете закрытие/отмену диалога; own root0файлов. Native отмена автоматически не доказана; иной сохраненный путь нельзя исключить";
Возврат;
КонецЕсли;
Попытка
ПроверитьСвоиДваФайла85(К);
К.Фаза = "проверено";
Занято85 = Ложь;
Статус85 = "После ВАШЕГО закрытия диалога exact own whitelist2/UTF8 readback подтверждены; остальные пути не проверялись";
Исключение
К.Фаза = "ошибка";
Занято85 = Ложь;
Статус85 = "Partial/чужой файл вown root не является CANCEL или успехом. Не перезаписывать/удалять; manual read-only разбор";
КонецПопытки;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Функция СвоиТексты85(UUID)
Если ТипЗнч(UUID) <> Тип("Строка") Тогда
ВызватьИсключение "Нужен UUID своего опыта строкой";
КонецЕсли;
Если Строка(Новый УникальныйИдентификатор(UUID)) <> UUID
Или UUID = "00000000-0000-0000-0000-000000000000" Тогда
ВызватьИсключение "Нужен собственный canonical ненулевой UUID";
КонецЕсли;
Тексты = Новый Соответствие;
Тексты.Вставить("own-card.txt", "UUID=" + UUID + Символы.ПС + "Книга;3;250");
Тексты.Вставить("own-total.txt", "UUID=" + UUID + Символы.ПС + "Сумма=750");
Возврат Тексты;
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Процедура ПроверитьСвоиBytes85(Данные, Текст)
Ожидание = ПолучитьДвоичныеДанныеИзСтроки(Текст, КодировкаТекста.UTF8, Ложь);
Если ТипЗнч(Данные) <> Тип("ДвоичныеДанные") Тогда
ВызватьИсключение "Нужны actual bytes, не текст или ссылка";
КонецЕсли;
Если Данные.Размер() <> Ожидание.Размер()
Или ПолучитьHexСтрокуИзДвоичныхДанных(Данные) <> ПолучитьHexСтрокуИзДвоичныхДанных(Ожидание) Тогда
ВызватьИсключение "Файл обязан содержать ровно свои concrete UTF8 bytes безBOM";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьСвоегоКлиента85()
#Если ТолстыйКлиентУправляемоеПриложение Тогда
Система = Новый СистемнаяИнформация;
Если Система.ТипПлатформы <> ТипПлатформы.Windows_x86_64 Тогда
ВызватьИсключение "Нужен свой толстый управляемый Windowsx64 клиент8.5.1.1343";
КонецЕсли;
Если Не ПодтверждаюСвойСтенд85 Тогда
ВызватьИсключение "Подтвердите только новый пустой собственный стенд";
КонецЕсли;
ПроверитьНаСервере85();
#Иначе
ВызватьИсключение "Thin/web/mobile positive path здесь не заявлен; native FileRef.File может быть Undefined";
#КонецЕсли
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ПроверитьНаСервере85()
ПроверитьСвойПустойСтенд();
КонецПроцедуры
&НаКлиенте
Функция СоздатьСвоюПапку85(UUID)
ПроверитьСвоегоКлиента85();
СвоиТексты85(UUID);
База = КаталогВременныхФайлов();
Если Сред(База, 2, 2) <> ":\" Или Лев(База, 2) = "\\" Тогда
ВызватьИсключение "Только actual local Windows native temp, не UNC/произвольный input";
КонецЕсли;
Если Прав(База, 1) <> "\" Тогда
База = База + "\";
КонецЕсли;
Папка = Новый Файл(База);
Если Не Папка.Существует() Или Не Папка.ЭтоКаталог() Тогда
ВызватьИсключение "Native temp должен существовать";
КонецЕсли;
Корень = База + "OwnFileTransfer85-" + UUID + "\";
Свежая = Новый Файл(Корень);
Если Свежая.Существует() Тогда
ВызватьИсключение "Своя UUID-папка уже существует; overwrite запрещен";
КонецЕсли;
СоздатьКаталог(Корень);
Если НайтиФайлы(Корень, "*", Ложь).Количество() <> 0 Тогда
ВызватьИсключение "Нужна свежая пустая собственная папка";
КонецЕсли;
Возврат Корень;
КонецФункции
&НаКлиенте
Процедура ПроверитьСвойКорень85(К)
СвоиТексты85(К.UUID);
База = КаталогВременныхФайлов();
Если Прав(База, 1) <> "\" Тогда
База = База + "\";
КонецЕсли;
Если К.Корень <> База + "OwnFileTransfer85-" + К.UUID + "\" Тогда
ВызватьИсключение "Не свой actual native-temp UUID root";
КонецЕсли;
Папка = Новый Файл(К.Корень);
Если Не Папка.Существует() Или Не Папка.ЭтоКаталог() Тогда
ВызватьИсключение "Своя созданная папка должна существовать";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьСвоиДваФайла85(К)
ПроверитьСвойКорень85(К);
Тексты = СвоиТексты85(К.UUID);
Файлы = НайтиФайлы(К.Корень, "*", Ложь);
Если Файлы.Количество() <> 2 Тогда
ВызватьИсключение "Нужны ровно2своих файла, без дополнительных/частичных результатов";
КонецЕсли;
Для Каждого Файл Из Файлы Цикл
Текст = Тексты.Получить(Файл.Имя);
Если Текст = Неопределено Или Не Файл.ЭтоФайл()
Или НРег(Файл.ПолноеИмя) <> НРег(К.Корень + Файл.Имя) Тогда
ВызватьИсключение "Нужен точный whitelist собственных flat имен, не каталог/другой путь";
КонецЕсли;
Ожидание = ПолучитьДвоичныеДанныеИзСтроки(Текст, КодировкаТекста.UTF8, Ложь);
Если Файл.Размер() <> Ожидание.Размер() Тогда
ВызватьИсключение "Сначала exact маленький размер own fixture, потом чтениеbytes; другие/огромные файлы не загружаем";
КонецЕсли;
ПроверитьСвоиBytes85(Новый ДвоичныеДанные(Файл.ПолноеИмя), Текст);
КонецЦикла;
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ПроверитьСвойПустойСтенд()
Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
КонецЕсли;
Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
КонецЕсли;
Источники = Новый Массив;
Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
Для Каждого Источник Из Источники Цикл
Расширения = РасширенияКонфигурации.Получить(, Источник);
Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
ВызватьИсключение "Native список расширений должен иметь тип Массив";
КонецЕсли;
Если Расширения.Количество() <> 0 Тогда
ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
КонецЕсли;
КонецЦикла;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
КонецЕсли;
КонецПроцедурыРазбор по шагам
НовыйСвойDownload85 создает новую UUID-папку. Сервер создает две строки UTF8, помещает их во временное хранилище своей формы и формирует настоящие ОписаниеПередаваемогоФайла через Имя и Хранение. Содержимое каждого адреса проверяется до возврата.
ВыгрузитьБезДиалога85 вызывает НачатьПолучениеФайловССервера с оповещением, описаниями и своей пустой папкой. Обработчик завершения сопоставляет результаты по имени, адресу и полному пути, затем проверяет ровно два файла и перечитывает их байты.
После успешной проверки отдельные новые опыты используют параметры диалога: конструктор по умолчанию с тремя свойствами и конструктор с тремя аргументами. Эти объекты действительно передаются диалогному варианту API.
Подтвердите сохранение только в собственную показанную папку. ВыборКаталога=Истина включает выбор папки; Каталог задает начальное место, но не запрещает пользователю выбрать другое. За пределами собственной папки код ничего не гарантирует.
После фактического сохранения и закрытия диалога подтвердите его закрытие и нажмите ПроверитьРучнойДиалог85. Успех требует двух собственных файлов с точными байтами; запуск метода или наличие описаний не являются успехом.
В новом опыте нажмите Отмена и отдельно проверьте пустую папку. Метод не возвращает флаг отмены: сообщение честно показывает ваше подтверждение закрытия и отсутствие файлов здесь, а не автоматически доказанную отмену или отсутствие файлов в другом месте.
Один файл, чужая запись или неверные байты означают частичный либо неизвестный результат. Новый опыт запрещен; перезаписи, удаления и компенсации нет. Собственные файлы и временные адреса остаются для ручного разбора.
Как проверить результат
Проверены два собственных коротких имени, UUID, точные байты и размер; произвольный *.txt или первый элемент массива не принимаются.
Конструкторы, свойства и методы реально используются. Обработчики с 2, 6, 3 параметрами и обработчик ошибки с 3 параметрами согласованы с установленной справкой 8.5.1.1343.
Свойства ссылок и результатов только для чтения не присваиваются. Недоступный СсылкаНаФайл.Файл не заменяется выдуманным локальным файлом.
Отмена, частичный результат, неизвестное состояние и ошибка различаются. Нет автоматического повтора, отката, обещания атомарности или успеха без чтения результата.
Интерфейс, файловая передача и 1С здесь не запускались. Проверки статические; подготовка относится только к вашему будущему собственному опыту.
Ожидаемый результат
Ожидаемый ручной результат: две собственные записи UTF8 о книге, количестве 3, цене 250 и сумме 750 передаются без изменений. Настоящие ссылки, описания и прочитанное содержимое проверяются. Отмена и частичный результат не объявляются успехом. Фактический запуск не выполнялся.
На что обратить внимание
Фильтр помещения не ограничивает содержимое. Имена, путь и байты проверяются перед передачей. После отказа перед началом других оповещений не будет, поэтому признак занятости сбрасывается там.
Диалогное получение не имеет оповещения о завершении. Начальный каталог — не граница безопасности, а ручное подтверждение закрытия — не флаг платформы. Для контролируемого назначения выбирайте бездиалоговый маршрут.
Проверки времени, размера и два Ждать не атомарны. Частичные или неизвестные результаты нельзя перекрывать повторной записью или слепо откатывать. Код ничего не удаляет.
UUID ссылки идентифицирует объект, не физический файл. В веб-клиенте связанный Файл может быть недоступен; такой вариант честно отвергается и не объявляется рабочим примером.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.