1С. Сохранение файла в web-клиенте

Задача

Необходимо организовать сохранение файлов web-клиенте(браузере) и тонком клиенте через web. Для наглядности будем решать более узкую задачу, будем организовывать сохранение табличного документа в MS Excel.

Решение

Для наглядности будем решать более узкую задачу, будем организовывать сохранение табличного документа в MS Excel.

  1. Создадим табличный документ с произвольным текстом;
  2. Если работа производится на web-клиенте, то попытаемся подключить расширение работы с файлами;
  3. Поместим табличный документ во временной хранилище как файл MS Excel;
  4. Для сохранение файла воспользуемся функцией ПолучитьФайл(), который получает файл и сохраняет его в локальную файловую систему.

В итоге имеем следующий код:

&НаСервере
Функция ПоместитьТабличныйДокументВоВременноеХранилищеНаСервере(ТабличныйДокумент, Расширение, ТипФайла)
	
	АдресХранилища	= Неопределено;
	ИмяФайла		= ПолучитьИмяВременногоФайла(Расширение);
	
	Попытка
		ТабличныйДокумент.Записать(ИмяФайла, ТипФайла);
		АдресХранилища = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайла));
	Исключение
		ВызватьИсключение;
	КонецПопытки;
	
	Возврат АдресХранилища;
	
КонецФункции

&НаКлиенте
Процедура СохранитьФайл(Команда)
	
	// Для примера создадим пустой табличный документ
	ТабличныйДокумент = Новый ТабличныйДокумент;
	
	ТабличныйДокумент.Область("R1C1").Текст = "Файл сохраненный обработкой ""Пример работы сохранения фалов""";
	
	#Если ВебКлиент Тогда
		
		// Попробуем подключить расширение работы с файлами
		РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами();
		Если НЕ РасширениеПодключено Тогда
			// Расширение не установлено, пробуем установить
			УстановитьРасширениеРаботыСФайлами();
		КонецЕсли;
		
		РасширениеПодключено =  ПодключитьРасширениеРаботыСФайлами();
		Если Не РасширениеПодключено Тогда
			// Расширение не удалось установить, сообщаем об этом пользователю
			ПоказатьПредупреждение( , НСтр("ru = 'Для выполнения данной операции вам нужно установить расширение работы с файлами.'"));
			Возврат;
		КонецЕсли;
		
	#КонецЕсли	
	
	// Поместим табличный документ во временной хранилище как файл MS Excel
	АдресХранилища = ПоместитьТабличныйДокументВоВременноеХранилищеНаСервере(ТабличныйДокумент, "xlsx", ТипФайлаТабличногоДокумента.XLSX);
	
	Если АдресХранилища = Неопределено Тогда
		ПоказатьПредупреждение( , НСтр("ru = 'Что-то пошло не так :('"));
		Возврат;
	КонецЕсли;
	
	ИмяФайла = "Сохраняемый файл.xlsx";
	
	Попытка
		// Сам момент сохранения
		ПолучитьФайл(АдресХранилища, ИмяФайла, Истина);
	Исключение				
		Сообщение = Новый СообщениеПользователю;
		Сообщение.Текст = "ru='Не удалось записать файл. Возможно, недостаточно места на диске, диск защищен от записи или не подключено расширение для работы с файлами.'";
		Сообщение.Сообщить();
	КонецПопытки;
	
КонецПроцедуры

При выполнении команды СохранитьФайл() получим диалог с вариантами сохранить или открыть получаемый файл

Сохранение файла в web-клиенте

При выборе варианта «Открыть»

Сохранение файла в web-клиенте

При выборе  варианта «Сохранить»

Сохранение файла в web-клиенте

Комментарии 3

  • Алексей 21.11.2017 в 22:28 Cсылка

    Спасибо за статью! Пригодилось.

    • Guesto 21.11.2017 в 22:41 Cсылка

      Алексей, рад что пригодилось!
      Обратите внимание, что в статье используются методы УстановитьРасширениеРаботыСФайлами() и ПодключитьРасширениеРаботыСФайлами(), в настоящее время правильнее использовать НачатьУстановкуРасширенияРаботыСФайлами() и НачатьПодключениеРасширенияРаботыСФайлами().
      По возможности поправлю статью)

  • Олег 09.06.2018 в 17:40 Cсылка

    Спасибо огромное!
    Небольшое замечание:

    Попытка
    ТабличныйДокумент.Записать(ИмяФайла, ТипФайла);
    АдресХранилища = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайла));
    Подправленная строка
    АдресХранилища = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайла), УникальныйИдентификатор);
    Подправленная строка

    Без этого исправления вылетала ошибка 400

    Исключение
    ВызватьИсключение;
    КонецПопытки;

  • Добавить комментарий

    Ваш e-mail не будет опубликован. Обязательные поля помечены *