Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
Перем _КвалифицированноеИмяМетода; // Строка
Перем _Объект; // Произвольный
Перем _РегуляркаИмениМодуля; // РегулярноеВыражение

#Область ОбработчикиСобытий

// Инициализирует разбор квалифицированного имени метода.
//
// Параметры:
// КвалифицированноеИмяМетода - Строка - Имя метода в формате:
// - <ИмяМетода> - метод объекта
// - <ИмяМодуля>.<ИмяМетода> - метод модуля
// - <ИмяТипа>.<ИмяМетода> - метод экземпляра типа
// Объект - Произвольный - Объект-владелец метода для формата <ИмяМетода>.
Процедура ПриСозданииОбъекта(КвалифицированноеИмяМетода, Объект = Неопределено)

_КвалифицированноеИмяМетода = КвалифицированноеИмяМетода;
_Объект = Объект;

КонецПроцедуры

#КонецОбласти

#Область ПрограммныйИнтерфейс

// Разбирает квалифицированное имя метода.
//
// Возвращаемое значение:
// Структура:
// * Владелец - Произвольный - объект, тип или модуль, в котором расположен метод
// * ИмяМетода - Строка - имя метода без квалификатора
Функция Разобрать() Экспорт

ЧастиИмени = СтрРазделить(_КвалифицированноеИмяМетода, ".");
КоличествоЧастей = ЧастиИмени.Количество();

Если КоличествоЧастей = 1 Тогда
Возврат РазобратьМетодОбъекта();
ИначеЕсли КоличествоЧастей = 2 Тогда
Возврат РазобратьКвалифицированныйМетод(ЧастиИмени);
Иначе
ВызватьИсключение СтрШаблон("Квалифицированное имя метода <%1> задано некорректно", _КвалифицированноеИмяМетода);
КонецЕсли;

КонецФункции

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

Функция РазобратьМетодОбъекта()

Если Не ЗначениеЗаполнено(_Объект) Тогда
ВызватьИсключение СтрШаблон("Для разбора метода <%1> не указан объект-владелец", _КвалифицированноеИмяМетода);
КонецЕсли;

Возврат Новый Структура("Владелец, ИмяМетода", _Объект, _КвалифицированноеИмяМетода);

КонецФункции

Функция РазобратьКвалифицированныйМетод(ЧастиИмени)

ИмяМодуляИлиТипа = ЧастиИмени[0];
ИмяМетода = ЧастиИмени[1];

Владелец = ПолучитьМодульПоИмени(ИмяМодуляИлиТипа);

Если Владелец = Неопределено Тогда
Владелец = Тип(ИмяМодуляИлиТипа);
КонецЕсли;

Возврат Новый Структура("Владелец, ИмяМетода", Владелец, ИмяМетода);

КонецФункции

Функция ПолучитьМодульПоИмени(ИмяМодуля)

ПроверитьИмяМодуля(ИмяМодуля);

Попытка
НайденныйОбъект = Вычислить(ИмяМодуля);
Исключение
Возврат Неопределено;
КонецПопытки;

Если ТипЗнч(НайденныйОбъект) <> Тип("Сценарий") Тогда
ВызватьИсключение СтрШаблон("Модуль <%1> не является сценарием", ИмяМодуля);
КонецЕсли;
Comment thread
coderabbitai[bot] marked this conversation as resolved.

Возврат НайденныйОбъект;

КонецФункции

Процедура ПроверитьИмяМодуля(ИмяМодуля)

Если ИмяМодуляВалидно(ИмяМодуля) Тогда
Возврат;
КонецЕсли;

ВызватьИсключение СтрШаблон("Имя модуля <%1> задано некорректно.", ИмяМодуля);

КонецПроцедуры

Функция ИмяМодуляВалидно(ИмяМодуля)

Если _РегуляркаИмениМодуля = Неопределено Тогда
_РегуляркаИмениМодуля = Новый РегулярноеВыражение("^[a-zA-Zа-яА-ЯёЁ_][a-zA-Zа-яА-ЯёЁ0-9_]*$");
КонецЕсли;

Возврат _РегуляркаИмениМодуля.Совпадает(ИмяМодуля);

КонецФункции

#КонецОбласти
Original file line number Diff line number Diff line change
Expand Up @@ -52,67 +52,26 @@
_КешированныйДелегат = СоздатьДелегатПоКвалифицированномуИмени();

Возврат _КешированныйДелегат;

КонецФункции

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

Функция СоздатьДелегатПоКвалифицированномуИмени()

ЧастиИмени = СтрРазделить(_КвалифицированноеИмяМетода, ".");
КоличествоЧастей = ЧастиИмени.Количество();

Если КоличествоЧастей = 1 Тогда
Возврат СоздатьДелегатДляМетодаОбъекта();
ИначеЕсли КоличествоЧастей = 2 Тогда
Возврат СоздатьДелегатДляКвалифицированногоМетода(ЧастиИмени);
Иначе
ВызватьИсключение СтрШаблон("Квалифицированное имя метода <%1> задано некорректно", _КвалифицированноеИмяМетода);
КонецЕсли;

КонецФункции

Функция СоздатьДелегатДляМетодаОбъекта()

Если Не ЗначениеЗаполнено(_Объект) Тогда
ВызватьИсключение СтрШаблон("Для создания делегата <%1> не указан объект", _КвалифицированноеИмяМетода);
КонецЕсли;

Возврат Новый Действие(_Объект, _КвалифицированноеИмяМетода);

КонецФункции

Функция СоздатьДелегатДляКвалифицированногоМетода(ЧастиИмени)

ИмяМодуляИлиТипа = ЧастиИмени[0];
ИмяМетода = ЧастиИмени[1];
РазборИмениМетода = Новый РазборКвалифицированногоИмениМетода(_КвалифицированноеИмяМетода, _Объект);
ОписаниеМетода = РазборИмениМетода.Разобрать();

ОбъектВладелец = ПолучитьМодульПоИмени(ИмяМодуляИлиТипа);

Если ОбъектВладелец = Неопределено Тогда
ОбъектВладелец = Новый(ИмяМодуляИлиТипа);
КонецЕсли;

Возврат Новый Действие(ОбъектВладелец, ИмяМетода);

КонецФункции

Функция ПолучитьМодульПоИмени(ИмяМодуля)

Попытка
НайденныйОбъект = Вычислить(ИмяМодуля);
Исключение
Возврат Неопределено;
КонецПопытки;

Если ТипЗнч(НайденныйОбъект) <> Тип("Сценарий") Тогда
ВызватьИсключение СтрШаблон("Модуль <%1> не является сценарием", ИмяМодуля);
Если ТипЗнч(ОписаниеМетода.Владелец) = Тип("Тип") Тогда
Объект = Новый(ОписаниеМетода.Владелец);
Иначе
Объект = ОписаниеМетода.Владелец;
КонецЕсли;

Возврат НайденныйОбъект;
Возврат Новый Действие(Объект, ОписаниеМетода.ИмяМетода);

КонецФункции

#КонецОбласти
#КонецОбласти
Loading
Loading