November 6

Неожиданный возврат

Расширение конфигурации в хранилище. А там проверка, предотвращающая дубли записей некоего справочника. Но уже имеющийся дубль исправлять и склеивать не нужно для сохранения истории этой задвоенности. Хочется просто пометить на удаление, а это невозможно как раз из-за проверки. Как исправить быстро без танцев с хранилищем...

Все просто. Создаем еще одно временное расширение, в него заимствуем ту же процедуру ПередЗаписью() и собственно разрешаем писать. Казалось бы, чего тут извергать из себя буквы. Но обратите внимание как неожиданно работает возврат. Вот простой пример...

В конфигурации:

Процедура ПередЗаписью(Отказ)
	Сумма = 1000; //любой код
КонецПроцедуры

В первом расширении:

&После("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ)
	Если Истина Тогда
		Отказ = Истина;
		Возврат;
	КонецЕсли;
	
	Сумма = 2000; //этот код не выполняется
КонецПроцедуры

Во втором расширении:

&После("ПередЗаписью")
Процедура Расш2_ПередЗаписью(Отказ)
	Отказ = Ложь; //этот код выполняется
КонецПроцедуры

То есть, возврат производится только из процедуры в расширении, но не из процедуры вообще. И это не баг, а фича, нужная как раз для подобных задач. Иногда такое поведение огорчает. Например, если охота не после, а перед стандартной процедурой проверить условие и вообще ее не выполнять:

&Перед("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ)
	Если КакоеНибудьУсловие Тогда
		Возврат;
	КонецЕсли;
КонецПроцедуры

Но нет, такой возврат вовсе не предотвращает исполнение стандартного кода, хотя казалось бы. В этом случае необходимо использовать &Вместо:

&Вместо("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ)
	Если КакоеНибудьУсловие Тогда
		Возврат;
	Иначе
		ПродолжитьВызов(Отказ);
	КонецЕсли;
КонецПроцедуры

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

←32 | заметка 33 | 34→