Можете скачать .dt файл приложенный к статье где есть работающее готовое решение, либо реализовать его самостоятельно с помощью следующего описания.
Реализация выполнена в регистре сведений, что делается немного сложнее чем со справочником или документом. Под справочник или документ вы легко сможете доработать код самостоятельно, всё интуитивно понятно.
Создан регистр сведений "РегистрФайлов":
Измерения:
- Наименование (строка 50)
Реквизиты:
- Файл (ХранилищеЗначения)
- ИмяФайла (Строка 255)
- РазмерФайла (Число 8,0 Неотрицательное)
У регистра создана форма записи на которую добавлен реквизит АдресФайла (Строка 0).
Добавлены 3 команды - Загрузить файл, Скачать файл и Удалить файл.
Прописан следующий код:
#Область ОбработчикиСобытийФормы &НаСервере Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) Если ЭтоАдресВременногоХранилища(АдресФайла) Тогда ТекущийОбъект.Файл = Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(АдресФайла)); ИначеЕсли Не ЗначениеЗаполнено(ТекущийОбъект.ИмяФайла) Тогда ТекущийОбъект.Файл = Новый ХранилищеЗначения(Неопределено); КонецЕсли; КонецПроцедуры #КонецОбласти #Область ОбработчикиКомандФормы &НаКлиенте Процедура ЗагрузитьФайл(Команда) ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов; ПараметрыДиалога.МножественныйВыбор = Ложь; ПараметрыДиалога.Заголовок = НСтр("ru = 'Выберите файл'; en = 'Select file'"); ПараметрыДиалога.Фильтр = НСтр("ru = 'Текстовый файл'; en = 'Text file'") + " (*.txt)|*.txt|"; ЗавершениеОбратныйВызов = Новый ОписаниеОповещения("ЗавершениеОбратныйВызов", ЭтотОбъект); ПрогрессОбратныйВызов = Новый ОписаниеОповещения("ПрогрессОбратныйВызов", ЭтотОбъект); ПередНачаломОбратныйВызов = Новый ОписаниеОповещения("ПередНачаломОбратныйВызов", ЭтотОбъект); НачатьПомещениеФайлаНаСервер(ЗавершениеОбратныйВызов, ПрогрессОбратныйВызов, ПередНачаломОбратныйВызов,, ПараметрыДиалога, ЭтаФорма.УникальныйИдентификатор); КонецПроцедуры &НаКлиенте Процедура СкачатьФайл(Команда) Если Не ЗначениеЗаполнено(Запись.ИмяФайла) Тогда Возврат; КонецЕсли; АдресФайлаДляСкачивания = АдресФайла; Если Не ЭтоАдресВременногоХранилища(АдресФайлаДляСкачивания) Тогда АдресФайлаДляСкачивания = ПолучитьАдресФайлаДляСкачивания(); КонецЕсли; Если ЭтоАдресВременногоХранилища(АдресФайлаДляСкачивания) Тогда ПараметрыДиалога = Новый ПараметрыДиалогаПолученияФайлов; ПараметрыДиалога.Заголовок = НСтр("ru = 'Выберите путь для сохранения файла'; en = 'Select the path to save the file'"); НачатьПолучениеФайлаССервера(АдресФайлаДляСкачивания, Запись.ИмяФайла, ПараметрыДиалога); КонецЕсли; КонецПроцедуры &НаСервере Функция ПолучитьАдресФайлаДляСкачивания() МенеджерЗаписи = РегистрыСведений.РегистрФайлов.СоздатьМенеджерЗаписи(); ЗаполнитьЗначенияСвойств(МенеджерЗаписи, Запись.ИсходныйКлючЗаписи); МенеджерЗаписи.Прочитать(); АдресДляСкачивания = Неопределено; Если МенеджерЗаписи.Выбран() Тогда ДанныеФайла = МенеджерЗаписи.Файл.Получить(); Если ДанныеФайла <> Неопределено Тогда АдресДляСкачивания = ПоместитьВоВременноеХранилище(ДанныеФайла); КонецЕсли; КонецЕсли; Возврат АдресДляСкачивания; КонецФункции &НаКлиенте Процедура УдалитьФайл(Команда) Если Не ЗначениеЗаполнено(Запись.ИмяФайла) Тогда Возврат; КонецЕсли; ТекстВопроса = НСтр("ru = 'Удалить файл?'; en = 'Delete file?'"); ОписаниеОповещения = Новый ОписаниеОповещения("УдалитьФайлЗавершение", ЭтотОбъект); ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, РежимДиалогаВопрос.ДаНет, 60); КонецПроцедуры #КонецОбласти #Область СлужебныеПроцедурыИФункции &НаКлиенте Процедура ЗавершениеОбратныйВызов(ОписаниеПомещенногоФайла, ДополнительныеПараметры) Экспорт Если ОписаниеПомещенногоФайла = Неопределено Тогда Возврат; КонецЕсли; Если Не ФайлКорректный(ОписаниеПомещенногоФайла.Адрес) Тогда ТекстСообщения = НСтр("ru = 'Файл пустой'; en = 'File is empty'"); Сообщение = Новый СообщениеПользователю; Сообщение.Текст = ТекстСообщения; Сообщение.Сообщить(); // ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения); Возврат; КонецЕсли; Запись.ИмяФайла = ОписаниеПомещенногоФайла.СсылкаНаФайл.Имя; Запись.РазмерФайла = ОписаниеПомещенногоФайла.СсылкаНаФайл.Размер(); АдресФайла = ОписаниеПомещенногоФайла.Адрес; Модифицированность = Истина; КонецПроцедуры &НаСервереБезКонтекста Функция ФайлКорректный(АдресФайлаВоВременномХранилище) ПутьКФайлу = ПолучитьИмяВременногоФайла("txt"); ДанныеИзХранилища = ПолучитьИзВременногоХранилища(АдресФайлаВоВременномХранилище); Если ТипЗнч(ДанныеИзХранилища) = Тип("ДвоичныеДанные") Тогда ДанныеИзХранилища.Записать(ПутьКФайлу); КонецЕсли; // Проверка на то что файл корректный ЧтениеТекста = Новый ЧтениеТекста; ЧтениеТекста.Открыть(ПутьКФайлу); Текст = ЧтениеТекста.Прочитать(); Возврат ЗначениеЗаполнено(Текст); КонецФункции &НаКлиенте Процедура ПрогрессОбратныйВызов(ПомещаемыйФайл, Помещено, ОтказОтПомещенияФайла, ДополнительныеПараметры) Экспорт ТекстСообщения = СтрШаблон(НСтр("ru = 'Загрузка файла %1'; en = 'Uploading file %1'"), ПомещаемыйФайл.Имя); РазмерФайла = СтрШаблон(Нстр("ru = 'Размер файла %1 байт'; en = 'File size %1 bytes'"), ПомещаемыйФайл.Размер()); Состояние(ТекстСообщения, Помещено, РазмерФайла, БиблиотекаКартинок.Документ); КонецПроцедуры &НаКлиенте Процедура ПередНачаломОбратныйВызов(ПомещаемыйФайл, ОтказОтПомещенияФайла, ДополнительныеПараметры) Экспорт МегабайтВБайтах = 1000000; Если ПомещаемыйФайл.Размер() > МегабайтВБайтах Тогда ОтказОтПомещенияФайла = Истина; ТекстСообщения = СтрШаблон(НСтр("ru = 'Отказ. Загружаемый файл «%1» имеет размер более 1 мегабайта'; |en = 'Failure. The uploaded file «%1» is larger than 1 megabyte'"), ПомещаемыйФайл.Имя); Сообщение = Новый СообщениеПользователю; Сообщение.Текст = ТекстСообщения; Сообщение.Сообщить(); ОтказОтПомещенияФайла = Истина; //ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения,,,, ОтказОтПомещенияФайла); Иначе ПоказатьОповещениеПользователя(НСтр("ru = 'Загрузка файла'; en = 'Uploading file'"),, ПомещаемыйФайл.Имя); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура УдалитьФайлЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт Если РезультатВопроса = КодВозвратаДиалога.Да Тогда АдресФайла = ""; Запись.ИмяФайла = ""; Запись.РазмерФайла = 0; Модифицированность = Истина; КонецЕсли; КонецПроцедуры #КонецОбласти