Работа с файлами в 8.3
Работа с файлами в 8.3(толстый, тонкий и web клиенты)
- Описание
- Подробнее
Описание
Время неумолимо идёт вперёд, а платформа 1С 8 бежит ещё быстрей этого времени.
Управляемые формы теперь называются «интерфейс ТАКСИ», модальные окна запрещены, а режим использования синхронных вызовов расширений и внешних компонент наглухо положил работоспособность большинства этих расширений и внешних компонент, и половину старых методов в добавок.
В общем, пацаны, дела такие — многие из вас читали статью великолепного Чистова П. о работе с файлами в 8.3
Если Вы ещё этого не сделали — бегом марш! (ссылка)
Суть механизма работы с файлами в кратце:
1) На клиенте выбираем файл
2) Пихаем его в чёрный ящик
3) Сохраняем содержимое чёрного ящика на сервере
Загвоздка состоит в том, что делать это надо особенно, по-новому и с душой.
Поэтому ваши
ВыбранныйФайл.Существует()и прочие языческие штучки здесь не прокатят.
Итак, поехали!
Вот листинг кода, который позволяет загрузить файл с клиента
ОписаниеОповещения = Новый ОписаниеОповещения("ОбработатьВыборФайла", ЭтаФорма);
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
НачатьПомещениеФайлов(ОписаниеОповещения, , ДиалогОткрытияФайла, Истина, УникальныйИдентификатор);Нас интересует метод «НачатьПомещениеФайлов«, который, собственно, вызывает диалог выбора файла и помещает этот файл во временное хранилище. Заморачиваться с описанием временного хранилища нет смысла, просто запомните — это то место, куда помещаются все выбранные нами файлы в виде двоичных данных (черный ящик).
&НаКлиенте
Процедура ОбработатьВыборФайла(ПомещенныеФайлы, ДополнительныеПараметры) Экспорт
Если ПомещенныеФайлы = Неопределено Тогда
Возврат;
КонецЕсли;
Для каждого ПереданныйФайл Из ПомещенныеФайлы Цикл
ПутьКФайлу = ПереданныйФайл.Имя;
Запись.ИмяФайла = РазборСтроки(ПутьКФайлу, "\");
Элементы.ОткрытьФайл.Заголовок = Запись.ИмяФайла;
Адрес = ПереданныйФайл.Хранение;
КонецЦикла;
КонецПроцедуры // ()Понять, что там и как храниться в этом временном хранилище практически невозможно. Можно только обратиться к нашему файлу по навигационной ссылке, которая присваивается автоматически (см. переменную «Адрес«).
Идём дальше.
С тем, что файлы нужно хранить в реквизите или ресурсе с типом «Хранилище значения«, спорить, думаю, никто не будет. Достать файл из временного хранилища и поместить его в реквизит с типом «Хранилище значения» можно след.образом:
Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(Адрес));С одним разобрались, теперь второе — как достать файл из этого хранилища значений (которое, напомню, находится на сервере) и сохранить на диск клиента?
Прежде всего, нам надо получить навигационную ссылку на реквизит с типом «Хранилище значения«, куда у нас помещается файл в виде бинарных данных.
Адрес = ПолучитьНавигационнуюСсылку(Объект.Ссылка, "ИмяРеквизита");Будьте, внимательны! Эта навигационная ссылка уже не имеет с временным хранилищем ничего общего! Проверить тип навигационной ссылки можно методом
ЭтоАдресВременногоХранилища(Адрес)По традиции, листинг кода, который вызывает диалог сохранения файла
ОписаниеОповещения = Новый ОписаниеОповещения("ОбработкаСохраненияФайлов", ЭтаФорма);
Файл = Новый ОписаниеПередаваемогоФайла(ИмяФайла, Адрес);
ПолучаемыеФайлы = Новый Массив;
ПолучаемыеФайлы.Добавить(Файл);
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
НачатьПолучениеФайлов(ОписаниеОповещения,ПолучаемыеФайлы, ДиалогОткрытияФайла, Истина);
Значение переменной «Файл» это ещё одна особенность данного способа. Здесь стоит обратить внимание на «ИмяФайла«. Дело в том, что помещая файл во временное хранилище, информация о его имени и расширении теряется. Поэтому не забудьте где-нибудь сохранять корректное имя файла, или хотя бы его расширение, чтобы потом не мучаться с вопросом «А это вордовский документ или мп3?«
Метод «НачатьПолучениеФайлов» аналогичен методу «НачатьПомещениеФайлов«. Просто один открывает диалог для выбора файла, другой же, наоборот, открывает диалог для сохранения файла.
В принципе всё.
При использовании данного способа, никакие совместимости модальности и синхронных вызовов в свойствах конфигурации устанавливать не нужно.
Статью писал больше как памятку для себя.

