В 1С есть замечательная функция сохранения и загрузки настроек обработки. Настройки эти хранятся во временных файлах (кэше 1С), НО! Что делать когда настройки требуется сохранить во внешний файл и открыть их в другой базе? Под катом код сохранения и загрузки настроек в XML файл и обратно.
Сразу же договоримся, что наша обработка должна уметь хранить не только реквизиты, но и табличные части.
Так выглядит процедура сохранения настроек:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
Процедура СохранитьНастройкиВФайл(Файл, СписокЭлементов) ЗаписьXML = Новый ЗаписьXML; ЗаписьXML.ОткрытьФайл(Файл); ЗаписьXML.ЗаписатьОбъявлениеXML(); ЗаписьXML.ЗаписатьНачалоЭлемента("Настройки"); Для Каждого Стр из СписокЭлементов Цикл Если Метаданные().Реквизиты.Найти(Стр.Значение) <> Неопределено Тогда ЗаписьXML.ЗаписатьНачалоЭлемента(Стр.Значение); ЗаписьXML.ЗаписатьТекст(ЗначениеВСтрокуВнутр(ЭтотОбъект[Стр.Значение])); ЗаписьXML.ЗаписатьКонецЭлемента(); ИначеЕсли Метаданные().ТабличныеЧасти.Найти(Стр.Значение) <> Неопределено Тогда ЗаписьXML.ЗаписатьНачалоЭлемента(Стр.Значение); Для Каждого тчСтр из ЭтотОбъект[Стр.Значение] Цикл ЗаписьXML.ЗаписатьНачалоЭлемента("Строка"); Для Каждого мпСтр из Метаданные().ТабличныеЧасти[Стр.Значение].Реквизиты Цикл ЗаписьXML.ЗаписатьАтрибут(мпСтр.Имя,ЗначениеВСтрокуВнутр(тчСтр[мпСтр.Имя])); КонецЦикла; ЗаписьXML.ЗаписатьКонецЭлемента(); КонецЦикла; ЗаписьXML.ЗаписатьКонецЭлемента(); КонецЕсли; КонецЦикла; ЗаписьXML.ЗаписатьКонецЭлемента(); ЗаписьXML.Закрыть(); КонецПроцедуры |
Наверняка многие заметили, что я использовал функцию «ЗначениеВСтрокуВнутр». Что это означает?
А означает это то, что мы можем хранить не только значения простых типов, но и ссылочных.
Еще стоит обратить внимание на параметр процедуры «СписокЭлементов». Это как бы намекает, что сохранять настройки мы будем выборочно. Пример построения этого списка будет ниже.
Хотя при этом ссылочные типы будут мигрировать только в рамках одной базы, зато простые типы будут свободно ходить как в рамках одной базы, так и между различными.
А вот собственно и процедура загрузки настроек:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
Процедура ЗагрузитьНастройкиИзФайла(Файл) ЧтениеXML = Новый ЧтениеXML; ЧтениеXML.ОткрытьФайл(Файл); ИмяДляЗаписи = ""; ТаблицаДляЗаписи = ""; Пока ЧтениеXML.Прочитать() Цикл Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда Если ЧтениеXML.Имя = "Настройки" Тогда Продолжить; КонецЕсли; Если ИмяДляЗаписи = "" Тогда ИмяДляЗаписи = ЧтениеXML.Имя; ИначеЕсли ЧтениеXML.Имя = "Строка" Тогда Стр = ЭтотОбъект[ИмяДляЗаписи].Добавить(); Пока ЧтениеXML.ПрочитатьАтрибут() Цикл Стр[ЧтениеXML.Имя] = ЗначениеИзСтрокиВнутр(ЧтениеXML.Значение); КонецЦикла; КонецЕсли; КонецЕсли; Если ЧтениеXML.ТипУзла = ТипУзлаXML.Текст Тогда ЭтотОбъект[ИмяДляЗаписи] = ЗначениеИзСтрокиВнутр(ЧтениеXML.Значение); КонецЕсли; Если ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда Если ЧтениеXML.Имя <> "Строка" Тогда ИмяДляЗаписи = ""; ТаблицаДляЗаписи = ""; КонецЕсли; КонецЕсли; КонецЦикла; КонецПроцедуры |
И пример использования этих процедур, а также пример построения нашего списка элементов:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
Процедура ОсновныеДействияФормыСохранить(Кнопка) Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение); Диалог.Фильтр = "*.xml|*.xml"; Если Диалог.Выбрать() Тогда СписокЭлементов = Новый СписокЗначений; СписокЭлементов.Добавить("ТипЧисло"); СписокЭлементов.Добавить("ТипСтрока"); СписокЭлементов.Добавить("ТипДата"); СписокЭлементов.Добавить("ТипДатаВремя"); СписокЭлементов.Добавить("ТипБулево"); СписокЭлементов.Добавить("ТипСсылка"); СписокЭлементов.Добавить("ТабличнаяЧасть1"); СохранитьНастройкиВФайл(Диалог.ПолноеИмяФайла, СписокЭлементов); КонецЕсли; КонецПроцедуры Процедура ОсновныеДействияФормыЗагрузить(Кнопка) Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); Диалог.Фильтр = "*.xml|*.xml"; Если Диалог.Выбрать() Тогда ЗагрузитьНастройкиИзФайла(Диалог.ПолноеИмяФайла); КонецЕсли; КонецПроцедуры |
Как по мне, так получился очень неплохой способ хранения настроек обработки.
Если я заблуждаюсь и есть способы лучше — напишите пож-та о них в комментариях.
2 комментария
добрый день.пришлите пожалуйста пример