Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Заменить текст модуля контекста (число прочтений - 7785 )
kos
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 127
Местоположение: Киев
Зарегистрирован: 03. Марта 2013
Заменить текст модуля контекста
05. Декабря 2014 :: 12:27
Печать  
--------------------
Отвечаю сам себе (в этом же топике):
1) идея решения : http://www.1cpp.ru/forum/YaBB.pl?num=1417782474/14#14
2) пример базыМД: http://www.1cpp.ru/forum/YaBB.pl?num=1417782474/15#15
--------------------

Есть список справочника.
Хочу заменить текст модуля этого справочника на другой.

кнопка в справочнике:
Код
Выбрать все
процедура кнКнопка()
        ОткрытьФорму("Обработка.Обработка1",Контекст)
конецпроцедуры
 



в обработке пишу:
Код
Выбрать все
Процедура ПриОткрытии()
        КонтФормы = Форма.Параметр;
        Информатор	= СоздатьОбъект("Информатор");
        ТекстМодуля	= Информатор.ПолучитьТекстМодуля(КонтФормы);
        ТекстМодуля	= ТекстМодуля + "
        процедура куку()
                предупреждение(1)
        конецпроцедуры
        ";
        Модуль = СоздатьОбъект("ВыполняемыйМодуль");
        Модуль.НазначитьКонтекст(КонтФормы);
        Модуль.УстановитьМодуль(текстМодуля);
        Модуль.КомпилироватьИВыполнитьМодуль();
        глПровека(КонтФормы);
КонецПроцедуры
 



в ГМ:
Код
Выбрать все
процедура глПровека(конт) Экспорт
        //помня про ТурбоМД
        конт.куку() // ожидаю что эта процедура "приклеилась" к контексту....
конецпроцедуры
 



ГМ говорит "нет такой процедуры"

Что я не так делаю или не так понимаю ?
« Последняя редакция: 11. Декабря 2014 :: 17:35 - kos »  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 854
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Заменить текст модуля контекста
Ответ #1 - 05. Декабря 2014 :: 13:45
Печать  
А зачем ТекстМодуля=ТекстМодуля+".... ?

Достаточно просто прописать новую процедуру:

ТекстМодуля=" Процедура куку() ...."

ну и далее компилировать и проверять.
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Заменить текст модуля контекста
Ответ #2 - 05. Декабря 2014 :: 15:44
Печать  
Если всё правильно помню - так никогда  и не работало, будет работать только так:

Код
Выбрать все
Модуль.Куку(); 



Хотя нет, посмотрел у себя в коде, всё работает.
ЗЫ: чорт, не то посмотрел, ладно пока остаюсь на первом мнении.
  
Наверх
 
IP записан
 
kos
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 127
Местоположение: Киев
Зарегистрирован: 03. Марта 2013
Re: Заменить текст модуля контекста
Ответ #3 - 06. Декабря 2014 :: 10:31
Печать  
Eprst писал(а) 05. Декабря 2014 :: 15:44:
Если всё правильно помню - так никогда  и не работало... <skip>


Тогда в чем сокральный смысл такого метода ?
Код
Выбрать все
Модуль.НазначитьКонтекст(КонтФормы);
 


догадываюсь: чтобы экземпляр "Модуль"
(как отдельный кусок памяти, не зависящий от "КонтФормы")
"скопировал" к себе ВСЁ содержимое модуля контекста (переменные, процедуры и т.д.)....

Вопрос: как решить задачу:
- получить текст модуля некоторого открытого контекста
 (или - может быть? - открываемого, но еще не открытого)
- заменить / изменить этот текст
- ВСТАВИТЬ обратно в тот же контекст
- далее: контекст формы работает с подмененным текстом....

хотя бы : куда копать?
  
Наверх
 
IP записан
 
kos
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 127
Местоположение: Киев
Зарегистрирован: 03. Марта 2013
Re: Заменить текст модуля контекста
Ответ #4 - 06. Декабря 2014 :: 11:23
Печать  
кажется, придумал. Идея:

1) использовать "Перехватчик"
2) обрабатывать событие:
   - либо 1с++ "СобытиеГМ_СозданиеКонтекста"
   - либо формекс "СобытиеГМ_ПриЗагрузкеМодуляФормы"

Но не пойму как (всмысле "как заменить модуль", а не "как пользоваться перехватчиком" .....)
Может у кого-то есть "know how" ? Поделитесь  Улыбка
« Последняя редакция: 06. Декабря 2014 :: 19:37 - kos »  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Заменить текст модуля контекста
Ответ #5 - 08. Декабря 2014 :: 06:24
Печать  
ПриЗагрузкеМодуляФормы не подойдёт - там нужно указывать только на текст модуля из мд.

ЗЫ: а зачем это всё ?
Мот проще дописывать формулы в атрибуты и изменять предопределенные события перехватчиком ?..
  
Наверх
 
IP записан
 
kos
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 127
Местоположение: Киев
Зарегистрирован: 03. Марта 2013
Re: Заменить текст модуля контекста
Ответ #6 - 08. Декабря 2014 :: 11:02
Печать  
Eprst писал(а) 08. Декабря 2014 :: 06:24:
... а зачем это всё ? ...


мне как раз и нужно подменить оригинальный текст модуля формы МД
на свой, точнее не подменить, а дописать что-то
и заставить форму работать с новым модулем.

Т.е. я так понял что событие "ПриЗагрузкеМодуляФормы" (в моем случае)
это как раз то что нужно? Например так:

Код
Выбрать все
процедура ПриЗагрузкеМодуляФормы(...,ТекстМодуляМД) Экспорт
      ТекстМодуляМД = "
      перем оМойОбъект;
      "+ТекстМодуляМД+"
      оМойОбъект = СоздатьОбъект(""МойКласс"");
      оМойОбъект.Инит(Контекст);
      ";
      Перехватчик.ВыполнитьОригинальноеСобытиеГМ(....)
конецпроцедуры
 



Тогда переменная (объект "оМойОбъект" ) живет - пока живет форма
и выполняет то что нужно
(например : подмену нативных запросов 1C SQL на мои, и т.д., и т.п....)

Я в правильном направлении смотрю
для этой конкретной задачи - "замена оригинального текста модуля МД"
???

Может кто сталкивался?
Есть подводные камни?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Заменить текст модуля контекста
Ответ #7 - 08. Декабря 2014 :: 11:15
Печать  
Не, не так.

Код
Выбрать все
 ПриЗагрузкеМодуляФормы(<ИмяОбъекта>) 




Если внутри метода изменить параметр  ИмяОбъекта, то будет загружен модуль по этому пути.
Причем, модуль может быть только в мд, в ИмяОбъекта - всегда путь (а не сам модуль)


ЗЫ:

Цитата:
Процедура ПриЗагрузкеМодуляФормы(<?>) КонецПроцедуры
Синтаксис:
Процедура ПриЗагрузкеМодуляФормы(<ИмяОбъекта>)КонецПроцедуры
Назначение:
Предопределенная процедура вызывается при загрузке модуля формы.
Параметры:
<ИмяОбъекта> - (Строка) Передается по значению.  полный путь к объекту, для которого загружается форма
ЗАМЕЧАНИЕ:
В качестве параметра в процедуру передается полный путь к загружаемому объекту внутри md ( список всех форм можно получить с помощью метода СписокВсехФорм / AllFormsList ). Если внутри процедуры изменить значение параметра ИмяОбъекта, то загрузится модуль в соответствии с этим новым путем. Если новый путь задан неверно, то будет загружен тот модуль, который предполагался изначально.



Короче, тебе это не подойдет.
Тебе только или ВМ использовать совместно с перехватчиком, или лепить допглобальник формексом.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Заменить текст модуля контекста
Ответ #8 - 08. Декабря 2014 :: 11:20
Печать  
ЗЫ: вот если нужно подменить модуль целиком для объектов из мд, то всё можно сделать ( я начал и бросил (лепил класс управления формой,на ис валяется заготовка, чтоб на ходу подвигать реквизиты и запомнить это всё, ну и сам модуль на-ходу изменять), точнее не доделал, ибо 7-ку у нас прикрыли)

Идея такая - через activemd выгружаешь модуль и форму в текст, меняешь как надо и скармливаешь turbomd. Имеешь на-ходу и измененную форму и измененный модуль формы любого объекта из мд.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Заменить текст модуля контекста
Ответ #9 - 08. Декабря 2014 :: 11:29
Печать  
А по-мелочевке, доп глобальничек и замена формул в реквизитах + предопределенные события через перехватчик, как-то хватало.
  
Наверх
 
IP записан
 
kos
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 127
Местоположение: Киев
Зарегистрирован: 03. Марта 2013
Re: Заменить текст модуля контекста
Ответ #10 - 08. Декабря 2014 :: 11:58
Печать  
Eprst писал(а) 08. Декабря 2014 :: 11:20:
... на ис валяется заготовка.....


нашел:
ActiveMD http://mdeditor.narod.ru/
TurboMD (вер.1.0.1.1) http://infostart.ru/public/14291/
TurboMD (вер.1.0.1.2) http://www.1cpp.ru/forum/YaBB.pl?num=1160630298

можно ссылочку на заготовку ?
посмотреть хочется (правда у меня там $sm нет...)
может сюда запостите?

спс.
« Последняя редакция: 09. Декабря 2014 :: 07:03 - kos »  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Заменить текст модуля контекста
Ответ #11 - 08. Декабря 2014 :: 12:48
Печать  
В заготовке только класс для правки модуля. Саму подмену делал на залипухах с активмд, потом бросил. Можно было бы доделать, но лень.
ЗЫ:описание поделки Тут  и за бесплатно
  

________2.rar ( 116 KB | Загрузки )
Наверх
 
IP записан
 
kos
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 127
Местоположение: Киев
Зарегистрирован: 03. Марта 2013
Re: Заменить текст модуля контекста
Ответ #12 - 10. Декабря 2014 :: 03:09
Печать  
оказывается, был уже такой вопрос (по сабжу)

"Динамическое изменение текста модулей" (2009 год)
здесь http://www.1cpp.ru/forum/YaBB.pl?num=1251195353/8#8

Решение так и не найдено.

ActiveMD + TurboMD конечно можно, но через файловую систему.....

"Редактор" от Eprst предполагает (так же) сохранение текста
в МД или куда-нибудь....

А очень хочется именно "динамически (на лету) из МД"....
Вот так:
1) перед загрузкой контекста получить текст загружаемого модуля
   (до создания, пока контекст не скомпилирован)
2) что-то с ним сделать (в памяти)
3) отдать дальше контексту "на компиляцию" (и пусть пользуется.....)

как-то так.

Идеи?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Заменить текст модуля контекста
Ответ #13 - 10. Декабря 2014 :: 06:33
Печать  
Ну, как тебе сказать - делать врят ли кто-то будет. Никому не интересно, снеговик на марше!
  
Наверх
 
IP записан
 
kos
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 127
Местоположение: Киев
Зарегистрирован: 03. Марта 2013
Re: Заменить текст модуля контекста
Ответ #14 - 11. Декабря 2014 :: 10:45
Печать  
Eprst писал(а) 10. Декабря 2014 :: 06:33:
Ну, как тебе сказать - делать врят ли кто-то будет. Никому не интересно, снеговик на марше!


вобщем придумал так:

1) Делаю отдельный класс "МойКласс", наследник от "ТабличноеПоле"
   который реализует нужный мне дополнительный функционал в форме :
   по сути как бы "расширение возможностей формы"
   - те дополнительные процедуры, функции, переменные
   - которые мне нужно было вставить в модуль "на лету"
   (собственно: динамическое добавление функционала)

2) еще один класс - переменная в глобальнике "МойСинглтон"
   который перехватывает события от разных форм
   и (по принципу элемента управления АктивХ / ТабличноеПоле)
   ПослеОткрытия()  ===> внедряет на форму скрытый элемент "кнопка"
   ПриЗакрытии()     ===> удаляет с формы внедренный элемент

3) синглтон "МойСинглтон" знает какие события умеет обрабатывать "МойКласс"
   и если в форме происходит сработка НУЖНЫХ событий
   вызывает соотвествующие методы "внедренного" объекта:
   
   Например:

Код
Выбрать все
    // обработчик в синглтоне
    процедура Событие_ПриНачалеВыбораЗначения(...) Экспорт
        если _ЕстьАктивХнаФорме(КонтФормы) = 1 тогда
             КонтФормы.МойВнедренныйОбъектНаФорме.РасширенныйДопМетод()
        конецесли
    конецпроцедуры
 



Что это дает:

- хочу добавить дополнительный функционал ко всем (или к многим) формам конфигурации
- раньше нужно было "копипастить" текст во все формы
- теперь : пишем класс и вешаем его на форму.

ПОЯСНЕНИЕ: моя конечная цель (чего ради):
мне нужна переменная(объект) в области видимости конкретного контекста
Именно поэтому нельзя делать "общественную" глобальную переменну для "МойКласс".
Именно поэтому приходится извращаться - в каждую форму тыкать.....
(изначально именно ради этого хотел динамическую замену модулей)

Может я не оригинален: но по крайней мере должно работать.

Считаю задача "динамическая замента текста модуля формы" решена.
Пошел реализовывать.....  Улыбка
« Последняя редакция: 11. Декабря 2014 :: 13:12 - kos »  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать