Skip to content

Commit

Permalink
1. Определение последовательности синхронизации полей вынесено в моме…
Browse files Browse the repository at this point in the history
…нт компиляции скрипта

2. Восстановлено исправление из nixel2007#13
  • Loading branch information
sfaqer committed Oct 11, 2023
1 parent 05f48af commit 00e3895
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 23 deletions.
19 changes: 3 additions & 16 deletions src/internal/Модули/КэшируемыеДанные.os
Original file line number Diff line number Diff line change
Expand Up @@ -53,12 +53,7 @@
|{Функция} Декоратор_ИмяМетода(Декоратор_ОписаниеПараметровМетода) // {Экспорт}
|
| // {Декоратор_ПередСинхронизациейПолей}
|
| Если {Декоратор_ЭтоДекорируемыйМетод} Тогда
| ОбработкаДекоратора.СинхронизироватьПоля(ЭтотОбъект, Декоратор_ИсходныйОбъект);
| Иначе
| ОбработкаДекоратора.СинхронизироватьПоля(Декоратор_ИсходныйОбъект, ЭтотОбъект);
| КонецЕсли;
| // {Декоратор_СинхронизироватьПоляПеред}
|
| Декоратор_ВозвращаемоеИзМетодаЗначение = NULL;
|
Expand All @@ -70,23 +65,15 @@
|
| Исключение
|
| Если {Декоратор_ЭтоДекорируемыйМетод} Тогда
| ОбработкаДекоратора.СинхронизироватьПоля(Декоратор_ИсходныйОбъект, ЭтотОбъект);
| Иначе
| ОбработкаДекоратора.СинхронизироватьПоля(ЭтотОбъект, Декоратор_ИсходныйОбъект);
| КонецЕсли;
| // {Декоратор_СинхронизироватьПоляПосле}
|
| // {Декоратор_ПослеВызоваИсключения}
|
| ВызватьИсключение;
|
| КонецПопытки;
|
| Если {Декоратор_ЭтоДекорируемыйМетод} Тогда
| ОбработкаДекоратора.СинхронизироватьПоля(Декоратор_ИсходныйОбъект, ЭтотОбъект);
| Иначе
| ОбработкаДекоратора.СинхронизироватьПоля(ЭтотОбъект, Декоратор_ИсходныйОбъект);
| КонецЕсли;
| // {Декоратор_СинхронизироватьПоляПосле}
|
| Если Декоратор_ВозвращаемоеИзМетодаЗначение = Декоратор_ИсходныйОбъект Тогда
| Декоратор_ВозвращаемоеИзМетодаЗначение = ЭтотОбъект;
Expand Down
31 changes: 27 additions & 4 deletions src/Классы/КонструкторДекоратора.os
Original file line number Diff line number Diff line change
Expand Up @@ -438,9 +438,20 @@
НовыйМетод = СтрЗаменить(НовыйМетод, "// {Экспорт}", "Экспорт");
НовыйМетод = СтрЗаменить(НовыйМетод, "{Функция}", "Функция");
НовыйМетод = СтрЗаменить(НовыйМетод, "{КонецФункции}", "КонецФункции");
НовыйМетод = СтрЗаменить(НовыйМетод, "{Декоратор_ЭтоДекорируемыйМетод}", "Истина");
НовыйМетод = СтрЗаменить(НовыйМетод, "// {Декоратор_ТекстМетода}", ТекстМетода);


НовыйМетод = СтрЗаменить(
НовыйМетод,
"// {Декоратор_СинхронизироватьПоляПеред}",
"ОбработкаДекоратора.СинхронизироватьПоля(ЭтотОбъект, Декоратор_ИсходныйОбъект);"
);

НовыйМетод = СтрЗаменить(
НовыйМетод,
"// {Декоратор_СинхронизироватьПоляПосле}",
"ОбработкаДекоратора.СинхронизироватьПоля(Декоратор_ИсходныйОбъект, ЭтотОбъект);"
);

ДобавитьПерехватчикиМетода(ИмяМетода, НовыйМетод, Истина);

НовыйМетод = НовыйМетод + Символы.ПС;
Expand Down Expand Up @@ -473,10 +484,22 @@
НовыйМетод = СтрЗаменить(НовыйМетод, "// {Экспорт}", "Экспорт");
НовыйМетод = СтрЗаменить(НовыйМетод, "{Функция}", "Функция");
НовыйМетод = СтрЗаменить(НовыйМетод, "{КонецФункции}", "КонецФункции");
НовыйМетод = СтрЗаменить(НовыйМетод, "{Декоратор_ЭтоДекорируемыйМетод}", "Ложь");
НовыйМетод = СтрЗаменить(НовыйМетод, "// {Декоратор_ВыполняемаяСтрока}", ВыполняемаяСтрока);
НовыйМетод = СтрЗаменить(НовыйМетод, "// {Декоратор_ВозвращаемоеЗначение}", ВозвращаемоеЗначение);


// Для будущих археологов, если вы подумаете что нужно тут добавить
// ОбработкаДекоратора.СинхронизироватьПоля(Декоратор_ИсходныйОбъект, ЭтотОбъект);
// то проверьте что работает АктивнаяЗапись в библиотеки entity
// сейчас этого куска нет потому что при его наличии в декораторе задавятся поля
// декоратора которые были заполнены не через методы, а просто установкой свойств.
НовыйМетод = СтрЗаменить(НовыйМетод, "// {Декоратор_СинхронизироватьПоляПеред}", "");

НовыйМетод = СтрЗаменить(
НовыйМетод,
"// {Декоратор_СинхронизироватьПоляПосле}",
"ОбработкаДекоратора.СинхронизироватьПоля(ЭтотОбъект, Декоратор_ИсходныйОбъект);"
);

ДобавитьПерехватчикиМетода(ИмяМетода, НовыйМетод);

ОбластьМетодов = ОбластьМетодов + НовыйМетод;
Expand Down
25 changes: 23 additions & 2 deletions src/Классы/ПостроительДекоратора.os
Original file line number Diff line number Diff line change
Expand Up @@ -442,7 +442,17 @@

НовыйМетод = Метод.Описание();

НовыйМетод = СтрЗаменить(НовыйМетод, "{Декоратор_ЭтоДекорируемыйМетод}", "Истина");
НовыйМетод = СтрЗаменить(
НовыйМетод,
"// {Декоратор_СинхронизироватьПоляПеред}",
"ОбработкаДекоратора.СинхронизироватьПоля(ЭтотОбъект, Декоратор_ИсходныйОбъект);"
);

НовыйМетод = СтрЗаменить(
НовыйМетод,
"// {Декоратор_СинхронизироватьПоляПосле}",
"ОбработкаДекоратора.СинхронизироватьПоля(Декоратор_ИсходныйОбъект, ЭтотОбъект);"
);

ДобавитьПерехватчикиМетода(ИмяМетода, НовыйМетод);

Expand All @@ -458,7 +468,18 @@

НовыйМетод = Метод.Описание();

НовыйМетод = СтрЗаменить(НовыйМетод, "{Декоратор_ЭтоДекорируемыйМетод}", "Ложь");
// Для будущих археологов, если вы подумаете что нужно тут добавить
// ОбработкаДекоратора.СинхронизироватьПоля(Декоратор_ИсходныйОбъект, ЭтотОбъект);
// то проверьте что работает АктивнаяЗапись в библиотеки entity
// сейчас этого куска нет потому что при его наличии в декораторе задавятся поля
// декоратора которые были заполнены не через методы, а просто установкой свойств.
НовыйМетод = СтрЗаменить(НовыйМетод, "// {Декоратор_СинхронизироватьПоляПеред}", "");

НовыйМетод = СтрЗаменить(
НовыйМетод,
"// {Декоратор_СинхронизироватьПоляПосле}",
"ОбработкаДекоратора.СинхронизироватьПоля(ЭтотОбъект, Декоратор_ИсходныйОбъект);"
);

ДобавитьПерехватчикиМетода(Метод.ИмяМетода(), НовыйМетод);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -834,7 +834,7 @@

ПерехватчикПередСинхронизациейПолей = Новый Перехватчик("ВернутьСебя")
.ТипПерехватчика(ТипыПерехватчиковМетода.ПередСинхронизациейПолей)
.Тело("Декоратор_ИсходныйОбъект.Поле = 124;");
.Тело("Поле = 124;");

Декоратор = Новый ПостроительДекоратора(МойКласс)
.Метод(НовыйМетод)
Expand Down

0 comments on commit 00e3895

Please sign in to comment.