ОписаниеПереданногоФайла.ИдентификаторФайла

Свойства · FileID

Тип: УникальныйИдентификатор. Содержит идентификатор объекта СсылкаНаФайл, соответствующий помещенному файлу.

Полное описание, параметры и ограничения

ОписаниеПереданногоФайла.ИдентификаторФайла (TransferredFileDescription.FileID)

ОписаниеПереданногоФайла (TransferredFileDescription)

ИдентификаторФайла (FileID)

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

Использование:
Только чтение.
Описание:
Тип: УникальныйИдентификатор.
Содержит идентификатор объекта СсылкаНаФайл, соответствующий помещенному файлу.
Доступность:

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

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

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

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

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

Передать свои шесть байт через временное хранилище и проверить скачивание

Полный клиентский модуль: создаёт свой источник ABC-85, помещает его с привязкой к форме, проверяет байты хранилища и скачанного файла, отдельно показывает контролируемую отмену.

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

Полный модуль управляемой формы нового стенда УчебнаяПередачаФайлов85 в толстом клиенте Windows; клиентские Асинх/Ждать, временное хранилище и локальные собственные файлы.

Подготовка

  1. Создайте новую пустую учебную конфигурацию УчебнаяПередачаФайлов85 на платформе 8.5.1.1343. Не используйте рабочие УТ, КА, УНФ, БП или копию с реальными файлами и данными.

  2. Выберите управляемое приложение и толстый клиент Windows. Код не рассчитан на веб-клиент, мобильную платформу, серверный модуль или фоновое задание.

  3. Обработки → ОпытПередачи85 → управляемая форма Форма. Для каждого урока нужна отдельная обработка либо полная замена модуля формы; не склеивайте два полных модуля.

  4. Реквизиты формы: ПодтверждаюСвоиФайлы85, Занято85, ОтменитьДоПередачи85 типа Булево; ПутьСвоегоКаталога85 и Итог85 типа Строка неограниченной длины. Исходно флажки Ложь.

  5. Согласие и ОтменитьДоПередачи85 выводите флажками для ввода; Занято85, путь и итог показывайте только для просмотра. Пути и адреса хранилища пользователь не вводит.

  6. Создайте команду с именем основной процедуры урока, назначьте одноимённое действие и кнопку. ПередЗакрытием назначьте соответствующему событию формы с четырьмя параметрами из полного модуля.

  7. Вставьте весь модуль, нажмите F7 и обновите только собственный стенд. runtimeVerifiedScenarios=0: при подготовке справочника 1С, загрузка, скачивание и очистка не запускались.

  8. Учётная запись должна иметь права работы в своём локальном временном каталоге. Администратор заранее исключает посторонних писателей и подмену файлов ссылками; общие и сетевые каталоги не используйте.

  9. ПолучитьИмяВременногоФайла создаёт только имя. Свой отдельный каталог с расширением guidefiles создаётся после проверки, что по этому имени нет существующего объекта.

  10. Исходные данные генерируются из коротких строк непосредственно кодом. Не подставляйте рабочие документы, токены, архивы, персональные данные или внешние URL.

  11. В первом ручном опыте подтвердите свой стенд и оставьте ОтменитьДоПередачи85=Ложь. Второй опыт выполняйте только после завершения первого, уже с ОтменитьДоПередачи85=Истина.

  12. Оповещение ПередСвоим… остаётся Экспорт и вызывается платформой перед загрузкой. Его возвращаемый параметр Отказ устанавливается прямо, а не через выдуманный результат процедуры.

  13. Передаётся настоящий УникальныйИдентификатор экземпляра формы. Не заменяйте его Новым УникальныйИдентификатор: произвольный UUID не становится идентификатором этой формы.

  14. Собственные известные адреса удаляются независимо от результата опыта. После исключения внутри передачи некоторые адреса могут быть неизвестны коду; время их жизни ограничено уничтожением формы, а не обещанием немедленной полной очистки.

  15. Собственные файлы удаляются только по фиксированным именам; каталог удаляется лишь после проверки его пустоты. Любые неизвестные файлы или подкаталоги остаются для ручного разбора.

  16. Основная команда и кнопка ПередатьСвойФайл85. В каталоге используются source.txt и moved.txt; copy.txt не создаётся, но остаётся одним из фиксированных имён границы очистки.

&НаКлиенте
Асинх Процедура ПередатьСвойФайл85(Команда)
    ПроверитьСвойСтенд85();
    Занято85 = Истина;
    К = Неопределено;
    СвоиАдреса = Новый Массив;
    ОшибкаОпыта = "";
    Отчет = "";
    Попытка
        К = СоздатьСвойКонтекст85();
        СоздатьКаталог(К.Каталог);
        К.КаталогСоздан = Истина;
        ЗаписатьСвойИсходник85(К);
        ПередНачалом = Новый ОписаниеОповещения("ПередСвоимФайлом85", ЭтаФорма, К);
        Помещенный = Ждать ПоместитьФайлНаСерверАсинх(, ПередНачалом, , К.Исходник, УникальныйИдентификатор);
        ЗапомнитьСвойАдрес85(Помещенный, СвоиАдреса);
        Если Помещенный = Неопределено Тогда
            Отчет = "Помещение отменено. Проверка успешной передачи не выполнялась.";
        ИначеЕсли Помещенный.ПомещениеФайлаОтменено Тогда
            Отчет = "Свой файл не помещён: операция отменена.";
        Иначе
            Адрес = ПроверитьСвоеПомещение85(Помещенный, "source.txt", К.ОжидаемыеБайты);
            ПроверитьСвоюОбласть85(К);
            Назначение = Новый Файл(К.Перемещенный);
            Если Назначение.Существует() Тогда
                ВызватьИсключение "Свое назначение уже занято; перезапись запрещена";
            КонецЕсли;
            Полученный = Ждать ПолучитьФайлССервераАсинх(Адрес, К.Перемещенный);
            Отчет = ПроверитьСвоеПолучение85(Полученный, К.Перемещенный, Адрес, К.ОжидаемыеБайты);
            ПроверитьСвойПоиск85(НайтиФайлы(К.Каталог, "*.txt", Ложь), К);
            Отчет = "ABC-85 прошёл клиент → временное хранилище → клиент; байты совпали. " + Отчет;
        КонецЕсли;
        Если К.ПричинаОтказа <> "" Тогда
            Отчет = Отчет + " " + К.ПричинаОтказа;
        КонецЕсли;
    Исключение
        ОшибкаОпыта = ОписаниеОшибки();
    КонецПопытки;
    ЗавершитьСвоюПередачу85(К, СвоиАдреса, ОшибкаОпыта, Отчет);
КонецПроцедуры

&НаКлиенте
Процедура ПередСвоимФайлом85(ПомещаемыйФайл, ОтказОтПомещенияФайла, К) Экспорт
    Если ТипЗнч(ПомещаемыйФайл) <> Тип("СсылкаНаФайл") Тогда
        ОтказОтПомещенияФайла = Истина;
        К.ПричинаОтказа = "Перед началом не получена ожидаемая СсылкаНаФайл";
        Возврат;
    КонецЕсли;
    Если ПомещаемыйФайл.Имя <> "source.txt" Тогда
        ОтказОтПомещенияФайла = Истина;
        К.ПричинаОтказа = "К передаче предложено не своё имя";
    ИначеЕсли К.Отменить Тогда
        ОтказОтПомещенияФайла = Истина;
        К.ПричинаОтказа = "Контролируемая отмена до помещения собственного файла";
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ЗапомнитьСвойАдрес85(Помещенный, СвоиАдреса)
    Если ТипЗнч(Помещенный) = Тип("ОписаниеПомещенногоФайла") Тогда
        Адрес = Помещенный.Адрес;
        Если ТипЗнч(Адрес) = Тип("Строка") И Адрес <> "" Тогда
            Если СвоиАдреса.Найти(Адрес) = Неопределено Тогда
                СвоиАдреса.Добавить(Адрес);
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Функция ПроверитьСвоеПомещение85(Помещенный, Имя, ОжидаемыеБайты)
    Если ТипЗнч(Помещенный) <> Тип("ОписаниеПомещенногоФайла") Тогда
        ВызватьИсключение "Нужно реальное описание результата помещения";
    КонецЕсли;
    Если Помещенный.ПомещениеФайлаОтменено Тогда
        ВызватьИсключение "Этот собственный файл не был помещён";
    КонецЕсли;
    Адрес = Помещенный.Адрес;
    Если ТипЗнч(Адрес) <> Тип("Строка") Или Адрес = "" Тогда
        ВызватьИсключение "Нет реального адреса своего результата";
    КонецЕсли;
    СсылкаФайла = Помещенный.СсылкаНаФайл;
    Если ТипЗнч(СсылкаФайла) <> Тип("СсылкаНаФайл") Тогда
        ВызватьИсключение "Нет реальной ссылки на свой помещённый файл";
    КонецЕсли;
    Если СсылкаФайла.Имя <> Имя Тогда
        ВызватьИсключение "Ссылка результата относится к другому имени";
    КонецЕсли;
    ДанныеХранилища = ПолучитьИзВременногоХранилища(Адрес);
    Если ТипЗнч(ДанныеХранилища) <> Тип("ДвоичныеДанные") Тогда
        ВызватьИсключение "Во временном хранилище ожидались свои двоичные данные";
    КонецЕсли;
    Если Base64Строка(ДанныеХранилища) <> Base64Строка(ОжидаемыеБайты) Тогда
        ВызватьИсключение "Байты во временном хранилище не совпали со своим источником";
    КонецЕсли;
    Возврат Адрес;
КонецФункции

&НаКлиенте
Функция ПроверитьСвоеПолучение85(Полученный, Путь, Адрес, ОжидаемыеБайты)
    Если ТипЗнч(Полученный) <> Тип("ОписаниеПереданногоФайла") Тогда
        ВызватьИсключение "Без диалога требуется реальный результат ОписаниеПереданногоФайла";
    КонецЕсли;
    Если ТипЗнч(Полученный.ИдентификаторФайла) <> Тип("УникальныйИдентификатор") Тогда
        ВызватьИсключение "Не получен идентификатор переданного файла";
    КонецЕсли;
    ФайлНазначения = Новый Файл(Путь);
    Если Полученный.Имя <> ФайлНазначения.Имя
        Или Полученный.ПолноеИмя <> Путь Или Полученный.Хранение <> Адрес Тогда
        ВызватьИсключение "Описание получения не совпало со своим назначением и хранилищем";
    КонецЕсли;
    Если Не ФайлНазначения.Существует() Или ФайлНазначения.ЭтоКаталог() Тогда
        ВызватьИсключение "Реальный собственный файл после получения не найден";
    КонецЕсли;
    ПолученныеБайты = Новый ДвоичныеДанные(Путь);
    Если Base64Строка(ПолученныеБайты) <> Base64Строка(ОжидаемыеБайты) Тогда
        ВызватьИсключение "Полученный файл отличается от своих исходных байтов";
    КонецЕсли;
    Возврат Полученный.Имя + ": " + Строка(Полученный.ИдентификаторФайла);
КонецФункции

&НаКлиенте
Функция ОчиститьСвоиАдреса85(СвоиАдреса)
    ОшибкаОчистки = "";
    Для Каждого Адрес Из СвоиАдреса Цикл
        Попытка
            УдалитьИзВременногоХранилища(Адрес);
        Исключение
            ОшибкаОчистки = ОшибкаОчистки + " " + ОписаниеОшибки();
        КонецПопытки;
    КонецЦикла;
    Возврат ОшибкаОчистки;
КонецФункции

&НаКлиенте
Процедура ЗавершитьСвоюПередачу85(К, СвоиАдреса, ОшибкаОпыта, Отчет)
    ОшибкаХранилища = ОчиститьСвоиАдреса85(СвоиАдреса);
    ОшибкаФайлов = ОчиститьТолькоСвойОпыт85(К);
    Занято85 = Ложь;
    Если ОшибкаОпыта <> "" Или ОшибкаХранилища <> "" Или ОшибкаФайлов <> "" Тогда
        Итог85 = ОшибкаОпыта + " " + ОшибкаХранилища + " " + ОшибкаФайлов;
        ВызватьИсключение Итог85;
    КонецЕсли;
    Итог85 = Отчет + " Свои известные адреса удалены; свои файлы и пустой каталог удалены.";
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьСвойСтенд85()
    Если Не ПодтверждаюСвоиФайлы85 Тогда
        ВызватьИсключение "Только собственный новый стенд УчебнаяПередачаФайлов85 с согласием";
    КонецЕсли;
    Если Занято85 Тогда
        ВызватьИсключение "Дождитесь завершения текущего собственного опыта";
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Функция СоздатьСвойКонтекст85()
    Разделитель = ПолучитьРазделительПути();
    Каталог = ПолучитьИмяВременногоФайла("guidefiles");
    ФайлКаталога = Новый Файл(Каталог);
    Если ФайлКаталога.Существует() Тогда
        ВызватьИсключение "Уникальное имя уже занято; найденный объект не считается своим";
    КонецЕсли;
    К = Новый Структура;
    К.Вставить("Каталог", Каталог);
    К.Вставить("Разделитель", Разделитель);
    К.Вставить("КаталогСоздан", Ложь);
    К.Вставить("Исходник", Каталог + Разделитель + "source.txt");
    К.Вставить("Копия", Каталог + Разделитель + "copy.txt");
    К.Вставить("Перемещенный", Каталог + Разделитель + "moved.txt");
    К.Вставить("ОжидаемыеБайты", ПолучитьДвоичныеДанныеИзСтроки("ABC-85", КодировкаТекста.UTF8));
    К.Вставить("ПричинаОтказа", "");
    К.Вставить("Отменить", ОтменитьДоПередачи85);
    ПутьСвоегоКаталога85 = Каталог;
    Возврат К;
КонецФункции

&НаКлиенте
Процедура ПроверитьСвоюОбласть85(К)
    Если К.Каталог <> ПутьСвоегоКаталога85 Или Прав(К.Каталог, 11) <> ".guidefiles" Тогда
        ВызватьИсключение "Не совпал собственный сгенерированный каталог этого опыта";
    КонецЕсли;
    Если К.Исходник <> К.Каталог + К.Разделитель + "source.txt"
        Или К.Копия <> К.Каталог + К.Разделитель + "copy.txt"
        Или К.Перемещенный <> К.Каталог + К.Разделитель + "moved.txt" Тогда
        ВызватьИсключение "Изменились границы собственной файловой области";
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ЗаписатьСвойИсходник85(К)
    ПроверитьСвоюОбласть85(К);
    ФайлКаталога = Новый Файл(К.Каталог);
    Если Не К.КаталогСоздан Или Не ФайлКаталога.Существует() Или Не ФайлКаталога.ЭтоКаталог() Тогда
        ВызватьИсключение "Создание своего каталога ещё не подтверждено";
    КонецЕсли;
    ФайлИсходника = Новый Файл(К.Исходник);
    Если ФайлИсходника.Существует() Тогда
        ВызватьИсключение "Свой источник не должен перезаписывать существующий файл";
    КонецЕсли;
    К.ОжидаемыеБайты.Записать(К.Исходник);
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьСвойПоиск85(Найденные, К)
    ПроверитьСвоюОбласть85(К);
    Если ТипЗнч(Найденные) <> Тип("Массив") Или Найденные.Количество() <> 2 Тогда
        ВызватьИсключение "После перемещения нужны два реальных собственных txt-файла";
    КонецЕсли;
    Для Каждого Найденный Из Найденные Цикл
        Если Найденный.ПолноеИмя <> К.Исходник И Найденный.ПолноеИмя <> К.Перемещенный Тогда
            ВызватьИсключение "Поиск вернул неожиданный объект; не удаляйте его";
        КонецЕсли;
        Если Найденный.ЭтоКаталог() Тогда
            ВызватьИсключение "Вместо собственного txt-файла найден каталог";
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

&НаКлиенте
Функция ОчиститьТолькоСвойОпыт85(К)
    Если К = Неопределено Тогда
        Возврат "";
    КонецЕсли;
    ОшибкаОчистки = "";
    Попытка
        ПроверитьСвоюОбласть85(К);
    Исключение
        Возврат "Границы опыта не подтвердились; очистка не начата: " + ОписаниеОшибки();
    КонецПопытки;
    Если Не К.КаталогСоздан Тогда
        Возврат "Создание каталога не подтвердилось; автоматическая очистка не выполнялась";
    КонецЕсли;
    Имена = Новый Массив;
    Имена.Добавить(К.Исходник);
    Имена.Добавить(К.Копия);
    Имена.Добавить(К.Перемещенный);
    Для Каждого Имя Из Имена Цикл
        Попытка
            СвойФайл = Новый Файл(Имя);
            Если СвойФайл.Существует() Тогда
                Если СвойФайл.ЭтоКаталог() Тогда
                    ВызватьИсключение "На месте своего файла обнаружен каталог; его не удаляем";
                КонецЕсли;
                УдалитьФайлы(Имя);
            КонецЕсли;
            Если СвойФайл.Существует() Тогда
                ВызватьИсключение "Свой файл остался после удаления";
            КонецЕсли;
        Исключение
            ОшибкаОчистки = ОшибкаОчистки + " " + ОписаниеОшибки();
        КонецПопытки;
    КонецЦикла;
    Попытка
        СвойКаталог = Новый Файл(К.Каталог);
        Если СвойКаталог.Существует() Тогда
            Остаток = НайтиФайлы(К.Каталог, "*", Ложь);
            Если Остаток.Количество() <> 0 Тогда
                ВызватьИсключение "Каталог не пуст; неизвестные объекты не удаляем";
            КонецЕсли;
            УдалитьФайлы(К.Каталог);
        КонецЕсли;
        Если СвойКаталог.Существует() Тогда
            ВызватьИсключение "Свой пустой каталог остался после удаления";
        КонецЕсли;
    Исключение
        ОшибкаОчистки = ОшибкаОчистки + " " + ОписаниеОшибки();
    КонецПопытки;
    Возврат ОшибкаОчистки;
КонецФункции

&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
    Если Занято85 Тогда
        Отказ = Истина;
        ТекстПредупреждения = "Дождитесь завершения собственного файлового опыта";
    КонецЕсли;
КонецПроцедуры

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

  1. Проверка конфигурации, версии, согласия и занятости идёт до действий. Из собственных байтов создаётся source.txt в новом отдельном каталоге.

  2. Оповещение перед началом получает реальную СсылкаНаФайл, возвращаемый ОтказОтПомещенияФайла и свой контекст. Флажок отмены проверяется здесь; диалог выбора чужого файла не открывается.

  3. Ждать ПоместитьФайлНаСерверАсинх использует вариант по пути: пропущены прогресс и адрес, переданы свой путь и настоящий идентификатор формы. Платформа создаёт новый адрес, а не перезаписывает чужой.

  4. Реальный адрес запоминается до содержательных проверок. Отмена не превращается в успех; результат описания проверяется по типу, признаку отмены и реальной ссылке на имя source.txt.

  5. ПолучитьИзВременногоХранилища по собственному адресу возвращает реальные ДвоичныеДанные. Их Base64 сравнивается с исходными шестью байтами, чтобы проверить именно загрузку.

  6. Свой путь moved.txt сначала проверяется на отсутствие. Вариант ПолучитьФайлССервераАсинх без диалога возвращает ОписаниеПереданногоФайла, чьи имя, полный путь, адрес и тип UUID читаются и проверяются.

  7. Проверка файла на диске и повторное чтение ДвоичныеДанные подтверждают скачанные байты. Нерекурсивный поиск должен вернуть только source.txt и moved.txt.

  8. После успеха, отмены или ошибки независимо выполняются удаление известных собственных адресов и ограниченная очистка своих файлов. Итог сообщает успех только если все проверки и попытки очистки прошли без ошибок.

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

  1. Без отмены оба сравнения подтверждают ABC-85; итог содержит имя moved.txt и реальный UUID результата получения.

  2. С флажком отмены передача отклоняется до помещения, скачивание не выполняется и итог не утверждает совпадение байтов.

  3. В коде не создаются ОписаниеПомещенногоФайла и ОписаниеПереданногоФайла: оба происходят из реальных результатов.

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

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

При собственном ручном успешном запуске ABC-85 возвращается на клиент без изменения байтов; при контролируемой отмене успешная передача не заявляется.

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

  1. Адрес временного хранилища — не путь на диске сервера. Локальный путь клиента также не становится доступным серверу; передаются байты, а не право читать клиентский каталог.

  2. ПолучитьИзВременногоХранилища и УдалитьИзВременногоХранилища выполняют обращения к серверу даже из клиентского кода. Это не настоящая сеть к внешнему API; во время подготовки никакие обращения в 1С не выполнялись.

  3. Без идентификатора формы данные могут исчезнуть при следующем серверном запросе. Здесь используется реальный идентификатор формы и явная очистка известных адресов; закрытие/уничтожение формы — запасная граница жизни хранилища.

  4. Помещение может вернуть Неопределено при отмене. Если получено описание с ПомещениеФайлаОтменено=Истина, оно тоже не подтверждает успешную передачу.

  5. Вариант получения с диалогом возвращает Неопределено и не доказывает, что пользователь сохранил файл. Здесь применён вариант без диалога с проверкой реального описания и файла.

  6. ОписаниеПереданногоФайла получается только из реального результата API; Новый ОписаниеПереданногоФайла здесь недопустим. Его четыре используемых свойства только читаются.

  7. ИдентификаторФайла является УникальныйИдентификатор, а не доказательством совпадения содержимого. Байты дополнительно проверяются; равенство идентификаторов загрузки и скачивания не предполагается.

  8. Уникальное имя и Существует не являются атомарным резервированием пути. Проверки годятся для закрытого учебного каталога без стороннего вмешательства, а не для враждебной файловой среды.

  9. УдалитьФайлы может рекурсивно удалить каталог. Нельзя менять известные файловые имена на чужие пути или удалять непустой каталог; проверка ЭтоКаталог и проверка пустоты обязательны.

  10. Base64 сравнивает реальные байты, но расходует дополнительную память. Этот учебный подход рассчитан на шесть байт, а не гигабайтные выгрузки.

  11. ПередЗакрытием блокирует обычное закрытие занятой формы, но не отключение питания и принудительное завершение клиента. Гарантий очистки после аварии нет.

  12. Файлы здесь создаются только будущим ручным запуском владельца в собственном стенде. Это не резервное копирование данных; ни новых резервных копий, ни архивов справочника при подготовке не создаётся.

  13. Этот код не даёт production-разрешение удалять адреса, полученные от недоверенного клиента. Он работает только с результатами собственного опыта в новой пустой базе и не является готовым сервисом загрузки для других пользователей.

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

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

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

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

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