Mail: info@it-titan.ru

Алексеенко Павел

Сохранение настроек обработки/отчета во внешний файл (клиент-сервер, веб клиент)

Бывают случаи, когда требуется сохранять значение реквизитов формы во внешнии файлы. Вот один из вариантов решения данной задачи. 

Обращение к процедурам происходит вот таким образом:

&НаКлиенте
Процедура Сохранить(Команда)
	
	Таблицы = Новый СписокЗначений;
	Таблицы.Добавить("ТаблицаЗначений");
	Таблицы.Добавить("Дерево");
	Таблицы.Добавить("Реквизит");
	
	СохранитьТаблицуВФайл(Таблицы);
	
КонецПроцедуры

&НаКлиенте
Процедура Восстановить(Команда)

	Таблицы = Новый СписокЗначений;
	Таблицы.Добавить("ТаблицаЗначений");
	Таблицы.Добавить("Дерево");
	Таблицы.Добавить("Реквизит");

	ОткрытьТаблицуИзФайла(Таблицы);
	
КонецПроцедуры

Где "ТаблицаЗначений" и "Реквизит" имена реквизитов формы. Можно  так же обращаться и по принципу:

 &НаКлиенте
Процедура СохранитьРеквизит(Команда)
	
	СохранитьТаблицуВФайл("Реквизит");
	
КонецПроцедуры

&НаКлиенте
Процедура ВосстановитьРеквизит(Команда)

	ОткрытьТаблицуИзФайла("Реквизит");
	
КонецПроцедуры

То есть, по названию реквизита, без создания списка значений.
А вот непосредственно процедуры сохранения:
////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ СОХРАНЕНИЯ ТАБЛИЦ

&НаКлиенте
Процедура СохранитьТаблицуВФайл(Таблица)
	
	Режим = РежимДиалогаВыбораФайла.Сохранение;
	ЗаголовокДиалога = "Сохранить статус выполнения в файл";
	
	ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
	Фильтр = "Текст (*.txt)|*.txt";
	ДиалогОткрытияФайла.Заголовок = ЗаголовокДиалога;
	ДиалогОткрытияФайла.Фильтр = Фильтр;	
	Если ДиалогОткрытияФайла.Выбрать() Тогда
		Файл = ДиалогОткрытияФайла.ПолноеИмяФайла;
		
		АдресХранилища = СохранитьТаблицу(Таблица);
		
		ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилища);
		ДвоичныеДанные.Записать(Файл);
	КонецЕсли;
	
КонецПроцедуры

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

&НаСервере
Функция СохранитьТаблицу(Таблица)
	
	СостояниеВыполнения = Новый Структура;
	
	Если ТипЗнч(Таблица) = Тип("СписокЗначений") Тогда
		Для каждого Стр Из Таблица Цикл
			СостояниеВыполнения = ВыгрузитьТаблицыВСтруктуру(Стр.Значение, СостояниеВыполнения);	
		КонецЦикла;	
	Иначе
		СостояниеВыполнения = ВыгрузитьТаблицыВСтруктуру(Таблица, СостояниеВыполнения);
	КонецЕсли;
	
	временныйФайл = КаталогВременныхФайлов() + "\temp.txt";
    
	Если ЗначениеЗаполнено(временныйФайл) Тогда
		ЗначениеВФайл(временныйФайл, СостояниеВыполнения);
	КонецЕсли;
	
	СостояниеВыполнения.Очистить();
	
	файлТекстовый = Новый ДвоичныеДанные(временныйФайл);	
	АдресХранилища = ПоместитьВоВременноеХранилище(файлТекстовый, Новый УникальныйИдентификатор);
	
	Возврат(АдресХранилища);
	
КонецФункции

&НаСервере
Функция ВыгрузитьТаблицыВСтруктуру(Таблица, СостояниеВыполнения)
	
	Если (ТипЗнч(ЭтаФорма[Таблица]) = Тип("ДанныеФормыКоллекция"))
		ИЛИ (ТипЗнч(ЭтаФорма[Таблица]) = Тип("ДанныеФормыДерево")) Тогда
		ТаблицаОб = РеквизитФормыВЗначение(Таблица);
		СостояниеВыполнения.Вставить(Таблица, ТаблицаОб);
	Иначе
		СостояниеВыполнения.Вставить(Таблица, ЭтаФорма[Таблица]);	
	КонецЕсли;
	
	Возврат(СостояниеВыполнения);
	
КонецФункции

&НаСервере
Процедура ВосстановитьТаблицу(Таблица, АдресХранилища)
	
	файл = ПолучитьИзВременногоХранилища(АдресХранилища);
 
    временныйФайл = КаталогВременныхФайлов() + "\" + СтрЗаменить(СокрЛП(АдресХранилища),"/", "-") + ".txt";
    файл.Записать(временныйФайл);
	
	Попытка
		СостояниеВыполнения = ЗначениеИзФайла(временныйФайл);
	Исключение
		Сообщить("Не удалось прочитать файл");	
	КонецПопытки;
	
	Если ТипЗнч(Таблица) = Тип("СписокЗначений") Тогда
		Для каждого Стр Из Таблица Цикл
			ВостановитьТаблицуИзСоответствия(Стр.Значение, СостояниеВыполнения);	
		КонецЦикла;	
	Иначе
		ВостановитьТаблицуИзСоответствия(Таблица, СостояниеВыполнения);
	КонецЕсли;
	
	СостояниеВыполнения.Очистить();
	
КонецПроцедуры

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

КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////


© 2014-2017 Alekseenko Pavel / qwinter - все права защищены

Комментировать