Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема КОП для создания классов на лету (число прочтений - 2959 )
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
КОП для создания классов на лету
11. Августа 2008 :: 11:15
Печать  
Предлагаю удобный класс Общие.ПомощникСозданияКласса для простого создания классов на лету в режиме работы 1С:Предприятие

Код
Выбрать все
// ПомощникСозданияКласса

Перем
		_МетаИнфо,
		_Текст
		;

Процедура Конструктор()
	_МетаИнфо = СоздатьОбъект("MetaInfoClasses");
	_Текст = СоздатьОбъект("Текст");
КонецПроцедуры // Конструктор

Функция ПолучитьСлучайноеИмяНовогоКласса() Экспорт
	Математика = СоздатьОбъект("Математика");
	СлучайноеЧисло = Математика.RAND();

	// использую случайное имя класса, чтобы можно было добавлять,
	// 	иначе будет ошибка повторного определения класса
	ИмяНовогоКласса = "НовыйКласс_"+Строка(СлучайноеЧисло);
	Возврат ИмяНовогоКласса;
КонецФункции

Функция ПолучитьИмяФайлаКласса(НаименованиеНовогоКласса, КаталогФайла)
	Если КаталогФайла = "" Тогда
		ИмяФайлаКласса = НаименованиеНовогоКласса+".txt"; // т.е. в КаталогИБ
	Иначе
		лКаталог = КаталогФайла;
		Если Прав(лКаталог, 1) <> "\" Тогда
			лКаталог = лКаталог + "\";
		КонецЕсли;
		Если Врег(лКаталог) = Врег(КаталогИБ()) Тогда
			лКаталог = "";
		КонецЕсли;

		ИмяФайлаКласса = лКаталог + НаименованиеНовогоКласса+".txt";
		//ИмяФайлаКласса = Симв(34) +ИмяФайлаКласса + Симв(34);
	КонецЕсли;
//Сообщить("ИмяФайлаКласса = <"+ИмяФайлаКласса+">");

	Возврат ИмяФайлаКласса;
КонецФункции

Функция СоздатьФайлНовогоКласса(НаименованиеНовогоКласса, ТекстКласса, КаталогФайла)
	ИмяФайлаКласса = ПолучитьИмяФайлаКласса(НаименованиеНовогоКласса, КаталогФайла);

	_Текст.ДобавитьСтроку(ТекстКласса);
	_Текст.Записать(ИмяФайлаКласса);

	//вирт().ДобавитьВременныйФайл(ИмяФайлаКласса); // TODO пользователь должен самостоятельно удалять файл после использования, если это нужно

	Возврат ИмяФайлаКласса;
КонецФункции

Функция ПолучитьОписаниеНовогоКласса(НаименованиеНовогоКласса, СтрокаНаследников ,ПутьКФайлуКласса)
	лТекстКласса = "class "+НаименованиеНовогоКласса+" = "+ПутьКФайлуКласса;
	Если СокрЛП(СтрокаНаследников) <> "" Тогда
		лТекстКласса = лТекстКласса +" : "+СтрокаНаследников;
	КонецЕсли;

	Возврат лТекстКласса + "
		|{
		|}";
КонецФункции

Функция СоздатьНовыйКласс(ИмяНовогоКласса, ТекстКласса, СтрокаНаследников, КаталогФайла = "") Экспорт
	фНельзяСоздавать = 0;
	Попытка
		лНовыйОбъект = СоздатьОбъект(ИмяНовогоКласса);
		фНельзяСоздавать = 1;
	Исключение
	КонецПопытки;

	Если фНельзяСоздавать = 1 Тогда
		вирт()._ВыброситьИскл("Класс "+ИмяНовогоКласса+" уже существует");
	КонецЕсли;

	лТекстКласса = ТекстКласса;
	Если СокрЛП(лТекстКласса) = "" Тогда
		лТекстКласса = "//"; // пустых классов не бывает !
	КонецЕсли;

	лИмяФайла = СоздатьФайлНовогоКласса(ИмяНовогоКласса, лТекстКласса, КаталогФайла);
	СтрокаОписанияКласса = ПолучитьОписаниеНовогоКласса(ИмяНовогоКласса, СтрокаНаследников, лИмяФайла);

	_МетаИнфо.ЗагрузитьОписаниеКлассов(СтрокаОписанияКласса);

	Возврат лИмяФайла;
КонецФункции 



Класс успешно прошел тестирование и активно используется в конфигурации тестирования 1С++.
  

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



Сообщений: 166
Местоположение: Харьков
Зарегистрирован: 13. Февраля 2008
Пол: Мужской
Re: КОП для создания классов на лету
Ответ #1 - 11. Августа 2008 :: 11:25
Печать  
Прикольный вариант!
А можешь намекнуть сферу применения? В двух словах
Пришло в голову только: подключить/создать класс без перезагрузки 1С. (может, не прав?)
  

Правильно поставленный вопрос, уже содержит половину ответа.
Наверх
ICQ  
IP записан
 
PVR
God Member
*****
Отсутствует



Сообщений: 622
Зарегистрирован: 19. Ноября 2007
Пол: Мужской
Re: КОП для создания классов на лету
Ответ #2 - 11. Августа 2008 :: 11:36
Печать  
AndreyM писал(а) 11. Августа 2008 :: 11:25:
Прикольный вариант!
А можешь намекнуть сферу применения? В двух словах
Пришло в голову только: подключить/создать класс без перезагрузки 1С. (может, не прав?)


1. Да, интересно.
2. А зачем тогда: ПолучитьСлучайноеИмяНовогоКласса() ?

Возможно, замена Вып. модуля., создание динамического класса?
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: КОП для создания классов на лету
Ответ #3 - 11. Августа 2008 :: 11:44
Печать  
Класс очень пригодился при тестировании 1С++ Улыбка
С его помощью легко создаются временные классы, используемые для целей тестирования.
Для создания временных классов и используется обычный рандомайзер чисел, т.е. имя класса получается как "Новый_СлучайноеЧисло".
Создаваемые файлы классов также довольно легко можно удалить после использования/создания классов.

Честно говоря, пока даже не знаю, где еще может пригодиться класс для боевого применения Улыбка
  

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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: КОП для создания классов на лету
Ответ #4 - 19. Августа 2008 :: 02:58
Печать  
artbear писал(а) 11. Августа 2008 :: 11:44:
Честно говоря, пока даже не знаю, где еще может пригодиться класс для боевого применения Улыбка

Удалось найти отличное боевое применение Улыбка
Использовал данный класс в разработке "Набор классов для универсального перехвата событий" http://www.1cpp.ru/forum/YaBB.pl?num=1218783847/0

С помощью класса генерю спец.класс для возможности перехвата любых событий формы на лету в любой момент времени.
Получилось очень удобно и просто расширяемо - пользователь предварительно задает параметры всех/нужных событий формы (имя и кол-во параметров - например, ПослеЗакрытия, 0 ), а разработка автоматически генерит класс со обработчиками для всех указанных событий формы и выполняет перехват этих событий.

Т.е. сфера применения класса - это генерация класса на лету в зависимости от некоторых условий.

ЗЫ постараюсь сегодня доработать указанную разработку в т.ч. для аналогичного перехвата событий ГМ.
Потом выложу в соответствующую ветку.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать