gifts2017

Сохранение настроек обработки/отчета во внешних файлах. Пакетная обработка с разными вариантами настроек.

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

Сохранение настроек обработки/отчета во внешних файлах. Пакетная обработка с разными вариантами настроек.

Столкнулся с необходимостью сохранить настройки внешней обработки. В интеренете, в основном, есть варианты с использованием СохранитьЗначение. Так как мне нужно было в обработке сохранить несколько значений настроек, а потом их в определенной последовательности загрузить и выполнить обработку (пакетное задание), то данный вариант мне не совсем подходил. Сделал следующий вариант:

Процедура ОсновныеДействияФормыСохранитьВФайл(Кнопка)
    ДиалогОткрытияФайла  = Новый ДиалогВыбораФайла (РежимДиалогаВыбораФайла.ВыборКаталога);
    ДиалогОткрытияФайла.ПолноеИмяФайла     = "";
    ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
    ДиалогОткрытияФайла.Заголовок          = "Выберите каталог";
    Если ДиалогОткрытияФайла.Выбрать()Тогда
        Для каждого Реквизит из Метаданные().Реквизиты Цикл
            ЗначениеВФайл(ДиалогОткрытияФайла.Каталог+"\"+Реквизит.Имя+".dat",ЭтотОбъект[Реквизит.Имя]);
        КонецЦикла;
        ТабЗнач=Новый ТаблицаЗначений;
        ТабЧасть=ЭтотОбъект.Родители.Выгрузить();
        ЗначениеВФайл(ДиалогОткрытияФайла.Каталог+"\Родители.dat",ТабЧасть);
        ТабЧасть=ЭтотОбъект.Родители1.Выгрузить();
        ЗначениеВФайл(ДиалогОткрытияФайла.Каталог+"\Родители1.dat",ТабЧасть);
        ТабЧасть=ЭтотОбъект.Товары.Выгрузить();
        ЗначениеВФайл(ДиалогОткрытияФайла.Каталог+"\Товары.dat",ТабЧасть);
    КонецЕсли;    
КонецПроцедуры

Процедура ОсновныеДействияФормыЗагрузитьИзФайла(Кнопка)
    ДиалогОткрытияФайла  = Новый ДиалогВыбораФайла (РежимДиалогаВыбораФайла.ВыборКаталога);
    ДиалогОткрытияФайла.ПолноеИмяФайла     = "";
    ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
    ДиалогОткрытияФайла.Заголовок          = "Выберите каталог";
    Если ДиалогОткрытияФайла.Выбрать()Тогда
        Для каждого Реквизит из Метаданные().Реквизиты Цикл
            ЭтотОбъект[Реквизит.Имя]=ЗначениеИЗФайла(ДиалогОткрытияФайла.Каталог+"\"+Реквизит.Имя+".dat");
        КонецЦикла;
        ТабЗнач=Новый ТаблицаЗначений;
        ТабЧасть=ЗначениеИзФайла(ДиалогОткрытияФайла.Каталог+"\Родители.dat");
        ЭтотОбъект.Родители.Загрузить(ТабЧасть);
        ТабЧасть=ЗначениеИзФайла(ДиалогОткрытияФайла.Каталог+"\Родители1.dat");
        ЭтотОбъект.Родители1.Загрузить(ТабЧасть);
        ТабЧасть=ЗначениеИзФайла(ДиалогОткрытияФайла.Каталог+"\Товары.dat");
        ЭтотОбъект.Товары.Загрузить(ТабЧасть);
    КонецЕсли;    
КонецПроцедуры
 

Родители, Родители1 и Товары это табличные части обработки. Может их тоже можно не отдельно сохранять, а перебором как реквизиты (быстро не нашел как и сделал с именами табличных частей. Уверен, что должен быть вариан с получением списка табличных частей. Если кто знает такой вариант, - напишите в комментариях. Позже тоже хочу поискать, чтобы получить универсальных механизм для сохранения.).

Пользователь у меня сохраняет настройки обработки в определенную папку (C:\set\Х), где Х цифра от 1 до 30. Настройки перебираются последовательно с папки 1 до папки 30, если встречается папка где нет настроек, то обработка останавливается.

Процедура ОсновныеДействияФормыПакетнаяОбрабока(Кнопка)
    Для х=1 По 30 Цикл
        ИмяПапки="C:\set\"+Строка(х)+"\";
        Файл = Новый Файл (ИмяПапки+"Родители.dat");
        Если  Файл.Существует() Тогда
            ЗаполнитьНастройки(ИмяПапки);
            Обработать();
        Иначе
            Прервать;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Процедура ЗаполнитьНастройки(ИмяКаталога)
        Для каждого Реквизит из Метаданные().Реквизиты Цикл
            ЭтотОбъект[Реквизит.Имя]=ЗначениеИЗФайла(ИмяКаталога+Реквизит.Имя+".dat");
        КонецЦикла;
        ТабЗнач=Новый ТаблицаЗначений;
        ТабЧасть=ЗначениеИзФайла(ИмяКаталога+"Родители.dat");
        ЭтотОбъект.Родители.Загрузить(ТабЧасть);
        ТабЧасть=ЗначениеИзФайла(ИмяКаталога+"Родители1.dat");
        ЭтотОбъект.Родители1.Загрузить(ТабЧасть);
        ТабЧасть=ЗначениеИзФайла(ИмяКаталога+"Товары.dat");
        ЭтотОбъект.Товары.Загрузить(ТабЧасть);
КонецПроцедуры


См. также

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

Комментарии

1. Александр (МимохожийОднако) 21.05.14 07:19
Как реализовать по данной схеме при работе пользователя с разными компьютерам в веб-клиенте?
2. Максим Биенко (Bienko) 21.05.14 09:46
Добрый день! По идее сделать можно. Настройки сохранять не на конкретном компьютере, а на сетевом ресурсе (или интернете по фтп). Настройки каждого пользователя сохранять в папку с его именем. Имя пользователя получать из параметров сеанса. В итоге настройки будут получаться на конкретного пользователя по его имени из сетевого ресурса без разницы с какого компьютера он будет работать.
3. Павел Алексеенко (qwinter) 21.05.14 09:57
(2) Bienko, проще прям в папку на сервере, с под папками по именам пользователей 1С.
4. Павел Алексеенко (qwinter) 21.05.14 11:28
По поводу сохранения реквизитов списком. Для комментария объем все таки большой, поэтому выделили в статью: http://infostart.ru/public/281451/
5. Владимир (Tishu) 22.05.14 02:04
Перебор реквизитов и табличных частей объекта:
СтруктураПараметров = Новый Структура;
	Для каждого Реквизит Из ОтчетОбъект.Метаданные().Реквизиты Цикл
		СтруктураПараметров.Вставить(Реквизит.Имя, ОтчетОбъект[Реквизит.Имя])
	КонецЦикла;
	Для каждого Реквизит Из ОтчетОбъект.Метаданные().ТабличныеЧасти Цикл
		СтруктураПараметров.Вставить(Реквизит.Имя, ОтчетОбъект[Реквизит.Имя].Выгрузить());
	КонецЦикла;
...Показать Скрыть
6. Максим Биенко (Bienko) 22.05.14 07:49
7. Алексей Саурин (as7bs) 20.11.15 17:43
Модифицировал представленные в публикации процедуры выгрузки и загрузки настроек, с помощью комментария (5) Tishu, следующим образом (для выгрузки произвольных табличных частей):
//	НАСТРОЙКИ В РАЗНЫХ ФАЙЛАХ В ВЫБРАННОМ КАТАЛОГЕ (каждый реквизит и табличная часть в отдельном файле)
Процедура СохранитьНастройкиВФайл(Кнопка)
	ДиалогОткрытияФайла  = Новый ДиалогВыбораФайла (РежимДиалогаВыбораФайла.ВыборКаталога);
	 ДиалогОткрытияФайла.ПолноеИмяФайла     = "";
	 ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
	 ДиалогОткрытияФайла.Заголовок          = "Выберите каталог";
	 Если ДиалогОткрытияФайла.Выбрать()Тогда
	     Для каждого Реквизит из Метаданные().Реквизиты Цикл
	         ЗначениеВФайл(ДиалогОткрытияФайла.Каталог+"\"+Реквизит.Имя+".dat",ЭтотОбъект[Реквизит.Имя]);
	     КонецЦикла;
	 	Для каждого Реквизит Из Метаданные().ТабличныеЧасти Цикл
	   		ЗначениеВФайл(ДиалогОткрытияФайла.Каталог+"\"+Реквизит.Имя+".dat",ЭтотОбъект[Реквизит.Имя].Выгрузить()); //Реквизит.Имя.Выгрузить()
	 	КонецЦикла;
	 КонецЕсли;    
КонецПроцедуры

Процедура ЗагрузитьНастройкиИзФайла(Кнопка)
	ДиалогОткрытияФайла  = Новый ДиалогВыбораФайла (РежимДиалогаВыбораФайла.ВыборКаталога);
	ДиалогОткрытияФайла.ПолноеИмяФайла     = "";
	ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
	ДиалогОткрытияФайла.Заголовок          = "Выберите каталог";
	Если ДиалогОткрытияФайла.Выбрать()Тогда
	    Для каждого Реквизит из Метаданные().Реквизиты Цикл
	        ЭтотОбъект[Реквизит.Имя]=ЗначениеИЗФайла(ДиалогОткрытияФайла.Каталог+"\"+Реквизит.Имя+".dat");
	    КонецЦикла;
		Для каждого Реквизит Из Метаданные().ТабличныеЧасти Цикл
	        ЭтотОбъект[Реквизит.Имя].Загрузить(ЗначениеИЗФайла(ДиалогОткрытияФайла.Каталог+"\"+Реквизит.Имя+".dat"));
		КонецЦикла;
	КонецЕсли;    
КонецПроцедуры
...Показать Скрыть
8. Алексей Саурин (as7bs) 20.11.15 17:45
Однако показалось неудобно, что каждый реквизит и табличная часть сохраняются в отдельных файлах и переделал следующим образом(тепер все настройки в одном файле):
//	ВСЕ НАСТРОЙКИ В ОДНОМ ФАЙЛЕ
Процедура СохранитьНастройкиВФайл(Кнопка)
	ДиалогОткрытияФайла  = Новый ДиалогВыбораФайла (РежимДиалогаВыбораФайла.Открытие);
	ДиалогОткрытияФайла.ПолноеИмяФайла     = "";
	ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
	ДиалогОткрытияФайла.Заголовок          = "Выберите файл";
	Фильтр = "*.dat|*.dat";
	ДиалогОткрытияФайла.Фильтр = Фильтр;
	Если ДиалогОткрытияФайла.Выбрать()Тогда
		СтруктураПараметров = Новый Структура;
		Для каждого Реквизит Из Метаданные().Реквизиты Цикл
			СтруктураПараметров.Вставить(Реквизит.Имя, ЭтотОбъект[Реквизит.Имя])
		КонецЦикла;
		Для каждого Реквизит Из Метаданные().ТабличныеЧасти Цикл
			СтруктураПараметров.Вставить(Реквизит.Имя, ЭтотОбъект[Реквизит.Имя].Выгрузить());
		КонецЦикла;
		ЗначениеВФайл(ДиалогОткрытияФайла.ПолноеИмяФайла,СтруктураПараметров);
	КонецЕсли;
КонецПроцедуры

Процедура ЗагрузитьНастройкиИзФайла(Кнопка)
	ДиалогОткрытияФайла  = Новый ДиалогВыбораФайла (РежимДиалогаВыбораФайла.Открытие);
	ДиалогОткрытияФайла.ПолноеИмяФайла     = "";
	ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
	ДиалогОткрытияФайла.Заголовок          = "Выберите файл";
	Фильтр = "*.dat|*.dat";
	ДиалогОткрытияФайла.Фильтр = Фильтр;
	Если ДиалогОткрытияФайла.Выбрать()Тогда
		СтруктураПараметров = ЗначениеИЗФайла(ДиалогОткрытияФайла.ПолноеИмяФайла); 
		Для каждого Реквизит из Метаданные().Реквизиты Цикл
		    ЭтотОбъект[Реквизит.Имя]=СтруктураПараметров[Реквизит.Имя];
		КонецЦикла;
		Для каждого Реквизит Из Метаданные().ТабличныеЧасти Цикл
		    ЭтотОбъект[Реквизит.Имя].Загрузить(СтруктураПараметров[Реквизит.Имя]);
		КонецЦикла;
    КонецЕсли;    
КонецПроцедуры
...Показать Скрыть
9. Алексей Саурин (as7bs) 20.11.15 17:48
Остался вопрос: У формы есть есть свойство "Сохраняемые значения", как программно посмотреть его, что-бы используя его определять какие реквизиты сохранять в файл?
10. Алексей Саурин (as7bs) 20.11.15 23:19
(7) as7bs, (8) as7bs, В процедуре СохранитьНастройкиВФайл правильнее будет написать
РежимДиалогаВыбораФайла.Сохранение
вместо
РежимДиалогаВыбораФайла.Открытие
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа