воскресенье, 25 июля 2010 г.

Обработка проверки заполнения константы. Контекст превыше всего!

Сегодня речь пойдет о "модуле менеджера значения" у объекта "константа". Зачем нужен этот модуль и как его применять? Конечно, в нем можно описать произвольную экспортную процедуру или функцию и вызывать ее из любого места вашей конфигурации, получив предварительно модуль менеджера значения вашей константы. Вызов может выглядеть, например, так:

Константы.<ИмяВашейКонстанты>.СоздатьМенеджерЗначения().<ИмяВашейПроцедуры>();

Но это не главное свойство этого модуля. Его самая приятная особенность в том, что в нем могуть быть описаны такие события, как:
  • ОбработкаПроверкиЗаполнения
  • ПриЗаписи
  • ПередЗаписью
(синтакс-помощник, раздел "Прикладные объекты/Константы/КонстантаМенеджерЗначения.<ИмяКонстанты>/События")

Рассмотрим событие "ОбработкаПроверкиЗаполнения". Это очень хорошее событие, чтобы убедиться в том, что константа заполнена правильно. Синтакс-помощник сообщает нам об этом событии следующее:
Вызывается расширением формы при необходимости проверки заполнения реквизитов при записи в форме, а также при выполнении метода ПроверитьЗаполнение.
Позволяет разработчику конфигурации самостоятельно реализовать проверку заполнения в обработчике события. При этом в обработчике можно полностью отказаться от системной обработки (очистив список проверяемых реквизитов), отказаться от проверки системой части реквизитов (выполнив проверку отдельных реквизитов особенным образом и исключив эти реквизиты из списка), а также добавить для проверки другие реквизиты, проверка которых не была указана.
И декларирует, что на вход функции-события передается два параметра:  <Отказ> и <ПроверяемыеРеквизиты>.
Не слишком понятное описание (как на мой взгляд) запутывающее смысл вот этим "список проверяемых реквизитов". О каком списке идет речь, если у нас одна константа? Непонятно. Очевидно, что раздел просто дублирует описание аналогичного события модуля объекта справочника, где список действительно имеется.
Однако, не будем отвлекаться. Как же проверить значение и где его (это самое значение) взять? (Если честно, я несколько поломал над этим голову, и мне кажется, что момент не вполне очевидный для начинающих). Параметром оно не передается, объекта как бы и нет...
И тут необходимо применить один из основных способов, заложенных в саму парадигму платформы 8.2:
Нужно понять в каком именно контексте вызывается событие.
Синтакс-помощник говорит нам, что событие вызывается в контексте этого самого объекта "КонстантаМенеджерЗначения.<Имя константы>", а значит, можно предположить, что свойства и методы объекта будут доступны. И действительно, следующий код прекрасно работает:

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

   
Сообщить(Значение);

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

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

Теперь вы можете добавить свой обработчик, который поможет проверить верно ли заполнено значение константы. Я, например, таким образом реализовал проверку на возможность изменения базовой валюты, которую нельзя менять, если в регистрах денег уже есть движения, а так же запретил константе "ВалютаПоУмолчанию" быть пустой.

Так же следует помнить, что событие "ОбработкаПроверкиЗаполнения" вызывается автоматически только при интерактивном изменении константы на форме констант. Для контроля программного изменения лучше использовать событие "ПередЗаписью", которое вызывается в обоих случаях.

Спасибо за внимание и хорошего вам кода!

Комментариев нет:

Отправить комментарий