Снегопат
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 можно штатно выгрузить конфу в файлы, обработать тексты модулей и загрузить обратно.

  • ИМХО В пустой модуль сабжевый обработчик не нужно вставлять :) этот модуль и так ничего не делает!
  • По выгрузке в 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/