Загрузка файла в БД, выгрузка и сохранение файла с БД

22.01.16

Разработка - Механизмы платформы 1С

С выходом новых релизов платформ 1С изменяются некоторые методы. Некоторые улучшаются, некоторые (не будем уточнять =) ). Тем не менее, изменения есть. В этой публикации я ознакомлю вас с методами загрузки и выгрузки файла (а это НачатьПомещениеФайла и НачатьПолучениеФайлов соответственно).

Разработано на 8.3.6.2041. Минимальная версия 8.3.3.641.

 

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

В свойствах конфигурации установлено:

Режим использования модальности - Не использовать
Режим использования синхронных вызовов - Не использовать (Свойство доступно начиная с версии 8.3.6.1760)
Режим совместимости - Не использовать. 

Настройки БД:

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

Спросите "Почему данные записываются в константу, а не в справочник или регистр сведений?". Тут все просто. Я посчитал что для упрощения понимания механизма использовать константу самое то :). Главное понять суть механизма, а вариант реализации программист уже выбирает исходя из структуры своей БД.

Почему не прикрепил конфигурацию, а выложил листинг кода?

Я считаю, что публикацию будет читать пользователь, уже имеющий опыт программирования в среде платформы 8.3 (умеет создавать объекты конфигурации, знает, что такое СП и как пользоваться встроенной справкой). Поэтому создать рабочий пример у себя в БД не составит особых проблем. Нужно: создать константу, создать общую форму, в новую форму вставить листинги кода (ниже в публикации), создать команды на форме (СохранитьФайл, ОткрытьФайл, УдалитьФайли подвязать обработчики.

Краткое описание используемых методов (копипаст СП не делал :) ):

НачатьПомещениеФайла - Вызывается диалог выбора файла. Выбранный файл помещается во временное хранилище. 
НачатьПолучениеФайлов - Выполняется получение данных файла с БД и сохранение файла в указанный пользователем каталог.
Файл - Доступ к свойствам файла по полному пути к файлу.
ПолучитьИзВременногоХранилища, ПоместитьВоВременноеХранилище - В данном примере это методы работы с двоичными данными файла.
НачатьПолучениеКаталогаДокументов (КаталогДокументов) - Получение каталога документов пользователя (аналог КаталогДокументов).
ОписаниеПередаваемогоФайла - Определение полного имени файла в ОС по которому будет сохранен файл из ИБ.
ОписаниеОповещения - Описание вызова процедуры которая будет вызвана после какого-то действия пользователя (Пример: После действия пользователя НачатьПолучениеКаталогаДокументов будет вызвана процедура, где в параметре "ИмяКаталогаДокументов" будет строка в полным адресом к каталогу документов пользоватя: "C:\Users\Имя пользователя\Documents"). 
НачатьЗапускПриложения - Открытие файла ассоциированным приложением. 

Примечание: Основные методы используются с 8.3.3.641. А НачатьПолучениеКаталогаДокументов с 8.3.6.1760.

Листинги:

Сохранение файла

#Область Сохранение_файла

&НаКлиенте
Процедура СохранитьФайл(Команда)
	
	НачатьПомещениеФайла(Новый ОписаниеОповещения("СохранитьФайлЗавершение", ЭтотОбъект),,, Истина, УникальныйИдентификатор);
	
КонецПроцедуры

&НаКлиенте
Процедура СохранитьФайлЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт 
	
	Если Не Результат Тогда
		Возврат;
	КонецЕсли;
	
	// Используется для определения имени файла. Что бы потом можно было сохранить файл в ОС и потом его открыть.
	Файл = Новый Файл(ВыбранноеИмяФайла);
	
	СохранитьФайлВКонстантуНаСервереБезКонтекста(Адрес, Файл.Имя);
	
КонецПроцедуры // СохранитьФайлЗавершение

&НаСервереБезКонтекста
Процедура СохранитьФайлВКонстантуНаСервереБезКонтекста(Адрес, ИмяФайла)  
	
	ДанныеФайла = ПолучитьИзВременногоХранилища(Адрес);
	
	СтруктураДанныхФайла = Новый Структура;
	СтруктураДанныхФайла.Вставить("ИмяФайла",		ИмяФайла);
	СтруктураДанныхФайла.Вставить("ДанныеФайла",	ДанныеФайла);
	
	Константы.ДанныеФайла.Установить(Новый ХранилищеЗначения(СтруктураДанныхФайла));
	
КонецПроцедуры // СохранитьФайлВКонстантуНаСервереБезКонтекста

#КонецОбласти


#Область Открытие_файла

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

&НаКлиенте
Процедура КаталогДокументовЗавершение(ИмяКаталогаДокументов, ДополнительныеПараметры) Экспорт 
	
	Адрес		= ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификатор);
	ИмяФайла	= "";
	
	ПолучитьДанныеФайлаНаСервереБезКонтекста(Адрес, ИмяФайла);
	
	ПолноеИмяФайла = ИмяКаталогаДокументов + ИмяФайла;
	
	МассивПолучаемыхФайлов = Новый Массив;
	МассивПолучаемыхФайлов.Добавить(Новый ОписаниеПередаваемогоФайла(ПолноеИмяФайла, Адрес));
	
	НачатьПолучениеФайлов(Новый ОписаниеОповещения("ОткрытьФайлЗавершение", ЭтотОбъект), МассивПолучаемыхФайлов,, Ложь);
	
КонецПроцедуры // КаталогДокументовЗавершение

&НаКлиенте
Процедура ОткрытьФайлЗавершение(ПолученныеФайлы, ДополнительныеПараметры) Экспорт 
	
	Если ПолученныеФайлы = Неопределено
		И Не (ТипЗнч(ПолученныеФайлы) = Тип("Массив")
			И ПолученныеФайлы.Количество()) Тогда
		Возврат;
	КонецЕсли;
	
	НачатьЗапускПриложения(Новый ОписаниеОповещения("НачатьЗапускПриложенияЗавершение", ЭтотОбъект), ПолученныеФайлы[0].Имя);
	
КонецПроцедуры // ОткрытьФайлЗавершение

&НаКлиенте
Процедура НачатьЗапускПриложенияЗавершение(КодВозврата, ДополнительныеПараметры) Экспорт 
	
	// Заглушка
	
КонецПроцедуры // НачатьЗапускПриложенияЗавершение

&НаСервереБезКонтекста
Процедура ПолучитьДанныеФайлаНаСервереБезКонтекста(Адрес, ИмяФайла)  
	
	СтруктураФайла = Константы.ДанныеФайла.Получить().Получить();
	
	ИмяФайла = СтруктураФайла.ИмяФайла;
	
	ПоместитьВоВременноеХранилище(СтруктураФайла.ДанныеФайла, Адрес);
	
КонецПроцедуры // ПолучитьДанныеФайлаНаСервереБезКонтекста

#КонецОбласти

Удаление файла

#Область Удаление_файла

&НаКлиенте
Процедура УдалитьФайл(Команда)
	
	Если ПроверитьНаличиеФайлаВКонстантеНаСервереБезКонтекста() Тогда
		
		ПоказатьВопрос(Новый ОписаниеОповещения("УдалитьФайлЗавершение", ЭтотОбъект),
							"Данные файла будут безвозвратно удалены.
							|Продолжить?", РежимДиалогаВопрос.ДаНет, 30, КодВозвратаДиалога.Да,, КодВозвратаДиалога.Нет);
		
	Иначе
		
		СообщениеПользователю = Новый СообщениеПользователю;
		СообщениеПользователю.Текст = "Файл не был загружен в константу.";
		СообщениеПользователю.Сообщить();
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура УдалитьФайлЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт 
	
	Если Не РезультатВопроса = КодВозвратаДиалога.Да Тогда
		Возврат;
	КонецЕсли;
	
	УдалитьФайлНаСервереБезКонтекста();
	
КонецПроцедуры // УдалитьФайлЗавершение

&НаСервереБезКонтекста
Процедура УдалитьФайлНаСервереБезКонтекста()  
	
	Константы.ДанныеФайла.Установить(Неопределено);
	
КонецПроцедуры // УдалитьФайлНаСервереБезКонтекста

#КонецОбласти

Служебная процедура (в которой выполняется проверка наличия данных константы) 

// Служебная процедура для проверки наличия загруженного файла
&НаСервереБезКонтекста
Функция   ПроверитьНаличиеФайлаВКонстантеНаСервереБезКонтекста()  
	
	ДанныеФайла = Константы.ДанныеФайла.Получить();
	
	Возврат Не ДанныеФайла.Получить() = Неопределено;
	
КонецФункции // ПроверитьНаличиеФайлаВКонстантеНаСервереБезКонтекста

P.S.: публикацию //infostart.ru/public/396459/ видел. В ней немного другой подход к реализации подобной задачи.

 

теги: НачатьПомещениеФайла, НачатьПолучениеФайлов, ОписаниеПереданногоФайла

НачатьПомещениеФайла НачатьПолучениеФайлов

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    3625    dsdred    48    

66

Как готовить и есть массивы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    5043    YA_418728146    25    

62

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6173    dsdred    36    

110

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    18204    SeiOkami    46    

116

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    11779    human_new    27    

72

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8564    YA_418728146    6    

139

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6204    sebekerga    54    

93

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    15540    SeiOkami    31    

103
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Metabos 29 22.01.16 14:54 Сейчас в теме
Очень полезная обработка. Возьму себе.
2. premierex 204 23.01.16 12:35 Сейчас в теме
(0) А релиз платформы 8.3 не указан. Или он не важен?
3. dj_serega 390 23.01.16 17:49 Сейчас в теме
(2) premier, Если верить http://v8.1c.ru/o7/201301nm/ то "анти-модальность" появилась начиная с версии 8.3.3.641.
По асинхронности использовался метод "НачатьПолучениеКаталогаДокументов". Эти методы появились в 8.3.6.1760.

Реализация была на 8.3.7. (точную версию попозже напишу в публикации).
И наверно сделаю еще вариант без асинхронного метода.
4. dj_serega 390 25.01.16 09:54 Сейчас в теме
(2) premier, Подкорректировал публикацию. Доработал процедуру "ОткрытьФайл".

&НаКлиенте
Процедура ОткрытьФайл(Команда)
    
    Если ПроверитьНаличиеФайлаВКонстантеНаСервереБезКонтекста() Тогда
        
        // Начиная с версии 8.3.6.1760 (отказ от асинхронных методов)
        НачатьПолучениеКаталогаДокументов(Новый ОписаниеОповещения("КаталогДокументовЗавершение", ЭтотОбъект));
        // До 8.3.6.1760
        //КаталогДокументов = КаталогДокументов();
        //КаталогДокументовЗавершение(КаталогДокументов, "");
        
    Иначе
        
        СообщениеПользователю = Новый СообщениеПользователю;
        СообщениеПользователю.Текст = "Файл не был загружен в константу.";
        СообщениеПользователю.Сообщить();
        
    КонецЕсли;
    
КонецПроцедуры
Показать
5. caponid 25.01.16 11:19 Сейчас в теме
И что будет с константой когда много пользователей будут сохранять/получать разные файлы?
6. dj_serega 390 25.01.16 11:23 Сейчас в теме
(5) caponid, Так я для примера ж сделал :) В реальной жизни у меня в справочник пишется.
Главное же понять механизм а реализация для каждого своя :)
7. caponid 25.01.16 12:34 Сейчас в теме
Так для примера это и есть плохо)) Пример не должен содержать потенциальных ошибок - либо обговаривать что эту часть реализации надо для себя разрабатывать самому, потому что пример в многопользовательском режиме может выдать плавающую ошибку (по получению некорректных данных).
8. dj_serega 390 25.01.16 12:37 Сейчас в теме
(7) caponid, Спасибо. Я понял. Что бы понятней было придется конфу приложить?
9. caponid 25.01.16 12:47 Сейчас в теме
(8) конфигурация это лишнее), просто в тексте статьи указать опасность использования константы ;-)
dj_serega; +1 Ответить
10. lx@ 06.02.16 07:45 Сейчас в теме
Не понял зачем нужна НачатьПолучениеКаталогаДокументов(), КаталогДокументов - это же не модальная функция?
11. dj_serega 390 06.02.16 22:44 Сейчас в теме
(10) lx@, Источник
Реализована поддержка асинхронной работы с криптографией, внешними компонентами и расширенной работы с файлами в веб-клиенте, обеспечивающая возможность работы с веб-браузером Google Chrome.
Необходимо помнить, что поддержку синхронных вызовов в веб-браузере Google Chrome планируется прекратить 1 апреля 2015 года. При этом синхронные методы во встроенном языке также перестанут работать, несмотря на то, что сама платформа поддерживает эти вызовы.


Почему переписал? Потому что оно ругалось на платформе разработки. Проверки всегда стоят: ТонкийКлиент, ВебКлиент, ТолстыйКлиентУправляемоеПриложение, Сервер. Вообщем все галочки.
12. forestrg 24.11.16 09:45 Сейчас в теме
а как &НаСервереБезКонтекста обратится к реквизиту справочника? или реквизиту ТЧ.
PS Я начинающий и прошу сильно не пинать
13. forestrg 24.11.16 16:34 Сейчас в теме
в частности как изменить этот кусок
 СтруктураФайла = Константы.ДанныеФайла.Получить().Получить();
14. Xershi 1473 09.06.19 18:31 Сейчас в теме
Наконец написал свою публикацию с блекджеком и ш...... Работа с файлами (обычная и управляемая форма) все структурировано и не нужно гадать, что автор имел в виду!
15. ATA 2 11.04.23 15:57 Сейчас в теме
Очень помог автор... Спасибо!
SAnatoliy; +1 Ответить
Оставьте свое сообщение