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


I Love YaBB 2!

Сообщений: 129
Зарегистрирован: 29. Января 2007
Изменение модуля на лету
15. Февраля 2007 :: 22:11
Печать  
Реально ли сделать перехват текста модуля перед его исполнением в 1С. Очень надо автоматом внести незначительные изменения в модуль, можно конечно Gcomp поюзать, но хотелось бы на лету. Надо для изменение процедуры при записи в произвольном документе, или добавления оной при ее отсутствии (борьба с блокировками).

И реально ли изменить на лету Функции и т.д. прописанные в произвольной кнопке: к примеру: #Записать на Записать_(Контекст)
  
Наверх
 
IP записан
 
DrACe
1c++ donor
1c++ power user
Отсутствует


1С++ любитель

Сообщений: 447
Местоположение: г. Новосибирск
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Изменение модуля на лету
Ответ #1 - 16. Февраля 2007 :: 03:42
Печать  
Цитата:
И реально ли изменить на лету Функции и т.д. прописанные в произвольной кнопке: к примеру: #Записать на Записать_(Контекст)

вроде FormEx это может, вот насчет Модуля документа - не знаю, в Модуле формы документа вроде тоже можно...
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Изменение модуля на лету
Ответ #2 - 16. Февраля 2007 :: 05:14
Печать  
Ну вы, блин, даете Печаль
Давно уже существует замечательная ВК TurboMD от Саши Орефкова, которая позволяет указанные вещи.
Вместе со скриптом Опенконфа - TurboMD.vbs - почти идеальный вариант получился.

openconf.1cpp.ru/beta или на этом форуме

ЗЫ использую постоянно уже несколько лет - очень помогает при активной разработке и помогает на лету вносить изменения, не выгоняя пользователей из базы.

ЗЗЫ еще можно на название этого раздела посмотреть - 1С++, TurboMD и прочие вкусности Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Изменение модуля на лету
Ответ #3 - 16. Февраля 2007 :: 06:36
Печать  
Артур, а ТурбоМД разве может подменять Модуль дкумента?
  
Наверх
 
IP записан
 
Phoenix
Senior Member
****
Отсутствует


itpath.ru

Сообщений: 398
Местоположение: Москва
Зарегистрирован: 15. Июня 2006
Пол: Мужской
Re: Изменение модуля на лету
Ответ #4 - 16. Февраля 2007 :: 07:02
Печать  
можно.
точно знаю, что нельзя подменить ГМ и Таблицы.
но раз можно код, тоды можно выгрузить таблицу, подменить код и все ок.
проверено.
  

Лень двигатель прогресса.&&http://www.itpath.ru&&;
Наверх
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Изменение модуля на лету
Ответ #5 - 16. Февраля 2007 :: 07:18
Печать  
В последнем ТурбоМД (который зачем-то опять имеет версию 1.1) можно менять даже модули журналов расчетов и видов расчетов.

ЗЫ по поводу таблиц - эх, доделал бы кто-нибудь скрипт ТурбоМД.вбс по автовыгрузке и автозагрузке таблиц Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Изменение модуля на лету
Ответ #6 - 16. Февраля 2007 :: 07:20
Печать  
Phoenix писал(а) 16. Февраля 2007 :: 07:02:
точно знаю, что нельзя подменить ГМ и Таблицы.

По поводу ГМ - я иногда, в особо срочных случаях, вставляю функции ГМ и правлю их прямо в нужном модуле, например, дока или справочника. А потом этот модуль выгружаю через ТурбоМД
т.к. 1С сначала ищет функцию в текущем модуле, если нет, ищет уже в глобальнике.
Много раз меня эта фича выручала Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Boris_1c
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 129
Зарегистрирован: 29. Января 2007
Re: Изменение модуля на лету
Ответ #7 - 16. Февраля 2007 :: 11:15
Печать  
Турбо мд это хорошо для текущей работы в базе.
А задача такая: есть несколько баз - изменение конфигурации с прописыванием недостающих процедур и изменения функций на кнопках не желательно, т.к. могут проводить обновления (типовые).

Желательно сделать загрузку компоненты (есть ли этот функционал в 1с++) с перехватом assignandcompile (или как она там) и на лету изменить/добавить пару строк в модуль формы + в диалогах функции на кнопках. Есть такая компонента с исходниками у Ромикса, но она валит 1С, если изменить текст модуля (размер конечного модуля>исходного) Печаль

Как быть?
  
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Изменение модуля на лету
Ответ #8 - 16. Февраля 2007 :: 11:28
Печать  
Может тебе АЛьФовским инсертером побаловаться?

Да и вообще: откуда такая боязнь перед разрушением типовой?
gcomp и kdiff3 в зубы - и вперед, объединяй.
  
Наверх
www  
IP записан
 
АЛьФ
FormEx developer
1c++ developer
Отсутствует



Сообщений: 1538
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Изменение модуля на лету
Ответ #9 - 16. Февраля 2007 :: 11:34
Печать  
В FormEx есть глобальная предопределенная процедура ПриЗагрузкеМодуляФормы(). В нее в качестве параметра передается путь к загружаемому модулю.
Можешь сделать отдельную обработку (на обновление это слабо повлияет), скопировать туда нужный модуль, доработать его и в глобальной ПриЗагрузкеМодуляФормы() переназначать параметру нужный путь.
Что-то типа такого:
Код
Выбрать все
Процедура ПриЗагрузкеМодуляФормы(Имя)
	ШИ = глПользователь.ЦО.ШаблонИнтерфейса;
	Если Имя = "Справочник.Клиенты.Форма" Тогда
		Если ПустоеЗначение(ШИ) = 1 Тогда
			Имя = "Обработка.Пусто.Форма";
		ИначеЕсли ШИ = Перечисление.Интерфейсы.СИ Тогда
			Имя = "Обработка.КлиентыСИ.Форма";
		ИначеЕсли ШИ = Перечисление.Интерфейсы.ДС Тогда
			Имя = "Обработка.КлиентыДС.Форма";
		Иначе
		КонецЕсли;
	ИначеЕсли Имя = "Справочник.Договоры.Форма" Тогда
		Если ПустоеЗначение(ШИ) = 1 Тогда
			Имя = "Обработка.Пусто.Форма";
		ИначеЕсли ШИ = Перечисление.Интерфейсы.ДС Тогда
			Имя = "Обработка.ДоговорыДС.Форма";
		Иначе
		КонецЕсли;
	ИначеЕсли Имя = "Справочник.ПроделанныеРаботы.Форма" Тогда
		Если ПустоеЗначение(ШИ) = 1 Тогда
			Имя = "Обработка.Пусто.Форма";
		ИначеЕсли ШИ = Перечисление.Интерфейсы.ДС Тогда
			Имя = "Обработка.ПроделанныеРаботыДС.Форма";
		ИначеЕсли ШИ = Перечисление.Интерфейсы.ОД Тогда
			Имя = "Обработка.ПроделанныеРаботыОД.Форма";
		Иначе
		КонецЕсли;
	ИначеЕсли Имя = "Справочник.Клиенты.ФормаСписка.ФормаСписка" Тогда
		Если ПустоеЗначение(ШИ) = 1 Тогда
			Имя = "Справочник.Клиенты.ФормаСписка.Пусто";
		ИначеЕсли ШИ = Перечисление.Интерфейсы.СИ Тогда
			Имя = "Справочник.Клиенты.ФормаСписка.ФормаСписка_МенеджерыСИ";
		ИначеЕсли ШИ = Перечисление.Интерфейсы.ДС Тогда
			Имя = "Справочник.Клиенты.ФормаСписка.ФормаСписка_МенеджерыДС";
		Иначе
			Если глПользователь.Права <= 2 Тогда
				Имя = "Справочник.Клиенты.ФормаСписка.ФормаСписка_Менеджеры"
			КонецЕсли;
		КонецЕсли;
	ИначеЕсли Имя = "Справочник.ПроделанныеРаботы.ФормаСписка.ФормаСписка" Тогда
		Если ПустоеЗначение(ШИ) = 1 Тогда
			Имя = "Справочник.ПроделанныеРаботы.Пусто";
		ИначеЕсли ШИ = Перечисление.Интерфейсы.ДС Тогда
			Имя = "Справочник.ПроделанныеРаботы.ФормаСписка.ДляДС";
		КонецЕсли;
	ИначеЕсли Имя = "Журнал.ПроизведенныеРаботыВзСЦО.Форма.ФормаСписка" Тогда
		Если ПустоеЗначение(ШИ) = 1 Тогда
			Имя = "Журнал.ПроизведенныеРаботыВзСЦО.Форма.Пусто";
		ИначеЕсли ШИ = Перечисление.Интерфейсы.Адм Тогда
			Имя = "Журнал.ПроизведенныеРаботыВзСЦО.Форма.Администрация";
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры
 

  

FormEx developer
Наверх
www  
IP записан
 
Boris_1c
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 129
Зарегистрирован: 29. Января 2007
Re: Изменение модуля на лету
Ответ #10 - 16. Февраля 2007 :: 12:21
Печать  
Цитата:
В FormEx есть глобальная предопределенная процедура ПриЗагрузкеМодуляФормы(). В нее в качестве параметра передается путь к загружаемому модулю.
Можешь сделать отдельную обработку (на обновление это слабо повлияет), скопировать туда нужный модуль, доработать его и в глобальной ПриЗагрузкеМодуляФормы() переназначать параметру нужный путь.


Благодарю понял куда смотреть.
  
Наверх
 
IP записан
 
Boris_1c
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 129
Зарегистрирован: 29. Января 2007
Re: Изменение модуля на лету
Ответ #11 - 17. Февраля 2007 :: 09:09
Печать  
Не совсем то Смущённый
Процедура ПриЗагрузкеМодуляФормы(Имя)

а по этому имени можно ли как-то получить текущий модуль из конфигурации, изменить и установить в форму?
  
Наверх
 
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Изменение модуля на лету
Ответ #12 - 17. Февраля 2007 :: 22:43
Печать  
Вот если бы Саша Орефков отдал в публичный доступ исходники TurboMD, то я бы, пожалуй, попробовал такую фичу реализовать в 1С++.

И еще бы бажог в TurboMD поправил. Сейчас если в модуле формы изменяется количество методов, то TurboMD начинает замечать этот метод только со второго раза.  Улыбка
  
Наверх
 
IP записан
 
Boris_1c
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 129
Зарегистрирован: 29. Января 2007
Re: Изменение модуля на лету
Ответ #13 - 18. Февраля 2007 :: 09:26
Печать  
Было бы круто!!! Полиморфный 1С Улыбка
  
Наверх
 
IP записан
 
bsa
Junior Member
**
Отсутствует


Не профессионал но и не
любитель...

Сообщений: 27
Местоположение: Одесса
Зарегистрирован: 20. Июня 2006
Пол: Мужской
Re: Изменение модуля на лету
Ответ #14 - 19. Февраля 2007 :: 11:14
Печать  
Доработка макроса TurboMD для выгрузки/загрузки таблиц MXL:
Код
Выбрать все
'Собственно макрос для выгрузки активного окна
Sub UnloadCurrentWnd()
    Set w = Windows.ActiveWnd
    If w Is Nothing Then
        MsgBox "Нет активного окна", vbOKOnly, "TurboMD"
        Exit Sub
    End If
    Set d = w.Document
    If d.ID < 2 Then
        MsgBox "Окно ни форма, ни модуль", vbOKOnly, "TurboMD"
        Exit Sub
    End If
    If d = docText Then     ' Просто модуль
        UnloadDoc d
    Else
        If d = docWorkBook Then ' Форма
'БСА - выгрузим текущую	таблицу MXL
			IF d.ActivePage > 1 THEN ' Таблица
				'определим имя закладки
				lMXLName = d.Page(d.ActivePage).Name
				lastdec  = InStrRev(lMXLName, ".")
				lMXLName = Right(lMXLName, Len(lMXLName) - lastdec)
				If MsgBox("Выгрузить таблицу <"+lMXLName+">?", vbQuestion + vbYesNo, "TurboMD") = vbYes Then
					UnloadDoc d.Page(d.ActivePage)
					exit sub
				End If
			END IF
'БСА - выгрузили текущую таблицу MXL
            If MsgBox("Выгрузить форму?", vbQuestion + vbYesNo, "TurboMD") = vbYes Then
                UnloadDoc d.Page(0) ' Выгружаем диалог
            End If
			'ModuleText = d.Page(1).text
			'For i = 2 To d.CountPages - 1
				'UnloadMXL d.Page(i), ModuleText
				'UnloadDoc d.Page(i)
			'Next
            If MsgBox("Выгрузить модуль?", vbQuestion + vbYesNo, "TurboMD") = vbYes Then
				'strOldText = d.Page(1).text
				'd.Page(1).text = ModuleText
                UnloadDoc d.Page(1) ' Выгружаем модуль
				'd.Page(1).text = strOldText
            End If
        End If
    End If
End Sub
 



Пристегиваю также свой вариант доработки TurboMD (только часть макроса, которая дорабатывалась - 2 процедуры). Его отличия от находящегося в репозитарии:
1.  Выгрузка ТОЛЬКО текущего модуля/формы/таблицы (в обычном варианте для форм ВСЕГДА запрашивается выгрузка формы и модуля).
2.  Запрос на выгрузку унифицирован: сначал ВСЕГДА выдается запрос на выгрузку (для модулей проведения документов вообще не выдался).
3. Добавлена выгрузка таблиц MXL.
4. Добавлена выгрузка глобального модуля. Мне это нужно было по той лишь причине, что я не пользуюсь gcomp-ом.
Такой вариант TurboMD.prm в связке с WinMerg-ем (http://winmerge.org/ - достойный конкурент KDiff, позволяющий при сравнении править сравниваемые файлы  Класс) позволяет мне оперативной вносить ВСЕ возможные изменения (за исключением тех, которые касаются структуры MD).  Улыбка
Правда "за бортом" остаются интерфейсы и права пользователя.  Печаль

Кстати, если бы TurboMD позволял (опционально) выгружать диалоги форм в формате gcomp-а, это было бы вообще сказочно!  Круглые глаза
  

UpPartTurboMA.zip ( 1 KB | Загрузки )
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать