В данной статье описываю кратко часть статей стандарта для использования в работе. Думаю, что эта информация поможет познакомиться со стандартами впервые или вспомнить отдельные пункты.
В третьей части цикла статей освещаются вопросы, касающихся конкретных обработчиков событий.
Обработчик события ПередЗаписью #std464
1. В данном обработчике модуля объекта, как правило, должны выполняться действия, связанные с заполнением значений реквизитов объекта (набора записей, значения константы), проверки правильности их заполнения, связанности состояния объекта с некоторыми внешними данными. Также в данном обработчике следует выполнять действия, связанные с обращением к «старым» значениям реквизитов объекта, сохраненным в базу данных (имеет смысл при редактировании уже записанных ранее объектов, наборов записей и т. п.).
2. Обработчик ПередЗаписью выполняется в транзакции. В общем случае все проверки должны выполняться в обработчике ОбработкаПроверкиЗаполнения (выполняется вне транзакции), чтобы не удлинять транзакцию.
Основной критерий размещения проверки именно в обработчике ПередЗаписью — критичность для связанности данных в системе и возможность программной записи объекта. Так как ОбработкаПроверкиЗаполнения не вызывается автоматически при программной записи объекта, то другой разработчик может пропустить эту проверку.
3. Для работы с предыдущими значениями реквизитов объекта можно использовать следующий код:
СтарыеЗначенияРеквизитов = ОбщегоНазначения.ЗначениеРеквизитовОбъекта(Ссылка, «Наименование, Код»);
Если Наименование <> СтарыеЗначенияРеквизитов.Наименование
Или Код <> СтарыеЗначенияРеквизитов.Код Тогда
// Необходимые действия
КонецЕсли;
4. Все действия в процедуре-обработчике события ПередЗаписью должны выполняться после проверки на ОбменДанными.Загрузка.
Обусловлено это тем, что при создании объекта механизмами обмена объекты должны быть корректно заполнены именно механизмами обмена, и все дополнительные проверки должны быть пропущены, чтобы не замедлять обмен.
Пример:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
// Предпроверки и дозаполнение реквизитов объекта
. . .
КонецПроцедуры
Обработчик события ПриЗаписи #std465
1. В данном обработчике модуля объекта (набора записей, значения константы), как правило, выполняются действия по записи, связанной с объектом данных в других объектах конфигурации, а также выполняются другие действия, связанные с изменением объекта.
Запрещается в данном обработчике изменять содержимое записываемого объекта, поскольку на момент выполнения обработчика объект уже записан в БД.
2. Все действия в процедуре-обрабочике события ПриЗаписи должны выполняться после проверки на ОбменДанными.Загрузка.
Обработчик события ОбработкаПроверкиЗаполнения #std463
1. В данном обработчике модуля объекта выполняются действия, связанные с проверкой правильности заполнения значений реквизитов объектов.
2. Данным обработчиком следует пользоваться в случаях, когда для проверки корректности значений реквизитов обычной проверки на заполненность уже недостаточно (например, значение реквизита логически связано со значением другого реквизита) или же требование к тому, чтобы значение реквизита было заполнено, не является безусловным.
Если проверка заполнения какого-либо реквизита условная (т. е. зависит от значений других реквизитов или значения параметризированной функциональной опции), в обработчике следует переопределить массив ПроверяемыеРеквизиты, если требуется удалить реквизит, выполнить это методами БСП.
При этом не рекомендуется использовать другие схемы проверки заполнения значений реквизитов, так как они затрудняют анализ логики работы конфигурации, поскольку скрывают из свойства «Проверка заполнения» случаи условной проверки заполнения значений объектов.
3. Следует учитывать, что обработчик ОбработкаПроверкиЗаполнения вызывается не при каждой записи объекта, в частности, он не вызывается в случаях, если запись была инициирована программно.
4. В случае использования в конфигурации подсистемы «Обмен данными» «Библиотеки стандартных подсистем» обработчик ОбработкаПроверкиЗаполнения вызывается при проведении документов после их загрузки из сообщения обмена. Для отключения некоторых проверок в этом режиме в обработчике можно анализировать дополнительное свойство объекта ДополнительныеСвойства.ОтложенноеПроведение.
Проверки, выполняемые в и вне транзакции записи объектах
1. Проверки в обработчике ОбработкаПроверкиЗаполнения выполняются вне транзакции записи объекта. Поскольку в случае некорректного заполнения объекта выполнение операции будет прервано ещё до записи объекта в базу данных, то размещение проверок в этом обработчике является наиболее эффективным.
При выполнении внетранзакционных проверок в этом обработчике необходимо учитывать тот факт, что новое состояние объекта еще не записано. Если требуется выполнить запрос к тем или иным данным системы, например, прочитать признак ВидНоменклатуры для товаров, выбранных в табличной части документа, «отталкиваясь» от данных документа, то такую поверку можно выполнить, применяя сохранение необходимых для запроса данных во временные таблицы.
2. В то же время в этом обработчике не следует размещать проверки, которые должны гарантировать целостное состояние объекта или зависящих от него данных (например, движений) на которые рассчитывает система. Поэтому для реквизитов, некорректные значения которых могут привести к рассогласованности данных в информационной базе, проверку корректности следует выполнять в обработчиках событий, возникающих в транзакции записи — ПередЗаписью, ПриЗаписи, ОбработкаПроведения (для документов).
Для транзакционных проверок, в свою очередь, выделяются два случая:
1. Проверка состояния движений, формируемых документами оперативного учета. Такие проверки довольно часто встречаются в приложениях с оперативным учетом.
2. Проверка состояния других объектов информационной базы, ссылки на которых содержатся в текущем объекте. Такие проверки следует применять очень редко. Не следует злоупотреблять количеством проверок в транзакции записи объекта. Следует помнить, что внутри транзакции записи имеет смысл выполнять только проверки таких ресурсов или таких правил соответствия объектов друг другу, которые не изменяются без проверок всеми участниками процесса.
Обработчик события ОбработкаЗаполнения #std396
1. В случае если в силу каких-либо условий необходимо ограничивать ввод на основании по команде «Создать на основании», то такую проверку следует выполнять в обработчике ОбработкаЗаполнения модуля объекта (набора записей). Например, это могут быть проверки вида:
— для команды «Создать на основании» не различимы группы и элементы справочников и планов видов характеристик: команда одинаково доступна в форме списка как для групп, так и для элементов,
— требуется запретить ввод на основании групп,
— требуется запретить ввод на основании непроведенных документов.
2. Для оповещения пользователя о причинах отказа в этом обработчике следует использовать исключения (ВызватьИсключение<Выражение>). Причина использования исключения, а не сообщения, если вызов идёт программно, то сообщение не будет выведено.
При этом не рекомендуются какие-либо иные решения для подобных проверок. В частности, не следует создавать дополнительные команды для ввода на основании и размещать проверки в обработчиках этих команд.
3. Рекомендуется придерживаться следующей логической структуры обработчика ОбработкаЗаполнения (отдельные шаги могут быть пропущены):
3.1. Выполнение специального заполнения в зависимости от типа параметра ДанныеЗаполнения.
Например:
ТипДанныхЗаполнения = ТипЗнч(ДанныеЗаполнения);
Если ТипДанныхЗаполнения = Тип("Структура") Тогда
ЗаполнитьДокументПоОтбору(ДанныеЗаполнения);
ИначеЕсли ТипДанныхЗаполнения = Тип("ДокументСсылка.ЗаказКлиента") Тогда
ЗаполнитьДокументНаОснованииЗаказаКлиента(ДанныеЗаполнения);
// ...
3.2. Выполнение общего заполнения с целью заполнить значениями по умолчанию реквизиты, которые не были заполнены специальным заполнением. При этом необходимо предварительно проверять реквизит на заполненность.
Например:
Если Не ЗначениеЗаполнено(Подразделение) Тогда
Подразделение = ЗначениеНастроекПовтИсп.ПодразделениеПоУмолчанию();
КонецЕсли;
Также при заполнении реквизитов значениями по умолчанию следует по возможности использовать свойство метаданных «Значение заполнения». Значение, указанное в этом свойстве, будет автоматически присваиваться реквизиту при выходе из обработчика ОбработкаЗаполнения, в случае если параметр СтандартнаяОбработка установлен в Истина и реквизит не был заполнен в обработчике.
Выполнение данной рекомендации позволит уменьшить количество логических ошибок заполнения и повысит читаемость кода.
Работа с параметром «Отказ» в обработчиках событий #std686
1. В обработчиках событий модулей объектов, наборов записей, форм и т.п., содержащих параметр Отказ (ПриЗаписи, ОбработкаПроверкиЗаполнения, ТоварыПередНачаломДобавления и т.п.), не следует присваивать этому параметру значение Ложь.
Это требование обусловлено тем, что, как правило, в коде обработчиков событий параметр Отказ может устанавливаться сразу в нескольких последовательных проверках (или в нескольких подписках на одно и то же событие). В таком случае к моменту выполнения очередной проверки параметр Отказ уже может заранее содержать значение Истина, и можно ошибочно сбросить его обратно в Ложь.
Кроме того, при доработках конфигурации на внедрении число этих проверок может увеличиться.
Неправильно:
Отказ = ЕстьОшибкиЗаполнения();
Правильно:
Если ЕстьОшибкиЗаполнения() Тогда
Отказ = Истина;
КонецЕсли;
Или:
Отказ = Отказ Или ЕстьОшибкиЗаполнения();
2. Эти же требования справедливы для других аналогичных параметров обработчиков событий: СтандартнаяОбработка, Выполнение и др.
Например:
СтандартнаяОбработка = Ложь;
3. Неприемлемо в событиях объекта ПриЗаписи, ПередЗаписью, ПередУдалением, ОбработкаПроведения, ОбработкаПроверкиЗаполнения и т.п устанавливать параметр Отказ в значении Истина без информирования пользователя о причинах.
Неправильно:
Если Не ТоваровНаСкладеДостаточно() Тогда
Отказ = Истина;
Возврат;
КонецЕсли;
В таких случаях сообщение об ошибке не информативно и скрывает истинные причины проблемы, поэтому расследование ошибки требует значительных временных затрат:
Не удалось записать "Заказ покупателя"!
Следует, согласно п.п. 1.1 и 1.3 стандарта Информирование пользователя (#std400), корректно уведомить пользователя о причинах отказа с помощью сообщения или вызова исключения.
Правильно:
Если Не ТоваровНаСкладеДостаточно() Тогда
ТекстСообщения = СтрШаблон(НСтр("ru='Не хватает %1 %2 товара %3, на складе %4'"), Количество, ЕдиницаИзмерения, Товар, Склад);
ОбщегоНазначения.СообщитьПользователю(ТекстСообщения,, "Объект.Товары",, Отказ);
КонецЕсли;
Все комментарии
Чтобы оставить комментарий, необходимо войти или зарегистрироваться.
Пока нет комментариев. Будьте первым!