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