Работа с параметром «Отказ» в обработчиках событий

#std686

Область применения: управляемое приложение, мобильное приложение, обычное приложение.

1. В обработчиках событий модулей объектов, наборов записей, форм и т.п., содержащих параметр Отказ (ПриЗаписи, ОбработкаПроверкиЗаполнения, ТоварыПередНачаломДобавления и т.п.), не следует присваивать этому параметру значение Ложь.
Это требование обусловлено тем, что, как правило, в коде обработчиков событий параметр Отказ может устанавливаться сразу в нескольких последовательных проверках (или в нескольких подписках на одно и то же событие). В таком случае к моменту выполнения очередной проверки параметр Отказ уже может заранее содержать значение Истина, и можно ошибочно сбросить его обратно в Ложь.
Кроме того, при доработках конфигурации на внедрении число этих проверок может увеличиться.

Неправильно:

 Процедура ОбработкаПроверкиЗаполнения(Отказ,  ПроверяемыеРеквизиты) 
  ... 
  Отказ = ЕстьОшибкиЗаполнения(); 
  ... 
 КонецПроцедуры 

Правильно:

 Процедура  ОбработкаПроверкиЗаполнения(Отказ,  ПроверяемыеРеквизиты) 
  . . . 
  Если ЕстьОшибкиЗаполнения() Тогда 
    Отказ = Истина;
  КонецЕсли; 
  ... 
 КонецПроцедуры 

или

Отказ = Отказ Или ЕстьОшибкиЗаполнения(); 

2. Эти же требования справедливы для других аналогичных параметров обработчиков событий: СтандартнаяОбработка, Выполнение и др.
Например:

 Процедура  ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка) 
 
  Если Параметры.Свойства(...) Тогда 
  СтандартнаяОбработка = Ложь; 
   ...
КонецЕсли; КонецПроцедуры

3. Неприемлемо в событиях объекта ПриЗаписи, ПередЗаписью, ПередУдалением, ОбработкаПроведения, ОбработкаПроверкиЗаполнения и т.п устанавливать параметр Отказ в значение Истина без информирования пользователя о причинах:

Неправильно:

Процедура ОбработкаПроведения(Отказ, РежимПроведения)


 
Если Не ТоваровНаСкладеДостаточно() Тогда
   Отказ = Истина;
  Возврат;
 КонецЕсли;


 ...


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

В таких случаях сообщение об ошибке не информативно и скрывает истинные причины проблемы, поэтому расследование ошибки требует значительных временных затрат: 

           Не удалось записать "Заказ покупателя"!

Следует согласно пп. 1.1 и 1.3 стандарта Информирование пользователя корректно уведомить пользователя о причинах отказа с помощью сообщения или вызова исключения.

Правильно:

Процедура ОбработкаПроведения(Отказ, РежимПроведения)

 Если Не ТоваровНаСкладеДостаточно() Тогда
  
  ТекстСообщения = СтрШаблон(НСтр("ru='Не хватает %1 %2 товара %3, на складе %4'"), Количество, ЕдиницаИзмерения, Товар, Склад);
  ОбщегоНазначения.СообщитьПользователю(ТекстСообщения,, "Объект.Товары",, Отказ);
  
 КонецЕсли;
 
...

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

См. также