Начинает получение набора файлов и сохраняет их в локальную файловую систему пользователя.
Синтаксис
НачатьПолучениеФайлов(<ОписаниеОповещения>, <ПолучаемыеФайлы>, <РасположениеФайлов>, <Интерактивно>)Полное описание, параметры и ограничения
Глобальный контекст.НачатьПолучениеФайлов (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, новая целиком своя файловая база в собственной виртуальной машине. Клиентские пути только клиенту; временное хранилище действительно передаётся через обращения к серверу платформы.
Подготовка
Это урок сопровождения старого 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С здесь не проверен.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.