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

20.05.14

Разработка - Универсальные функции

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

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

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


Вступайте в нашу телеграмм-группу Инфостарт

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    4082    Abysswalker    10    

46

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

14.05.2025    7638    DeerCven    15    

61

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

21.05.2024    52569    dimanich70    84    

174

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    7658    7    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    67051    atdonya    31    

72

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

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

30.11.2023    9574    ke.92@mail.ru    17    

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

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

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