Снегопат https://snegopat.ru/forum/ |
|
Как обойти все метаданные и получить модули объектов ? https://snegopat.ru/forum/viewtopic.php?f=3&t=605 |
Страница 1 из 3 |
Автор: | artbear [ 23 апр 2014, 10:01 ] |
Заголовок сообщения: | Как обойти все метаданные и получить модули объектов ? |
Народ, как в скрипте обойти все метаданные и получить модули объектов + модули форм и другие модули для возможности изменения ? Вроде где-то видел пример. Хочу сделать массовую вставку кода. Есть старые легасу-конфигурации, в которых, например, в ПередЗаписью и в ПриЗаписи не учитывается ОбменДанными.Загрузка. Нужно это исправить. Поможете? |
Автор: | orefkov [ 23 апр 2014, 10:14 ] |
Заголовок сообщения: | Re: Как обойти все метаданные и получить модули объектов ? |
Смотри в stdlib forAllMdObjects, там и пример есть с модулями менеджера. |
Автор: | sosnae [ 23 апр 2014, 10:17 ] |
Заголовок сообщения: | Re: Как обойти все метаданные и получить модули объектов ? |
Накидал за пару минут, не проверял. Код: stdlib.forAllMdObjects(metadata.current.rootObject, function(mdObj){
try{ sourceText = mdObj.getModuleText("МодульОбъекта"); if(sourceText.length){ //Анализируем текст, находим необходимый модуль. context = SyntaxAnalysis.AnalyseModule(sourceText, true); var method = context.getMethodByName("ПередЗаписью"); if (!method){ newText = sourceText + "\nПроцедура ПередЗаписью(Отказ)\n Если ОбменДанными.Загрузка Тогда \n Возврат;\n КонецЕсли; \nКонецПроцедуры" } else { Lines = sourceText.split("\n"); beforeLines = Lines.slice(0, method.StartLine+1); afterLines = Lines.slice( method.StartLine+2); newLines = "\n Если ОбменДанными.Загрузка Тогда \n Возврат;\n КонецЕсли;"; newText = beforeLines.join("\n")+"\n" + mdObj.newText+"\n"+ afterLines.join("\n"); } mdObj.setModuleText("МодульОбъекта", newText); Message(mdObj.mdclass.name(1) + "." + mdObj.name) }catch(e){} }) |
Автор: | artbear [ 23 апр 2014, 11:16 ] |
Заголовок сообщения: | Re: Как обойти все метаданные и получить модули объектов ? |
Спасибо. Начал смотреть. А как добраться до модулей форм? |
Автор: | orefkov [ 23 апр 2014, 11:21 ] |
Заголовок сообщения: | Re: Как обойти все метаданные и получить модули объектов ? |
Жень, Код: if(sourceText.length){ надо убирать - модуль может быть пустой, а обработчик надо вставить. Справедливости ради, на 8.3 можно штатно выгрузить конфу в файлы, обработать тексты модулей и загрузить обратно. |
Автор: | orefkov [ 23 апр 2014, 11:24 ] |
Заголовок сообщения: | Re: Как обойти все метаданные и получить модули объектов ? |
artbear писал(а): А как добраться до модулей форм? У объекта метаданных "Форма" есть свойство - "Форма", вот getModuleText("Форма") и даст модуль. |
Автор: | artbear [ 23 апр 2014, 11:32 ] |
Заголовок сообщения: | Re: Как обойти все метаданные и получить модули объектов ? |
orefkov писал(а): artbear писал(а): А как добраться до модулей форм? У объекта метаданных "Форма" есть свойство - "Форма", вот getModuleText("Форма") и даст модуль. Не понял. У метаданного несколько форм. Как перебрать модуль каждой из них? |
Автор: | orefkov [ 23 апр 2014, 11:36 ] |
Заголовок сообщения: | Re: Как обойти все метаданные и получить модули объектов ? |
artbear писал(а): Не понял. У метаданного несколько форм. Как перебрать модуль каждой из них? forAllMdObjects в процессе обхода как-раз все формы и обойдет. Ведь каждая форма - это такой-же объект метаданных, подчиненный основному объекту. |
Автор: | artbear [ 23 апр 2014, 11:36 ] |
Заголовок сообщения: | Re: Как обойти все метаданные и получить модули объектов ? |
orefkov писал(а): Жень, Код: if(sourceText.length){ надо убирать - модуль может быть пустой, а обработчик надо вставить. Справедливости ради, на 8.3 можно штатно выгрузить конфу в файлы, обработать тексты модулей и загрузить обратно.
|
Автор: | artbear [ 23 апр 2014, 12:02 ] |
Заголовок сообщения: | Re: Как обойти все метаданные и получить модули объектов ? |
Выполняю код (на скобки не обращайте внимание) Код: stdlib.forAllMdObjects(metadata.current.rootObject, function(mdObj){ try{ var mdc = mdObj.mdclass; for(var i = 0, c = mdc.propertiesCount; i < c; i++) { var mdProp = mdc.propertyAt(i) var mdPropName = mdProp.name(1); if(mdObj.isPropModule(mdPropName)) { Message(mdObj.mdclass.name(1) + "." + mdObj.name + "." + mdPropName) Почему-то возвращается следующий текст РегистрСведений.СтоимостьДиагностики.МодульНабораЗаписей РегистрСведений.СтоимостьДиагностики.МодульМенеджера Форма.ФормаСписка.Форма Форма.ФормаЗаписи.Форма т.е. для последних 2 записей не видно реального метаданного для форм (т.е. РегистрСведений.СтоимостьДиагностики) Как получить реальное имя метаданного для формы? |
Страница 1 из 3 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |