gifts2017

Работа с файлами в 8.3

Опубликовал Арсений Прялкин (CeHbKA) в раздел Программирование - Практика программирования

Работа с файлами в 8.3(толстый, тонкий и web клиенты)

Время неумолимо идёт вперёд, а платформа 1С 8 бежит ещё быстрей этого времени.

Управляемые формы теперь называются "интерфейс ТАКСИ", модальные окна запрещены, а режим использования синхронных вызовов расширений и внешних компонент наглухо положил работоспособность большинства этих расширений и внешних компонент, и половину старых методов в добавок.

 

В общем, пацаны, дела такие - многие из вас читали статью великолепного Чистова П. о работе с файлами в 8.3

Если Вы ещё этого не сделали - бегом марш! (ссылка)

 

Суть механизма работы с файлами в кратце:

1) На клиенте выбираем файл

2) Пихаем его в чёрный ящик

3) Сохраняем содержимое чёрного ящика на сервере

 

Загвоздка состоит в том, что делать это надо особенно, по-новому и с душой.

Поэтому ваши

ВыбранныйФайл.Существует()

и прочие языческие штучки здесь не прокатят.

 

Итак, поехали!

Вот листинг кода, который позволяет загрузить файл с клиента

ОписаниеОповещения = Новый ОписаниеОповещения("ОбработатьВыборФайла", ЭтаФорма);
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
	
НачатьПомещениеФайлов(ОписаниеОповещения, , ДиалогОткрытияФайла, Истина, УникальныйИдентификатор);

Нас интересует метод "НачатьПомещениеФайлов", который, собственно, вызывает диалог выбора файла и помещает этот файл во временное хранилище. Заморачиваться с описанием временного хранилища нет смысла, просто запомните - это то место, куда помещаются все выбранные нами файлы в виде двоичных данных (черный ящик).

&НаКлиенте
Процедура ОбработатьВыборФайла(ПомещенныеФайлы, ДополнительныеПараметры) Экспорт

    Если ПомещенныеФайлы = Неопределено Тогда
        Возврат;
    КонецЕсли;

    Для каждого ПереданныйФайл Из ПомещенныеФайлы Цикл
        ПутьКФайлу = ПереданныйФайл.Имя;
        Запись.ИмяФайла = РазборСтроки(ПутьКФайлу, "\");
        Элементы.ОткрытьФайл.Заголовок = Запись.ИмяФайла;        
        Адрес = ПереданныйФайл.Хранение;
    КонецЦикла;
    
КонецПроцедуры // ()

Понять, что там и как храниться в этом временном хранилище практически невозможно. Можно только обратиться к нашему файлу по навигационной ссылке, которая присваивается автоматически (см. переменную "Адрес").

Идём дальше.

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

Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(Адрес));

С одним разобрались, теперь второе - как достать файл из этого хранилища значений (которое, напомню, находится на сервере) и сохранить на диск клиента?

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

Адрес = ПолучитьНавигационнуюСсылку(Объект.Ссылка, "ИмяРеквизита");

Будьте, внимательны! Эта навигационная ссылка уже не имеет с временным хранилищем ничего общего! Проверить тип навигационной ссылки можно методом

ЭтоАдресВременногоХранилища(Адрес)

По традиции, листинг кода, который вызывает диалог сохранения файла

ОписаниеОповещения = Новый ОписаниеОповещения("ОбработкаСохраненияФайлов", ЭтаФорма);
	
Файл = Новый ОписаниеПередаваемогоФайла(ИмяФайла, Адрес);
	
ПолучаемыеФайлы = Новый Массив;
ПолучаемыеФайлы.Добавить(Файл);
	
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
	
НачатьПолучениеФайлов(ОписаниеОповещения,ПолучаемыеФайлы, ДиалогОткрытияФайла, Истина);

Значение переменной "Файл" это ещё одна особенность данного способа. Здесь стоит обратить внимание на "ИмяФайла". Дело в том, что помещая файл во временное хранилище, информация о его имени и расширении теряется. Поэтому не забудьте где-нибудь сохранять корректное имя файла, или хотя бы его расширение, чтобы потом не мучаться с вопросом "А это вордовский документ или мп3?"

Метод "НачатьПолучениеФайлов" аналогичен методу "НачатьПомещениеФайлов". Просто один открывает диалог для выбора файла, другой же, наоборот, открывает диалог для сохранения файла.

 

В принципе всё.

При использовании данного способа, никакие совместимости модальности и синхронных вызовов в свойствах конфигурации устанавливать не нужно.

Статью писал больше как памятку для себя.

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Владимир (vladismi) 09.09.15 09:02
Как памятка - хорошо.
Плюс!
2. Влад Влад (surikateg) 09.09.15 09:36
Да, к сожалению новшества 1с превращают читаемый код в бред умственно отсталого. Автор молодец.
mrDSide; BigB; q_i; bulpi; CeHbKA; +5 Ответить
3. Юра Зенкин (jura376) 09.09.15 10:30
Код увеличивается в разы. жесть!!!
4. Bonov 09.09.15 10:50
Крайне бы не рекомендовал использовать подобный код где либо за пределами веб клиента. Минусы очевидны - безусловная загрузка любого файла. Представьте ситуацию, когда пользователь выберет файлике размером в 20 Гб, например? Все повиснет и надолго, ведь этот метод грузит все подряд, не давая вклиниться в обработку загрузки. На веб клиенте это единственный вариант без расширения работы с файлами, а вот в тонком и других клиентах стандартный диалог выбора файлов НО без использования модальности все же стоит использовать.
5. Ирина Мухачева (moli_i_n) 09.09.15 11:08
6. Арсений Прялкин (CeHbKA) 09.09.15 12:39
(4) Bonov, я не могу представить себе ситуацию, когда в базу 1С будут загружаться файлы объемом 20Гб
Я даже не могу представить себе ситуацию, когда в базу 1С будут загружаться файлы более 10-20мб (файлы оффиса, картинки, мп3 и прочее барахло)

А о том, что старые методы и совместимости, скоро уйдут в небытие, говорить бессмысленно
7. Михаил Гусев (Идальго) 09.09.15 16:08
(6) CeHbKA, чего тут представлять-то? Просто берете и выбираете файлы большие, видео и презентации, ПДФ-ки бывают огромные и т.п. Передача файлов это же не вопрос вашего представления вообще.
8. Арсений Прялкин (CeHbKA) 09.09.15 17:06
(7) Идальго, само по себе хранение больших файлов в недрах базы данных, тем более 1С, абсурдно. Для этого есть репозитории и файловые хранилища. К чему и приучаю своих клиентов.

А прикреплять к документу или элементу справочника PDF, который весит 300мб...
В общем, на своём половом органе я вертел такие PDF и уж тем более видео файлы :)

9. Константин Ермоленко (Quasar) 09.09.15 17:59
(8) CeHbKA, вопрос то не в том логично или нет загружать такие файлы, а в том, что можно просто случайно выбрать большой файл и понеслась))
10. Bonov 09.09.15 19:07
(8) CeHbKA, всегда найдется идиот, который и файл большой выберет, и экзешник загрузит, и вообще как только окно 1С перестанет отвечать на запросы в процессе загрузки файла - постарается его поскорее принудительно закрыть. Защита от дурака должна быть всегда! И для этого в 1С полно современных методов, соответствующих последним требованиям по совместимости. Нужно только прислушаться и разобраться, а не твердить свое...
11. Михаил Гусев (Идальго) 09.09.15 20:28
(8) CeHbKA, ну не храните большие файлы в недрах 1С, храните в репозитории. Но, что если репозиторий будет под управлением 1С и хранятся файлы централизовано на сервере? Один черт файлы передавать нужно будет на сервак из окна 1С. Другое дело, что 1С должна при этом давать возможность нормально работать (поток н-р дополнительный пилить или еще как-то).

А прикреплять к документу или элементу справочника PDF, который весит 300мб...
В общем, на своём половом органе я вертел такие PDF и уж тем более видео файлы

Отчасти я вас конечно понимаю, но вот далеко не всякому пользователю ясно, почему бы и не прикрепить файло в 300 мб к справочнику. Почему вы как программист не можете обеспечить корректность, надежность и т.п. этой операции? И на самом деле, пользователь прав, мало ли что у него за файлы и зачем они ему, по крайней мере это не должно волновать программиста, это не его задача. Его задача в обеспечении норм.работы пользователей и хотелок.
12. Павел Алексеенко (qwinter) 10.09.15 01:22
И это еще плюсуют?)))))
Идальго; +1 Ответить
13. Арсений Прялкин (CeHbKA) 10.09.15 09:53
CeHbKA, всегда найдется идиот...

Защита от дурака должна быть всегда!

(10) Bonov, мы друг друга прекрасно поняли :) Но от идиотов даже на кухне никто не застрахован)))
как только окно 1С перестанет отвечать на запросы в процессе загрузки файла - постарается его поскорее принудительно закрыть

не вижу в этом ничего плохого, загрузка всё равно идёт во временное хранилище. А заботиться о потерянных данных "дурака" (как вы выразились), как минимум странно
И для этого в 1С полно современных методов, соответствующих последним требованиям по совместимости. Нужно только прислушаться и разобраться, а не твердить свое...

Я не твержу своё, данный метод рекомендован самим вендором, иначе бы его не было и не было никаких режимов совместимости модальных окон и асинхронных методов. До поры до времени тонкий и web клиенты различаются, но всё ведёт к тому, что они будут единым целым. Достаточно посмотреть на западные примеры систем подобных 1С - работа в них строится через web
14. Арсений Прялкин (CeHbKA) 10.09.15 10:03
что если репозиторий будет под управлением 1С и хранятся файлы централизовано на сервере? Один черт файлы передавать нужно будет на сервак из окна 1С

(11) Идальго, это какое-то извращение, управлять файловым репозиторием через 1С, вы так не считаете?
Отчасти я вас конечно понимаю, но вот далеко не всякому пользователю ясно, почему бы и не прикрепить файло в 300 мб к справочнику

как я уже сказал выше, даже на кухне никто не застрахован)))
Почему вы как программист не можете обеспечить корректность, надежность и т.п. этой операции?

Потому что я не Господь Бог))) Пользователь же не спрашивает, почему механик в автосервисе не может обеспечить взаимозаменяемость з\ч от жигулей и кайена?)))
И на самом деле, пользователь прав, мало ли что у него за файлы и зачем они ему, по крайней мере это не должно волновать программиста, это не его задача. Его задача в обеспечении норм.работы пользователей и хотелок.

вот прекрасный ролик)))
http://www.youtube.com/watch?v=TGb6fNUkA4s
logarifm; +1 Ответить
15. Михаил Гусев (Идальго) 10.09.15 15:18
это какое-то извращение, управлять файловым репозиторием через 1С, вы так не считаете
1С это вообще извращение, особенно на УФ. Тем не менее, я допускаю, что репозиторий может иметь систему учета и управления (н-р у нас огромная библиотека здоровых фоток, книг, презентаций, видяшек и т.п.). Неужели вы считаете, что для этого никому не может требоваться система управления?

Потому что я не Господь Бог))) Пользователь же не спрашивает, почему механик в автосервисе не может обеспечить взаимозаменяемость з\ч от жигулей и кайена?)))
Он вполне может это спросить. Далее, сравнение не корректное. Вас же не просят сделать доработку 1С, чтобы она пользователям задницу подтирала.

А ролик действительно прекрасный.
16. Арсений Прялкин (CeHbKA) 10.09.15 17:27
Он вполне может это спросить. Далее, сравнение не корректное. Вас же не просят сделать доработку 1С, чтобы она пользователям задницу подтирала.

(15) Идальго, почему некорректное? Вы даже сами аналогию провели)))))
17. Михаил Гусев (Идальго) 10.09.15 17:57
(16) CeHbKA, потому что функции разные.

Итак, 1С умеет файлы прикреплять - умеет. Ну вот и пользователь может захотеть прикрепить огромный файл. Нигде же в документации не написано (вроде), что большие файлы прикреплять нельзя и не написано почему. А пользователю м.б. это нужно. И хорошо, что вы своих пользователей приучили только мелкие картинки грузить, но, полагаю, это решение скорее административного толка, не технологическое.
18. Максим Сухов (MaxS) 12.09.15 22:11
Сделал как-то загрузку картинок в номенклатуру УТ 11 с папки сервера. Объяснил почему с сервера, а не с клиента. Но пользователи захотели грузить с любого места - со своей папки, с флешки... Пришлось сделать.
Раз уж 1С такое наворотили, можно было бы в платформу добавить возможность просмотра свойств картинок, например, чтобы сообщить пользователю, что картинка огромная. И если 1С сумеет, предложить преобразовать в меньший размер (на клиенте), либо отказаться от загрузки.
19. Александр Хомяк (logarifm) 14.09.15 09:46
Плюсануть то я плюсанул, но вот в документации 1С все это расписано.

Руководство разработчика: Глава 4. Встроенный язык. 4.7.8. Синхронные и асинхронные методы работы

Следует почитать автору это прежде чем вообще говорить о том, что 1С не сделала или сделала не так. Как по мне то 1С молодцы и не топчуться на месте с ноги на ногу и делают революционные прорыви, пусть они не всем нравяться, я сам не любитель "Такси" да и слово подобрали. что вообще никто не понимает почему именно "Такси"... Но все же, мы на этом работаем и мы под это разрабатываем и давайте не будем утаивать и то, что на других языках есть масса неудобного использования - где на своих форумах вы также найдете как пинают святыню С++, Java и другие языки...

А может проблема не в языках программирования?... Думаю следует вначале посомтреть на себя, а смог бы я нечто подобное сделать прежде чем критиковать. У меня все!
SkyHunter; CeHbKA; +2 Ответить 2
20. Арсений Прялкин (CeHbKA) 14.09.15 10:09
(18) MaxS, да, я примерно о том же

(19) logarifm, спасибо большое за ваш комментарий!
Плюсануть то я плюсанул, но вот в документации 1С все это расписано.
Руководство разработчика: Глава 4. Встроенный язык. 4.7.8. Синхронные и асинхронные методы работы
Следует почитать автору это прежде чем вообще говорить о том, что 1С не сделала или сделала не так.

Так я не говорил, что она не сделала или сделала не так. Я просто констатировал факт. Не у всех есть возможность постоянно курить пособие, поэтому и сделал небольшую памятку (прежде всего для себя :)
21. Александр Хомяк (logarifm) 14.09.15 10:21
(20) CeHbKA, Извеняюсь и не будучи рекламой этого блога, просто на заметку автору, заведите себе блог. Я вот сделал такой блог (ссылка). Если я беру чьи-то статьи в него на заметку то обязательно это указываю. Зато удобно и всегда под рукой.
22. Владимир Васильев (VladimirKHV) 15.10.15 10:06
(20) CeHbKA, Скажу больше, не у всех есть это пособие.
(19) logarifm, Мы покупали 1С еще версии 8.2. Причем она была с книжками от 8.0.
Поэтому у нас "Описание встроенного языка", часть 1, глава4 называется "Общие объекты".
И где нам узнавать о новом функционале, если не в интернете? После каждого обновления платформы покупать новую версию?
23. Serj (Serj1C) 03.02.16 12:20
(22) VladimirKHV, список изменений не является секретом и всегда подробно описывается с каждым релизом электронно на сайте ИТС и портале обновлений. Например http://downloads.v8.1c.ru/content//Platform/8_3_7_1873/1cv8upd.htm
24. Алексей 1 (AlX0id) 10.03.16 15:40
(23) Serj1C,
Кабы кто еще додумался там (ну или в другом каком месте) именно постить различия между 8.3.7.1873 и 8.3.7.****, а не между 8.3.7.1873 и 8.2..
25. don (donyab) 29.03.16 17:59
На версии платформы 8.3.7.1949 ругается, что надо использовать расширение для работы с файлами, а при повторном вызове все удачно срабатывает.

Что бы это вылечить надо начинать со следующего кода:


#Если ВебКлиент Тогда
		НачатьПодключениеРасширенияРаботыСФайлами(Новый ОписаниеОповещения("ПослеПодключенияСохранениеАсинхронно", ЭтаФорма));
#КонецЕсли
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа