Глобальный контекст.НачатьПолучениеФайлов

Методы · BeginGettingFiles

Начинает получение набора файлов и сохраняет их в локальную файловую систему пользователя.

Синтаксис

НачатьПолучениеФайлов(<ОписаниеОповещения>, <ПолучаемыеФайлы>, <РасположениеФайлов>, <Интерактивно>)
Полное описание, параметры и ограничения

Глобальный контекст.НачатьПолучениеФайлов (Global context.BeginGettingFiles)

Глобальный контекст (Global context)

НачатьПолучениеФайлов (BeginGettingFiles)

Не рекомендуется использовать, начиная с версии 8.3.15.

Рекомендуется использовать:

НачатьПолучениеФайловССервера

Доступен, начиная с версии 8.3.6.

Синтаксис:
НачатьПолучениеФайлов(<ОписаниеОповещения>, <ПолучаемыеФайлы>, <РасположениеФайлов>, <Интерактивно>)
Параметры:

<ОписаниеОповещения> (обязательный)
Тип: ОписаниеОповещения.
Содержит описание процедуры, которая будет вызвана после завершения со следующими параметрами:
<ПолученныеФайлы> – массив объектов типа ОписаниеПереданногоФайла или Неопределено, если файлы не получены.

<ДополнительныеПараметры> - значение, которое было указано при создании объекта ОписаниеОповещения.

<ПолучаемыеФайлы> (обязательный)
Тип: Массив.
Массив объектов типа ОписаниеПередаваемогоФайла.
Каждый объект описывает получаемый файл:
Хранение - расположение данных во временном хранилище или в информационной базе;

Имя - это локальный путь, по которому должен быть расположен получаемый файл. Это может быть либо полный путь, либо часть пути, которая будет объединена со значением параметра <РасположениеФайлов>. Это также может быть имя файла или имя каталога (каталогов) + имя файла.

<РасположениеФайлов> (необязательный)
Тип: ДиалогВыбораФайла, Строка.
Определяет общее расположение помещаемых файлов в локальной файловой системе.
Может быть задан строкой либо заранее подготовленным диалогом выбора файлов в режиме выбора каталога или сохранения файлов.

<Интерактивно> (необязательный)
Тип: Булево.
Истина - задан интерактивный режим, в котором пользователю показывается диалог, в котором он может выбрать локальное расположение файлов.
Ложь - на сервер передается список файлов, описанный в параметре <ПолучаемыеФайлы>.
В интерактивном режиме строка, переданная в параметре <РасположениеФайлов>, рассматривается как начальное значение для выбора пути.
Значение по умолчанию: Истина.
Описание:

Начинает получение набора файлов и сохраняет их в локальную файловую систему пользователя.

Доступность:

Тонкий клиент, веб-клиент, мобильный клиент, толстый клиент, мобильное приложение (клиент).

Примечание:
Для работы метода на веб-клиенте необходимо предварительно подключить расширение работы с файлами.
См. также:
Глобальный контекст, метод ПолучитьФайлы

Использование в версии:

Доступен, начиная с версии 8.3.6.

Не рекомендуется использовать, начиная с версии 8.3.15.

Методическая информация

Практические примеры

Передать свой TXT старым API: одиночный, пакетный и через оповещения

Одна собственная учебная задача тремя способами: создаёт новый текст «50»/«75», передаёт во временное хранилище, получает новый файл и проверяет настоящие байты, SHA-256, строки и сумму 125. У каждого способа — настоящая кнопка, а у оповещений — настоящие процедуры платформы.

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

Полный модуль своей управляемой формы: толстый управляемый клиент 8.5.1.1343, Windows_x86_64, новая целиком своя файловая база в собственной виртуальной машине. Клиентские пути только клиенту; временное хранилище действительно передаётся через обращения к серверу платформы.

Подготовка

  1. Это урок сопровождения старого API, а не рекомендация для нового рабочего проекта. ПоместитьФайл/ПоместитьФайлы/ПолучитьФайлы не рекомендуются с 8.3.13; ПолучитьФайл и выбранные Начать… — с 8.3.15. Здесь подготовлен только исходник: 1С и передачи не запускались.

  2. Все будущие действия выполняйте вручную только в новой собственной виртуальной машине с 64-битной Windows, отдельным профилем и пустой файловой информационной базой 8.5.1.1343. Создайте новую конфигурацию УчебнаяКлассическаяПередача85, основной режим Управляемое приложение, совместимость Не использовать. Это не рабочая база и не её копия.

  3. Для двух синхронных вариантов разрешите модальность в свойствах своей конфигурации; не выбирайте НеИспользовать. Именно для НеИспользовать справка ПоместитьФайл рекомендует НачатьПомещениеФайла. Не меняйте этот режим программно и не переносите синхронные варианты в веб-клиент, мобильный клиент или фоновый серверный модуль.

  4. Вручную подготовьте отдельный собственный каталог C:\OneCClassic125\ в этом новом стенде и права своего пользователя на него. Без посторонних писателей, ссылок и сетевых папок. Код создаёт новые имена сам; пути, адреса и содержимое пользователь в форме не вводит.

  5. Конфигуратор → Общие → Общие формы: создайте управляемую КлассическаяПередача12585. ПодтверждаюСвоиФайлы85: Булево, начальное значение Ложь; Протокол85: Строка длиной 0 (неограниченная), многострочное поле ТолькоПросмотр. Внутренние переменные модуля не создавайте как редактируемые реквизиты.

  6. У формы вручную задайте оба разных свойства: АвтоматическоеСохранениеДанныхВНастройках = АвтоматическоеСохранениеДанныхФормыВНастройках.НеИспользовать; СохранениеДанныхВНастройках = СохранениеДанныхФормыВНастройках.НеИспользовать. Обработчика ПриОткрытии здесь нет: открытие формы не запускает передачу.

  7. В форме → Команды создайте СинхОдин85, СинхНабор85, ЧерезОповещения85; у каждой Действие = одноимённая процедура, использование текущей/выделенных строк НеИспользует. Добавьте три кнопки. Основной блок вставьте целиком в пустой модуль этой формы вместо пустых автоматически созданных процедур.

  8. Общие → Подсистемы: собственная УчебныеФайлы12585. Общие → Общие команды: ОткрытьКлассическуюПередачу12585 без параметра, включите в состав своей подсистемы и её командный интерфейс. Второй блок целиком вставьте в пустой модуль именно этой общей команды. Оповещения не привязываются к кнопкам: их вызовет платформа через ОписаниеОповещения.

  9. 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");
#Иначе
    ВызватьИсключение "Этот урок предназначен только для толстого управляемого клиента";
#КонецЕсли
КонецПроцедуры

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

  1. Кнопка сначала очищает старый протокол. Одна попытка расходует флажок согласия до файловых действий; имя своей конфигурации/формы, клиент, версия и два режима без сохранения настроек проверяются. Случайный новый UUID служит только меткой имени, а для времени жизни хранилища читается настоящий UUID этой формы.

  2. Из собственного текста «50», перевод строки, «75» платформа создаёт настоящие UTF-8 двоичные данные без BOM. Считается реальный SHA-256, проверяются все байты, две строки и число 125. Новый ФайловыйПоток с двумя аргументами и СоздатьНовый создаёт seed_<UUID>.txt; запись идёт в настоящий поток, не через способную перезаписать путь запись ДвоичныеДанные.Записать(имя). После нормального Закрыть файл действительно перечитывается.

  3. СинхОдин85: ПоместитьФайл возвращает настоящий Булево, адрес и выбранное имя через переменные; пустой исходный адрес просит новое хранилище. Затем проверяются фактические байты хранилища. ПолучитьФайл с Ложь сохраняет в новое отдельное назначение; Булево/файл/содержимое проверяются заново. Неопределено не считается успехом.

  4. СинхНабор85: передаётся пакет ровно из одного собственного файла, чтобы сравнить тот же опыт. Спорный первый параметр ПоместитьФайлы пропущен; второй — настоящая переменная-массив результата, третий — полный собственный путь без маски. ПолучитьФайлы принимает массив собственных описаний имени/реального адреса и отдельный корневой каталог. Истина означает хотя бы один файл, поэтому весь возвращённый комплект и байты дополнительно проверяются.

  5. ЧерезОповещения85: после создания своего источника выставляется ожидание до НачатьПомещениеФайла. Платформа передаёт процедуре завершения ровно четыре параметра; каждый проверяется, включая свой номер и реальный выбранный путь. Из настоящего адреса читаются байты. Перед НачатьПолучениеФайлов выставляется другое ожидание; его обработчик получает ровно два параметра. После Начать… нет присваивания, способного затереть уже пришедшее окончание. В ожидании протокол показывает только свои подготовленные пути.

  6. ОписаниеОповещения указывает именно ЭтотОбъект своей формы, настоящее имя экспортируемой процедуры, свой UUID-номер и обработчик ошибки. Процедура ошибки имеет ровно три параметра платформы. Сначала сохраняется и проверяется настоящий Булево стандартной обработки, затем ставится Ложь до проверки стадии и номера, чтобы поздняя ошибка после повторной кнопки не показала технические подробности. После своих проверок показывается фиксированный отказ с прежним Булево, без текста исключения.

  7. У действительного описания передачи только читаются Имя, ПолноеИмя и Хранение. Новый ОписаниеПереданногоФайла не создаётся. Все три способа доходят до одного чтения настоящего нового файла: полный Base64/хеш/UTF-8, две реальные строки «50»/«75», два реальных числа и вычисленная сумма 125. Свой исходник перечитывается ещё раз; отчёт использует эти фактические результаты.

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

  1. Без флажка: ни источник, ни скачанный файл не создаются, успешного протокола нет. Повтор кнопки в том же экземпляре даёт СТОП даже после прежнего успеха; для нового опыта откройте новую собственную форму, не вызывайте внутренние процедуры.

  2. При будущем успешном ручном запуске выбранной кнопки протокол показывает новый путь single_/batch_/callback_<UUID>.txt, настоящий SHA-256(Base64), число строк 2 и вычисление 50 + 75 = 125. Откройте только эти свои файлы: источник и копия имеют те же две строки. Все три кнопки проверьте в отдельных новых экземплярах.

  3. Пакетный Булево Истина без настоящего полного описания и чтения файла не даёт успеха. Код требует ровно один фактический результат, его имя/полный путь/адрес и правильное содержимое; положение в массиве не используется.

  4. Только в отдельном собственном учебном стенде возможна ручная отрицательная проба: во время ожидания изменить свой seed-файл или занять именно свой путь назначения из протокола. Должен быть отказ, не подтверждение 125; уже существующее назначение проверяется до получения. Не пробуйте это в рабочих каталогах и не вызывайте процедуры оповещения вручную.

  5. Ложь, Неопределено, ошибка или неожиданный тип/путь/содержимое означают СТОП. Состояние и файлы после ошибки могут быть частичными; код не удаляет, не повторяет и не объявляет ресурсы гарантированно освобождёнными.

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

При будущем успешном ручном запуске протокол содержит фактический новый путь, SHA-256, две прочитанные строки и вычисленные 50 + 75 = 125; исходник перечитан неизменным. Отмена, неопределённый результат и ошибка не называются подтверждённой передачей.

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

  1. Это старые методы. Для нового проекта предпочтительны современные методы с именами НаСервер/ССервера. В текущей справке нет старого НачатьПолучениеФайла: здесь не выдумывается этот вызов и не дублируется уже заполненный НачатьПомещениеФайлов.

  2. У ПоместитьФайлы первый параметр объявлен Строка, но его описание говорит о массиве. Это противоречие справки сохранено: массив в первую позицию не передаётся. Полный путь третьего параметра — документированный допустимый поиск одного файла для НайтиФайлы; маски и перечисление чужих каталогов не используются.

  3. Адрес временного хранилища не является клиентским/серверным путём на диске. Проверка ЭтоАдресВременногоХранилища сама по себе не доказывает владение; здесь адрес получен из собственного помещения через API платформы, а фактические байты сравниваются с собственным источником. Вызовы передачи и ПолучитьИзВременногоХранилища реально обращаются к серверу при будущем запуске.

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

  5. Существует и UUID-имя не являются атомарным резервированием скачанного пути или защитой от подмены/ссылок. СоздатьНовый защищает создание собственного источника от существующего файла, но API получения файла может перезаписывать. Требуется спокойный целиком свой стенд без других писателей; защищённость рабочей системы и приватность не обещаются.

  6. Записать и Закрыть могут завершиться ошибкой. При ошибке записи дескриптор потока может остаться открытым; при ошибке закрытия его состояние неопределённо. Дополнительных попыток закрыть/перезаписать/удалить нет. Никакой гарантии сохранения первичного исключения или записи, устойчивой к аварии, не заявлено.

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

  8. Смена способа в использованной форме не разрешена. СТОП сохраняется в этом экземпляре, а новый опыт требует явного ручного открытия нового собственного экземпляра. Исходные примеры справки/конфигураций и старые уроки не изменялись; запуск 1С здесь не проверен.

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

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

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

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

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