Снегопат

Обсуждение Снегопата
Текущее время: 28 апр 2024, 22:21

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 24 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
СообщениеДобавлено: 23 апр 2014, 12:48 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 24 авг 2011, 15:04
Сообщения: 2052
Перебирать parent.
Сам объект "Форма", или реквизит, или табличная часть - это точно такие же объекты метаданных, как и какойнить регистр или документ.
Просто они - дочерние объекты по отношению к вышестоящему. Там иерархия объектов в виде дерева.
forAllMdObjects просто обходит каждый узел дерева метаданных.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 23 апр 2014, 12:56 
Не в сети
Аватара пользователя

Зарегистрирован: 24 авг 2011, 15:36
Сообщения: 1085
Да, перебор получился.
Вот код перебора и анализа ПередЗаписью и ПриЗаписи (вставки кода пока нет):
Код:
$engine JScript
$uname ПереборМодулей
$dname Перебор модулей 1С из конфигурации
$addin global
$addin stdlib
$addin stdcommands

//stdlib.require('TextWindow.js', SelfScript);
stdlib.require('SyntaxAnalysis.js', SelfScript);
global.connectGlobals(SelfScript);

SelfScript.self['macrosПеребрать все модули 1С из конфигурации'] = function() {

   var index =0;
   stdlib.forAllMdObjects(metadata.current.rootObject,
      function(mdObj){
         try{
            var mdObj_name = mdObj.name;
               
            var mdc = mdObj.mdclass;
            var mdc_name = mdc.name(1)
            var formName = ""
            // для объектов форм по умолчанию не показываются полные имена метаданных, приходится специально вычислять метаданное
            if (mdc_name == "Форма") {
               formName = "."+mdObj_name
               mdObj_name = mdObj.parent.name;
               mdc_name = mdObj.parent.mdclass.name(1);
               //Message("      " + mdObj.parent.name + " - " +mdc_name + "." + mdObj_name)
            }
             for(var i = 0, c = mdc.propertiesCount; i < c; i++)
             {
                 var mdProp = mdc.propertyAt(i)

                 var mdPropName = mdProp.name(1);
                 if(mdObj.isPropModule(mdPropName)) {
                  sourceText = mdObj.getModuleText(mdPropName);
                  if(sourceText.length){
                     //Message("   " + mdObj.parent.name + " - " +mdc.name(1) + formName + "." + mdObj.name + "." + mdPropName)
                     context = SyntaxAnalysis.AnalyseModule(sourceText, true);
                     var method = context.getMethodByName("ПередЗаписью");
                     if (method){
                        Message(""+index+" " + mdc_name + "." + mdObj_name + formName + "." + mdPropName+ " - метод ПередЗаписью ")
                        index++
                     }
                     var method = context.getMethodByName("ПриЗаписи");
                     if (method){
                        Message(""+index+" " + mdc_name + "." + mdObj_name +"." + mdPropName+ " - метод ПриЗаписи ")
                        index++
                     }
                  }
               }
             }
            
         }
         catch(e){}
      })
}


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 23 апр 2014, 14:29 
Не в сети
Аватара пользователя

Зарегистрирован: 24 авг 2011, 15:36
Сообщения: 1085
Следующий вопрос: как определить, что модуль метаданного можно менять (например, что он захвачен в хранилище) ?
для TextWindow есть метод isReadOnly(), а вот для метаданного непонятно, как?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 23 апр 2014, 14:37 
Не в сети

Зарегистрирован: 20 дек 2011, 10:31
Сообщения: 588
Откуда: Украина, Запорожье
Ну я бы проверял возможность для метаданных поместить в хранилище... Может так пройдет.
res = mdObj.activateInTree();
res = stdcommands.CfgStore.CaptureIntoCfgStore.getState().enabled;


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 23 апр 2014, 15:58 
Не в сети
Аватара пользователя

Зарегистрирован: 24 авг 2011, 15:36
Сообщения: 1085
sosnae писал(а):
Ну я бы проверял возможность для метаданных поместить в хранилище... Может так пройдет.
res = mdObj.activateInTree();
res = stdcommands.CfgStore.CaptureIntoCfgStore.getState().enabled;

ИМХО переход в дерево метаданных слишком будет на глаза действовать :)
Я пока сделал через try - попытка замены текста - если исключение, значит, текст залочен
Код:
   try{
      mdObj.setModuleText(mdPropName, newText);
      Message(""+index+" " + mdc_name + "." + mdObj_name + formName + "." + mdPropName+ " - поменял метод "+methodName+" - добавил проверку на ОбменДанными.Загрузка")
   }catch(e) {
      Message("Ошибка изменения текста: " + mdc_name + "." + mdObj_name + formName + "." + mdPropName+ " - метод "+methodName+"")
   }


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 23 апр 2014, 17:07 
Не в сети

Зарегистрирован: 04 июн 2012, 09:28
Сообщения: 343
Проверка не хранилище - не совсем корректная. Текст может быть запрещен к редактированию в случае если он стоит на поддержке без возможности изменений.

_________________
В реальності все не так, як насправді


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 23 апр 2014, 18:46 
Не в сети
Аватара пользователя

Зарегистрирован: 24 авг 2011, 15:36
Сообщения: 1085
Выложил готовый скрипт для решения сабжевой задачи
viewtopic.php?f=3&t=606


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 24 апр 2014, 15:03 
Не в сети
Аватара пользователя

Зарегистрирован: 24 авг 2011, 15:36
Сообщения: 1085
Продолжаем разговор :)

Как получить данные подписки на событие - например, имя события + имя обработчика ?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 24 апр 2014, 15:11 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 24 авг 2011, 15:04
Сообщения: 2052
artbear писал(а):
Продолжаем разговор :)
Как получить данные подписки на событие - например, имя события + имя обработчика ?

Может AnalizeEventSubscript.js поможет?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 24 апр 2014, 15:23 
Не в сети
Аватара пользователя

Зарегистрирован: 24 авг 2011, 15:36
Сообщения: 1085
orefkov писал(а):
artbear писал(а):
Продолжаем разговор :)
Как получить данные подписки на событие - например, имя события + имя обработчика ?

Может AnalizeEventSubscript.js поможет?

Отличное предложение.
Совсем забыл про этот скрипт.
Насколько вижу по коду, вся нужная инфа там добывается.

Саша, спасибо!


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 24 ]  На страницу Пред.  1, 2, 3  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 21


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB