Skip to content

Instantly share code, notes, and snippets.

@khorevaa
Last active January 17, 2017 14:58
Show Gist options
  • Save khorevaa/63ee23661878a7c03a115ce1f4a5545d to your computer and use it in GitHub Desktop.
Save khorevaa/63ee23661878a7c03a115ce1f4a5545d to your computer and use it in GitHub Desktop.
// Процедура устанавливает новые параметры в исходники конфигурации
Процедура ЗаписатьПараметрыКонфигурации(Знач КаталогИсходныхФайлов,
Знач ПараметрыКонфигурации,
ПринудительноПерезаписать = Ложь) Экспорт
ФайлКонфигурации = Новый Файл(ОбъединитьПути(КаталогИсходныхФайлов, "Configuration.xml"));
Если Не ФайлКонфигурации.Существует() Тогда
ВызватьИсключение СтрШаблон("");
КонецЕсли;
// Чтение текщего файла Configuration.xml
ЧтениеXMLТекущейКофигурации = Новый ЧтениеXML;
ЧтениеXMLТекущейКофигурации.ОткрытьФайл(ФайлКонфигурации.ПолноеИмя);
ИмяФайлаРезультатаXML = ПолучитьИмяВременногоФайла(".xml");
// Новый файл Configuration.xml
ЗаписьXMLНовойКонфигурации = Новый ЗаписьXML;
ЗаписьXMLНовойКонфигурации.ОткрытьФайл(ИмяФайлаРезультатаXML);
ЗаписьXMLНовойКонфигурации.ЗаписатьОбъявлениеXML();
// Обработка не принудительной записи
Если НЕ ПринудительноПерезаписать Тогда
ПараметрыНаУстановку = Новый Структура;
Для Каждого КлючЗначение Из ПараметрыКонфигурации Цикл
Если ЗначениеЗаполнено(СокрЛП(КлючЗначение.Значение)) Тогда
ПараметрыНаУстановку.Вставить(КлючЗначение.ключ, КлючЗначение.Значение);
КонецЕсли;
КонецЦикла;
ПараметрыКонфигурации = ПараметрыНаУстановку;
КонецЕслИ;
// Чтение в цикла изначальной конфигурации
Пока ЧтениеXMLТекущейКофигурации.Прочитать() Цикл
ТипУзла = ЧтениеXMLТекущейКофигурации.ТипУзла;
Лог.Отладка(СтрШаблон("Начало чтение узла: %1",ЧтениеXMLТекущейКофигурации.Имя));
Лог.Отладка(СтрШаблон(" тип узла: %1",ЧтениеXMLТекущейКофигурации.ТипУзла));
// Раздел объявления xml пропускаем
Если ЧтениеXMLТекущейКофигурации.Имя = "xml" Тогда
Продолжить;
КонецЕслИ;
// Корневые узлы формируем заново
Если ЧтениеXMLТекущейКофигурации.ТипУзла = ТипУзлаXML.НачалоЭлемента
И (ЧтениеXMLТекущейКофигурации.Имя = "Configuration" ИЛИ ЧтениеXMLТекущейКофигурации.Имя = "MetaDataObject") Тогда
Лог.Отладка(СтрШаблон("Записываю Начало элемента: %1",ЧтениеXMLТекущейКофигурации.Имя));
// Формирование разделов в ручную
ЗаписьXMLНовойКонфигурации.ЗаписатьНачалоЭлемента(ЧтениеXMLТекущейКофигурации.Имя);
КоличествоАтрибутов = ЧтениеXMLТекущейКофигурации.КоличествоАтрибутов();
Лог.Отладка(СтрШаблон("Количетво атрибутов: %1",КоличествоАтрибутов));
// Копирование атрибутов узла
Пока ЧтениеXMLТекущейКофигурации.СледующийАтрибут() Цикл
ЗаписьXMLНовойКонфигурации.ЗаписатьАтрибут(ЧтениеXMLТекущейКофигурации.ЛокальноеИмя,
ЧтениеXMLТекущейКофигурации.URIПространстваИмен,
ЧтениеXMLТекущейКофигурации.Значение);
КонецЦикла;
// Дальше обработки нет пошли на новый цикл
Продолжить;
КонецЕсли;
// Все остальные разбелы нас не интересуют.
// Записывем как есть
Если НЕ (ЧтениеXMLТекущейКофигурации.ТипУзла = ТипУзлаXML.НачалоЭлемента
И ЧтениеXMLТекущейКофигурации.Имя = "Properties") Тогда
ЗаписьXMLНовойКонфигурации.ЗаписатьТекущий(ЧтениеXMLТекущейКофигурации);
КонецЕсли;
// Обход всех элементов в искомом разделе Properties
Если ЧтениеXMLТекущейКофигурации.ТипУзла = ТипУзлаXML.НачалоЭлемента
И ЧтениеXMLТекущейКофигурации.Имя = "Properties" Тогда
Лог.Отладка(СтрШаблон("Записываю Начало элемента: %1",ЧтениеXMLТекущейКофигурации.Имя));
// Формируем новый раздел Properties
ЗаписьXMLНовойКонфигурации.ЗаписатьНачалоЭлемента(ЧтениеXMLТекущейКофигурации.Имя);
НеНадоЧитать = Ложь;
// Чтение до конца свойств конфигурации
Пока Не (ЧтениеXMLТекущейКофигурации.ТипУзла = ТипУзлаXML.КонецЭлемента
и ЧтениеXMLТекущейКофигурации.Имя = "Properties") Цикл
// После записи ЗаписатьТекущий уже выполнено чтение XML далее
Если Не НеНадоЧитать Тогда
ЧтениеXMLТекущейКофигурации.Прочитать();
КонецЕсли;
Ключ = ЧтениеXMLТекущейКофигурации.ЛокальноеИмя;
ТипУзла = ЧтениеXMLТекущейКофигурации.ТипУзла;
Если ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Лог.Отладка(СтрШаблон("Ищю ключ: %1",Ключ));
// Продолжаем если нашего свойства нет
Если НЕ ПараметрыКонфигурации.Свойство(Ключ) Тогда
Сообщить(СтрШаблон("Ключ: %1 не найден",Ключ));
ЗаписьXMLНовойКонфигурации.ЗаписатьТекущий(ЧтениеXMLТекущейКофигурации);
НеНадоЧитать = Истина;
Иначе
// Запишем новые значения для свойств
НовоеЗначение = ПараметрыКонфигурации[Ключ];
Лог.Отладка(СтрШаблон("Записываю значение: %1 для свойства %2",НовоеЗначение,Ключ));
ЗаписьXMLНовойКонфигурации.ЗаписатьНачалоЭлемента(Ключ);
ЗаписьXMLНовойКонфигурации.ЗаписатьТекст(НовоеЗначение);
ЗаписьXMLНовойКонфигурации.ЗаписатьКонецЭлемента();
ЧтениеXMLТекущейКофигурации.Пропустить();
НеНадоЧитать = Ложь;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если ЧтениеXMLТекущейКофигурации.ТипУзла = ТипУзлаXML.КонецЭлемента
И ЧтениеXMLТекущейКофигурации.Имя = "Properties" Тогда
Лог.Отладка(СтрШаблон("Записываю окончание элемента: %1",ЧтениеXMLТекущейКофигурации.Имя));
ЗаписьXMLНовойКонфигурации.ЗаписатьКонецЭлемента();
КонецЕслИ;
//ЧтениеXMLТекущейКофигурации.Прочитать();
КонецЕсли;
Если ЧтениеXMLТекущейКофигурации.ТипУзла = ТипУзлаXML.КонецЭлемента
И (ЧтениеXMLТекущейКофигурации.Имя = "Configuration" ИЛИ ЧтениеXMLТекущейКофигурации.Имя = "MetaDataObject") Тогда
ЗаписьXMLНовойКонфигурации.ЗаписатьКонецЭлемента();
КонецЕсли;
КонецЦикла;
ЗаписьXMLНовойКонфигурации.Закрыть();
ЧтениеXMLТекущейКофигурации.Закрыть();
// подменяем файл
КопироватьФайл(ИмяФайлаРезультатаXML,ФайлКонфигурации.ПолноеИмя);
КонецПроцедуры
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment