Неожиданный возврат
Расширение конфигурации в хранилище. А там проверка, предотвращающая дубли записей некоего справочника. Но уже имеющийся дубль исправлять и склеивать не нужно для сохранения истории этой задвоенности. Хочется просто пометить на удаление, а это невозможно как раз из-за проверки. Как исправить быстро без танцев с хранилищем...
Все просто. Создаем еще одно временное расширение, в него заимствуем ту же процедуру ПередЗаписью() и собственно разрешаем писать. Казалось бы, чего тут извергать из себя буквы. Но обратите внимание как неожиданно работает возврат. Вот простой пример...
Процедура ПередЗаписью(Отказ) Сумма = 1000; //любой код КонецПроцедуры
&После("ПередЗаписью") Процедура Расш1_ПередЗаписью(Отказ) Если Истина Тогда Отказ = Истина; Возврат; КонецЕсли; Сумма = 2000; //этот код не выполняется КонецПроцедуры
&После("ПередЗаписью") Процедура Расш2_ПередЗаписью(Отказ) Отказ = Ложь; //этот код выполняется КонецПроцедуры
То есть, возврат производится только из процедуры в расширении, но не из процедуры вообще. И это не баг, а фича, нужная как раз для подобных задач. Иногда такое поведение огорчает. Например, если охота не после, а перед стандартной процедурой проверить условие и вообще ее не выполнять:
&Перед("ПередЗаписью") Процедура Расш1_ПередЗаписью(Отказ) Если КакоеНибудьУсловие Тогда Возврат; КонецЕсли; КонецПроцедуры
Но нет, такой возврат вовсе не предотвращает исполнение стандартного кода, хотя казалось бы. В этом случае необходимо использовать &Вместо:
&Вместо("ПередЗаписью") Процедура Расш1_ПередЗаписью(Отказ) Если КакоеНибудьУсловие Тогда Возврат; Иначе ПродолжитьВызов(Отказ); КонецЕсли; КонецПроцедуры
Механизм расширения конфигураций очень удобен, нужно только понимать некоторые тонкости...