Введение
Довольно часто нужно решить задачу интеграции работы с файлами в 1С.
Например, у менеджера есть Excel-файл и нужно обработать данные.
Или же наоборот на сервере 1С находится какой-то важный файл и пользователю нужен доступ к этому файлу со своего ПК.
Как итог нужно выполнить передачу файл с клиента на сервере или же с сервера на клиент. Когда база была файловая, то все было просто.
Но теперь у вас база клиент-серверная, да к тому же часть пользователей работают в web-клиенте, и как теперь писать код?! Для решения этой проблемы была разработана обработка-шаблон "Работа с файлами".
Описание
Обработка "Работа с файлами" представляет собой полностью автономное решение, с точки зрения встраивания в любую конфигурацию, как на обычных, так и на управляемых формах! Рекомендуемая версия платформы 8.3.3.721 и выше. В связи с отказом от модальности.
Обработка демонстрирует работу загрузки файла с клиента на сервер и загрузки файла с сервера на клиент.
Тестирование проходило на платформе 8.3.14.1630 в толстом, тонком клиенте, а также web-клиенте.
Версия 3 тестировалась на платформе 8.3.15.1489 в толстом, тонком клиенте, а также web-клиенте.
Весь функционал проиллюстрирован в скриншотах.
На форме обработки есть реквизиты "Интерактивно" - булево, "Результат" - строка. Обработка содержит реквизиты "ИмяФайла" и "ИмяФайлаНаСервере" - строка.
#Область ЧтениеФайлаНаКлиенте
&НаКлиенте
Процедура ИмяФайлаНаКлиентеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
ИмяРеквизита = ПолучитьИмяРеквизитаНаСервере(Элемент.Имя);
ПроверитьРаботуРасширенияРаботыСФайлами(ИмяРеквизита);
КонецПроцедуры
&НаКлиенте
Процедура ИмяФайлаНаКлиентДляСервераНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
ИмяРеквизита = ПолучитьИмяРеквизитаНаСервере(Элемент.Имя);
ПроверитьРаботуРасширенияРаботыСФайлами(ИмяРеквизита);
КонецПроцедуры
#КонецОбласти
#Область ЗагрузитьФайлСКлиентаНаСерверИнтерактивно
&НаКлиенте
Процедура ЗагрузитьФайлСКлиентаНаСерверИнтерактивно(Команда)
Интерактивно = Истина;
ИмяРеквизита = "ИмяФайла";
ПроверитьРаботуРасширенияРаботыСФайлами(ИмяРеквизита);
КонецПроцедуры
#КонецОбласти
#Область ВыбораФайла
&НаКлиенте
Процедура ПроверитьРаботуРасширенияРаботыСФайлами(ДополнительныеПараметры)
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеПодключенияРасширенияРаботыСФайлами", ЭтотОбъект, ДополнительныеПараметры);
НачатьПодключениеРасширенияРаботыСФайлами(ОписаниеОповещения);
КонецПроцедуры
&НаКлиенте
Процедура ПослеПодключенияРасширенияРаботыСФайлами(Подключено, ДополнительныеПараметры) Экспорт
Если Подключено Тогда
ВыборФайла(ДополнительныеПараметры, Истина, "xls");
Иначе
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеУстановкиРасширенияРаботыСФайлами", ЭтотОбъект, ДополнительныеПараметры);
НачатьУстановкуРасширенияРаботыСФайлами(ОписаниеОповещения);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПослеУстановкиРасширенияРаботыСФайлами(ДополнительныеПараметры) Экспорт
ПроверитьРаботуРасширенияРаботыСФайлами(ДополнительныеПараметры);
КонецПроцедуры
// Открывает диалог выбора файла.
//
// Параметры:
// Элемент - Элемент управления, для которого выбираем файл.
// ПроверятьСуществование - Если Истина, то выбор отменяется если файл не существует.
//
&НаКлиенте
Процедура ВыборФайла(ИмяРеквизита, ПроверятьСуществование, Знач РасширениеПоУмолчанию = "xml")
ОписаниеОповещения = Новый ОписаниеОповещения("ВыполнитьПослеВыбораФайла", ЭтотОбъект, ИмяРеквизита);
ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ДиалогВыбораФайла.Фильтр = ПолучитьФильтрДиалогаВыбораФайла();
ДиалогВыбораФайла.Расширение = РасширениеПоУмолчанию;
ДиалогВыбораФайла.Заголовок = НСтр("ru = 'Выберите файл'");
ДиалогВыбораФайла.ПредварительныйПросмотр = Ложь;
ДиалогВыбораФайла.ИндексФильтра = 0;
ДиалогВыбораФайла.ПолноеИмяФайла = Объект[ИмяРеквизита];
ДиалогВыбораФайла.ПроверятьСуществованиеФайла = ПроверятьСуществование;
ДиалогВыбораФайла.МножественныйВыбор = Ложь;
ДиалогВыбораФайла.Показать(ОписаниеОповещения);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьФильтрДиалогаВыбораФайла()
Фильтр = "Текстовый файл (*.txt)|*.txt|Excel 97-2003 (*.xls)|*.xls|Excel (*.xlsx)|*.xlsx|Изображение (*.png)|*.png|Все файлы (*.*)|*.*";
Возврат Фильтр;
КонецФункции
&НаКлиенте
Процедура ВыполнитьПослеВыбораФайла(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
Если ВыбранныеФайлы <> Неопределено Тогда
Для Каждого ВыбраныйФайл Из ВыбранныеФайлы Цикл
Объект[ДополнительныеПараметры] = ВыбраныйФайл;
Если Интерактивно Тогда
// До этого вызов диалога выбора файла и установка расширения браузера
// Для веб-клиента
#Если ВебКлиент Тогда
// Создаем массив с описанием передаваемых файлов
ПомещаемыеФайлы = Новый Массив;
ПомещаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(ВыбраныйФайл, ""));
// Передаем файлы на сервер синхронно
// Подготавливаем массив для помещения результатов
//ПомещенныеФайлы = Новый Массив;
//Если НЕ Поместитьфайлы(Помещаемыефайлы, ПомещенныеФайлы, Ложь, УникальныйИдентификатор) Тогда
// Сообщить("0шибка прикрепления файла: " + ОписаниеОшибки());
//Иначе
// //Вызываем серверный метод для обработки данных файлов на серверной стороне
// ПрикрепитьФайлНаСервер(ПомещенныеФайлы, Истина);
//КонецЕсли;
// Передаем файлы на сервер асинхронно
ОписаниеОповещения = Новый ОписаниеОповещения("ВыполнитьПослеПомещенияФайлов", ЭтотОбъект);
НачатьПомещениеФайлов(ОписаниеОповещения, Помещаемыефайлы, , Ложь, УникальныйИдентификатор);
// Для тонкого клиента
#Иначе
// Получаем двоичные данные файла
ДвоичныеДанные = Новый ДвоичныеДанные(ВыбраныйФайл);
// Передаем данные файла на сервер для записи в базу данных
ПрикрепитьФайлНаСервер(ДвоичныеДанные);
#КонецЕсли
КонецЕсли;
КонецЦикла;
КонецЕсли;
Интерактивно = Ложь;
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьПослеПомещенияФайлов(ПомещенныеФайлы, ДополнительныеПараметры) Экспорт
Если ПомещенныеФайлы <> Неопределено Тогда
ПрикрепитьФайлНаСервер(ПомещенныеФайлы, Истина);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПрикрепитьФайлНаСервер(Данные, ЭтоВебКлиент = Ложь)
// Если процедура была вызвана со стороны веб-клиента, то сначала необходимо получить двоичные данные из временного хранилища значений
Если ЭтоВебКлиент Тогда
АдресПрикрепленныйФайл = Данные[0].Хранение;
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресПрикрепленныйФайл);
Иначе
// Двоичные данные файла, переданные с клиента
ДвоичныеДанные = Данные;
КонецЕсли;
// Ваш код по обработке данных
// Например, прочитаем двоичные данные файла на сервере и выведем его текстовое содержимое
ЧтениеДанных = Новый ЧтениеДанных(ДвоичныеДанные);
Результат = "Прочитаем двоичные данные файла на сервере и выведем его текстовое содержимое: " + Символы.ПС + ЧтениеДанных.ПрочитатьСимволы(, КодировкаТекста.Системная);
ЧтениеДанных.Закрыть();
КонецПроцедуры
#КонецОбласти
#Область ЗагрузитьФайлСКлиентаНаСервер
&НаКлиенте
Процедура ЗагрузитьФайлСКлиентаНаСервер(Команда)
ИмяФайлаНаКлиенте = Объект.ИмяФайла;
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеПроверкиЭтоФайл", ЭтотОбъект, ИмяФайлаНаКлиенте);
ТекущийФайл = Новый Файл(ИмяФайлаНаКлиенте);
ТекущийФайл.НачатьПроверкуСуществования(ОписаниеОповещения);
КонецПроцедуры
&НаКлиенте
Процедура ПослеПроверкиЭтоФайл(Существует, ДополнительныеПараметры) Экспорт
Если Существует Тогда
ВыбраныйФайл = ДополнительныеПараметры;
#Если ВебКлиент Тогда
// Создаем массив с описанием передаваемых файлов
ПомещаемыеФайлы = Новый Массив;
ПомещаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(ВыбраныйФайл, ""));
// Передаем файлы на сервер синхронно
// Подготавливаем массив для помещения результатов
//ПомещенныеФайлы = Новый Массив;
//Если НЕ Поместитьфайлы(Помещаемыефайлы, ПомещенныеФайлы, Ложь, УникальныйИдентификатор) Тогда
// Сообщить("0шибка прикрепления файла: " + ОписаниеОшибки());
//Иначе
// //Вызываем серверный метод для обработки данных файлов на серверной стороне
// ПрикрепитьФайлНаСервер(ПомещенныеФайлы, Истина);
//КонецЕсли;
// Передаем файлы на сервер асинхронно
ОписаниеОповещения = Новый ОписаниеОповещения("ВыполнитьПослеПомещенияФайлов", ЭтотОбъект);
НачатьПомещениеФайлов(ОписаниеОповещения, Помещаемыефайлы, , Ложь, УникальныйИдентификатор);
// Для тонкого клиента
#Иначе
// Получаем двоичные данные файла
ДвоичныеДанные = Новый ДвоичныеДанные(ВыбраныйФайл);
// Передаем данные файла на сервер для записи в базу данных
ПрикрепитьФайлНаСервер(ДвоичныеДанные);
#КонецЕсли
Иначе
ТекстСообщения = "Укажите существующий файл!";
КлючДанных = Неопределено;
Поле = "ИмяФайла";
ПутьКДанным = "Объект";
//ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения, КлючДанных, Поле, ПутьКДанным);
// Если нет БСП
СообщитьПользователю(ТекстСообщения, КлючДанных, Поле, ПутьКДанным);
КонецЕсли;
КонецПроцедуры
#КонецОбласти
1. В пункте 1 "С клиента на сервер" также указан код для получения имени реквизита файла для клиенте на вкладке "С сервера на клиент".
#Область ЧтениеФайлаНаСервере
&НаКлиенте
Процедура ИмяФайлаНаСервереНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
ИмяРеквизита = ПолучитьИмяРеквизитаНаСервере(Элемент.Имя);
ПроверитьРаботуРасширенияРаботыСФайлами(ИмяРеквизита);
КонецПроцедуры
#КонецОбласти
#Область ЗагрузитьФайлССервераНаКлиент
&НаКлиенте
Процедура ЗагрузитьФайлССервераНаКлиент(Команда)
ПутьКФайлуНаКлиенте = Объект.ИмяФайла;
АдресФайлаВоВременномХранилище = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор);
РезультатПоискаФайла = "";
ПутьКФайлуНаСервере = Объект.ИмяФайлаНаСервере;
ПолучитьДанныеФайла(АдресФайлаВоВременномХранилище, ПутьКФайлуНаСервере, РезультатПоискаФайла);
ОповещениеОЗавершении = Новый ОписаниеОповещения("ВыполнитьПослеПолученияФайлов", ЭтотОбъект, РезультатПоискаФайла, "ВыполнитьПослеНеудачиПолученияФайлов", ЭтотОбъект);
ОписаниеПередаваемогоФайла = Новый ОписаниеПередаваемогоФайла(ПутьКФайлуНаКлиенте, АдресФайлаВоВременномХранилище);
ПолучаемыеФайлы = Новый Массив;
ПолучаемыеФайлы.Добавить(ОписаниеПередаваемогоФайла);
НачатьПолучениеФайлов(ОповещениеОЗавершении, ПолучаемыеФайлы, , Ложь);
КонецПроцедуры
&НаСервере
Процедура ПолучитьДанныеФайла(АдресФайла, ПутьКФайлуНаСервере, РезультатПоискаФайла = "") Экспорт
МассивФайлов = НайтиФайлы(ПутьКФайлуНаСервере);
Если МассивФайлов.Количество() > 0 Тогда
ПутьФайла = МассивФайлов[0].ПолноеИмя;
Попытка
ДанныеФайла = Новый ДвоичныеДанные(ПутьФайла);
ПоместитьВоВременноеХранилище(ДанныеФайла, АдресФайла);
Исключение
АдресФайла = Неопределено;
РезультатПоискаФайла = " Не удалось прочитать файл на сервере!";
КонецПопытки;
Иначе
АдресФайла = Неопределено;
РезультатПоискаФайла = " На сервере не найден файл " + ПутьКФайлуНаСервере + "!";
КонецЕсли;
КонецПроцедуры // ПолучитьДанныеФайла
&НаКлиенте
Процедура ВыполнитьПослеПолученияФайлов(ПолученныеФайлы, ДополнительныеПараметры) Экспорт
Если ПолученныеФайлы = Неопределено Тогда
//ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Файл не удалось получить!");
ТекстСообщения = "Файл не удалось получить!";
КлючДанных = Неопределено;
Поле = "";
ПутьКДанным = "";
// Если нет БСП
СообщитьПользователю(ТекстСообщения, КлючДанных, Поле, ПутьКДанным);
Иначе
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеОткрытияФайла", ЭтотОбъект);
Для Каждого Файл Из ПолученныеФайлы Цикл
НачатьЗапускПриложения(ОписаниеОповещения, Файл.ПолноеИмя);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПослеОткрытияФайла(КодВозврата, ДополнительныеПараметры) Экспорт
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьПослеНеудачиПолученияФайлов(Информация, СтандартнаяОбработка, ДополнительныеПараметры) Экспорт
//ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Ошибка!" + ДополнительныеПараметры);
ТекстСообщения = "Ошибка!" + ДополнительныеПараметры;
КлючДанных = Неопределено;
Поле = "";
ПутьКДанным = "";
// Если нет БСП
СообщитьПользователю(ТекстСообщения, КлючДанных, Поле, ПутьКДанным);
КонецПроцедуры
#КонецОбласти
#Область ЗагрузитьФайлССервераНаКлиентИнтерактивно
&НаКлиенте
Процедура ЗагрузитьФайлССервераНаКлиентИнтерактивно(Команда)
ПроверитьРаботуРасширенияРаботыСФайламиНаКлиенте();
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьРаботуРасширенияРаботыСФайламиНаКлиенте()
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеПодключенияРасширенияРаботыСФайламиНаКлиенте", ЭтотОбъект);
НачатьПодключениеРасширенияРаботыСФайлами(ОписаниеОповещения);
КонецПроцедуры
&НаКлиенте
Процедура ПослеПодключенияРасширенияРаботыСФайламиНаКлиенте(Подключено, ДополнительныеПараметры) Экспорт
Если Подключено Тогда
ЗагрузитьФайлССервераНаКлиентПослеУстановкиРасширенияРаботыСФайлам();
Иначе
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеУстановкиРасширенияРаботыСФайламиНаКлиенте", ЭтотОбъект);
НачатьУстановкуРасширенияРаботыСФайлами(ОписаниеОповещения);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПослеУстановкиРасширенияРаботыСФайламиНаКлиенте(ДополнительныеПараметры) Экспорт
ПроверитьРаботуРасширенияРаботыСФайламиНаКлиенте();
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьФайлССервераНаКлиентПослеУстановкиРасширенияРаботыСФайлам()
ПутьКФайлуНаКлиенте = "";
АдресФайлаВоВременномХранилище = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор);
РезультатПоискаФайла = "";
ПутьКФайлуНаСервере = Объект.ИмяФайлаНаСервере;
ПолучитьДанныеФайла(АдресФайлаВоВременномХранилище, ПутьКФайлуНаСервере, РезультатПоискаФайла);
ОповещениеОЗавершении = Новый ОписаниеОповещения("ВыполнитьПослеПолученияФайлов", ЭтотОбъект, РезультатПоискаФайла, "ВыполнитьПослеНеудачиПолученияФайлов", ЭтотОбъект);
ОписаниеПередаваемогоФайла = Новый ОписаниеПередаваемогоФайла(ПутьКФайлуНаКлиенте, АдресФайлаВоВременномХранилище);
ПолучаемыеФайлы = Новый Массив;
ПолучаемыеФайлы.Добавить(ОписаниеПередаваемогоФайла);
ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
ДиалогВыбораФайла.Фильтр = ПолучитьФильтрДиалогаВыбораФайла();
ДиалогВыбораФайла.Расширение = "";
ДиалогВыбораФайла.Заголовок = НСтр("ru = 'Сохранить файл'");
ДиалогВыбораФайла.ПредварительныйПросмотр = Ложь;
ДиалогВыбораФайла.ИндексФильтра = 0;
ДиалогВыбораФайла.ПолноеИмяФайла = "";
ДиалогВыбораФайла.ПроверятьСуществованиеФайла = Ложь;
ДиалогВыбораФайла.МножественныйВыбор = Ложь;
НачатьПолучениеФайлов(ОповещениеОЗавершении, ПолучаемыеФайлы, ДиалогВыбораФайла, Истина);
КонецПроцедуры
#КонецОбласти
#Область Служебные
&НаСервере
Функция ПолучитьИмяРеквизитаНаСервере(ЭлементИмя)
ИмяРеквизита = "";
МассивПутьКДанным = СтрРазделить(Элементы[ЭлементИмя].ПутьКДанным, ".");
Для Каждого Элемент Из МассивПутьКДанным Цикл
ИмяРеквизита = Элемент;
КонецЦикла;
Возврат ИмяРеквизита;
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Процедура СообщитьПользователю(ТекстСообщения, КлючДанных, Поле, ПутьКДанным)
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = ТекстСообщения;
Сообщение.КлючДанных = КлючДанных;
Сообщение.Поле = Поле;
Сообщение.ПутьКДанным = ПутьКДанным;
Сообщение.Сообщить();
КонецПроцедуры
#КонецОбласти
Доработка для отказа установки расширения в web-клиенте.
Ограничения:
1. Платформа не ниже 8.3.13.1513.
2. На мобильной клиенте параметр <Интерактивно> процедуры "НачатьПомещениеФайла" игнорируется и диалоговое окно выбора файла не отображается никогда.
3. Нет возможности получить полный путь файла на клиенте.
Изменения в коде:
При неудачи установить расширение работы с файлами теперь задается вопрос о повторной установке.
Если повторить установку, то алгоритм продолжит работу как и раньше.
Если прервать, то алгоритм завершит работу.
Если пропустить установку, то будет выполняться альтернативный алгоритм без установки расширения работы с файлами (обратите внимание на ограничения данного алгоритма)!
#Область ВыбораФайла
&НаКлиенте
Процедура ПослеПодключенияРасширенияРаботыСФайлами(Подключено, ДополнительныеПараметры) Экспорт
Если Подключено Тогда
ВыборФайла(ДополнительныеПараметры, Истина, "xls");
Иначе
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеЗакрытияВопроса", ЭтотОбъект, ДополнительныеПараметры);
ТекстВопроса = "Повторить установку расширения?";
ЗаголовокВопроса = "Расширение не подключено!";
КнопкиВопроса = РежимДиалогаВопрос.ПрерватьПовторитьПропустить;
ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, КнопкиВопроса, 0, , ЗаголовокВопроса);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗакрытияВопроса(РезультатВопроса, ДополнительныеПараметры) Экспорт
Если РезультатВопроса = КодВозвратаДиалога.Повторить Тогда
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеУстановкиРасширенияРаботыСФайлами", ЭтотОбъект, ДополнительныеПараметры);
НачатьУстановкуРасширенияРаботыСФайлами(ОписаниеОповещения);
ИначеЕсли РезультатВопроса = КодВозвратаДиалога.Пропустить Тогда
ВыборФайлаБезРасширения(ДополнительныеПараметры, Истина, "xls");
Иначе
ТекстСообщения = "Расширение не установлено, продолжить работу невозможно!";
КлючДанных = Неопределено;
Поле = "";
ПутьКДанным = "";
// Если нет БСП
СообщитьПользователю(ТекстСообщения, КлючДанных, Поле, ПутьКДанным);
//ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения, КлючДанных, Поле, ПутьКДанным);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ВыборФайлаБезРасширения(ИмяРеквизита, ПроверятьСуществование, Знач РасширениеПоУмолчанию = "xml")
ОбработкаНачалаЗагрузки = Новый ОписаниеОповещения("ПередНачаломПомещенияФайла", ЭтотОбъект, ИмяРеквизита);
ОписаниеОповещения = Новый ОписаниеОповещения("ВыполнитьПослеВыбораФайлаБезРасширения", ЭтотОбъект, ИмяРеквизита);
ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ДиалогВыбораФайла.Фильтр = ПолучитьФильтрДиалогаВыбораФайла();
ДиалогВыбораФайла.Расширение = РасширениеПоУмолчанию;
ДиалогВыбораФайла.Заголовок = НСтр("ru = 'Выберите файл'");
ДиалогВыбораФайла.ПредварительныйПросмотр = Ложь;
ДиалогВыбораФайла.ИндексФильтра = 0;
ДиалогВыбораФайла.ПолноеИмяФайла = Объект[ИмяРеквизита];
ДиалогВыбораФайла.ПроверятьСуществованиеФайла = ПроверятьСуществование;
ДиалогВыбораФайла.МножественныйВыбор = Ложь;
НачатьПомещениеФайла(ОписаниеОповещения, , ДиалогВыбораФайла, Истина, УникальныйИдентификатор, ОбработкаНачалаЗагрузки);
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьПослеВыбораФайлаБезРасширения(Результат, Адрес, ПомещаемыйФайл, ДополнительныеПараметры) Экспорт
Если Результат Тогда
Объект[ДополнительныеПараметры] = ПомещаемыйФайл;
Если Интерактивно Тогда
//Получаем двоичные данные файла
ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);
// Передаем данные файла на сервер для записи в базу данных
ПрикрепитьФайлНаСервер(ДвоичныеДанные);
КонецЕсли;
Иначе
ТекстСообщения = "Расширение не установлено, продолжить работу невозможно!";
КлючДанных = Неопределено;
Поле = "";
ПутьКДанным = "";
// Если нет БСП
СообщитьПользователю(ТекстСообщения, КлючДанных, Поле, ПутьКДанным);
//ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения, КлючДанных, Поле, ПутьКДанным);
КонецЕсли;
Интерактивно = Ложь;
КонецПроцедуры
#КонецОбласти
#Область ЗагрузитьФайлССервераНаКлиентИнтерактивноБезРасширения
&НаКлиенте
Процедура ЗагрузитьФайлССервераНаКлиентИнтерактивноБезРасширения(Команда)
АдресФайлаВоВременномХранилище = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор);
РезультатПоискаФайла = "";
ПутьКФайлуНаСервере = Объект.ИмяФайлаНаСервере;
ПолучитьДанныеФайла(АдресФайлаВоВременномХранилище, ПутьКФайлуНаСервере, РезультатПоискаФайла);
ПолучитьФайл(АдресФайлаВоВременномХранилище, Объект.ИмяФайла, Истина);
КонецПроцедуры
#КонецОбласти
Для обычного приложения код не изменился, т.к. оно запускается только в толстом клиенте.
Адаптация для платформы 8.3.15.1489, режим совместимости конфигурации не играет роли.
Ограничения:
1. Платформа не ниже 8.3.15.1489.
2. Нет возможности получить полный путь файла на клиенте без установки расширения работы с файлами.
Изменения в коде:
1. Методы "НачатьПомещениеФайлов", "НачатьПомещениеФайла" и "НачатьПолучениеФайлов" устарели.
Код заменен на современные методы "НачатьПомещениеФайловНаСервер", "НачатьПомещениеФайлаНаСервер" и "НачатьПолучениеФайловССервера".
2. Добавлены проверки работы с файлами.
3. Оптимизирован код.
Для обычного приложения код немного отличается, в прилагаемой обработке есть обе формы с рабочим кодом. Или же вы можете самостоятельно его поправить!
P.S. Если материал вам помог, поблагодарите автора, поставив звездочку!