§ 10.5. Где здесь код: события и обработчики
Книга обошлась без единой строки кода — и это не фокус: описание формы живёт в дереве, и прочитать его можно, не открывая модуль. А вот то, что делает код, по описанию не прочитаешь. Но в каждой форме есть места, куда код приходит, и мы их видели: пустые процедуры за командами. Пора назвать эти места и слова, которыми их зовут. Разбирать код мы не станем — но знать, где он живёт, входит в умение читать форму.
1. Три места, где форма оживает
Код не разлит по форме ровным слоем. Он приходит в заранее заданные точки.
| место | когда срабатывает |
|---|---|
| действие команды | пользователь вызвал команду |
| событие формы | форма создаётся, открывается, записывается, закрывается |
| событие элемента | человек поменял значение в поле, перешёл по строке |
Первое мы уже заводили сами: свойство «действие» у команды и пустая процедура, которую создал редактор. Два других — то же самое, только поводом служит не нажатие, а момент в жизни формы.
Форма описана правилами. Код отзывается на моменты, которые эти правила предусмотрели, — и работает по тем же правилам, даже когда что-то добавляет.
2. Событие и обработчик
Два слова, которые дальше встретятся на каждом шагу.
| слово | что значит |
|---|---|
| событие | момент, о котором платформа сообщает: форма открылась, поле изменилось |
| обработчик | процедура, которую платформа вызывает в этот момент |
У формы событий много, и названия у них говорящие. «Возникает на сервере при создании формы», «возникает на клиенте при открытии формы, до показа окна пользователю» — так описаны два самых частых. Рядом живут закрытие формы и проверка заполнения, а у поля — изменение значения.
3. Имена событий уже всё объясняют
Прочитайте названия внимательно — в них виден тот самый принцип клиента и сервера, с которым мы ходили всю книгу.
| событие | где происходит |
|---|---|
| при создании на сервере | на сервере: форма ещё собирается |
| при открытии | на клиенте: окно сейчас покажут человеку |
| при изменении поля | на клиенте: человек только что что-то ввёл |
| перед записью | на клиенте: до того, как данные уйдут на сервер |
Из этой же границы вырастают служебные пометки в модуле: перед именем процедуры стоит слово о том, где ей работать — «на клиенте» или «на сервере». Эти пометки и называют директивами компиляции. Они говорят, где процедуре работать. Разбирать их — дело книги о коде; нам довольно знать, что такие пометки есть и зачем они нужны.
4. Что в поведении формы объясняется кодом
Читая форму, полезно заранее знать, какие симптомы к коду и ведут.
| что видит пользователь | где искать |
|---|---|
| поле заполнилось само | сначала проверьте правила объекта, потом обработчик формы или поля |
| сумма пересчиталась при вводе количества | событие изменения поля |
| при закрытии появился вопрос о записи | обычное поведение платформы: форма считает себя изменённой |
| вопрос при закрытии нестандартный | обработчик закрытия: он может спросить своё или отменить закрытие |
| часть полей появилась не сразу | код, который меняет видимость |
| кнопка не делает ничего | процедура команды пуста |
Правило, которое мы вывели ещё в главе о командах, здесь получает общий вид: если что-то в форме происходит само, причин три — правило в дереве, встроенное поведение платформы или обработчик в модуле. Ищут в этом же порядке: первые две видны без кода.
5. Чего код не отменяет
Код может многое, но не всё — и границы эти для читателя важнее возможностей.
| что код может | чего не может |
|---|---|
| заполнить реквизит, пересчитать, спрятать поле | отменить связь поля с реквизитом |
| добавить элементы при открытии | отменить роли форм и состав подсистем |
| запретить закрытие, спросить подтверждение | записать то, чего нет в данных записи |
Код может добавлять элементы при открытии — вот почему в типовых формах встречаются элементы, которых нет в дереве. Но и такой элемент живёт по общим правилам: он лежит в группе, и если показывает данные, то через путь к ним, а если предлагает действие — через команду. Правила остаются, меняется только то, кто их применил — редактор или код.
6. Как читать форму с кодом, не читая кода
Список обработчиков — это карта мест, где форма оживает, и прочитать её можно, не открывая ни одной процедуры.
| что смотрим | что узнаём |
|---|---|
| у каких событий формы есть обработчики | что происходит при открытии и записи |
| у каких полей есть обработчики изменения | какие значения влияют на другие |
| есть ли обработчики у команд | какие действия написаны, а какие заготовлены |
| сколько обработчиков всего | насколько форма «живая» |
Последняя строка — грубая, но полезная мерка. Форма без обработчиков целиком описана правилами: прочитали дерево — знаете всё. Форма с двумя десятками обработчиков живёт своей жизнью, и без модуля в ней не разобраться.
7. В Конфигураторе
Посмотрим на места для кода в своих формах и в чужих.
- Откройте форму элемента «Товаров» и найдите в палитре свойств список событий формы. Обработчиков там нет: мы их не заводили.
-
Найдите у команды «Обновить цены» свойство действия и убедитесь, что процедура на месте и пуста.
-
Выделите поле артикула и посмотрите его события. Запишите, какие из них сработали бы, если бы человек поменял значение.
-
Откройте в демонстрационной базе типовой конфигурации форму документа и посмотрите тот же список событий. Посчитайте, у скольких есть обработчики.
-
Сравните две формы по последней мерке: насколько каждая «живая» и что из этого следует для чтения.
Главное в одном абзаце
Код приходит в форму не везде, а в заданные места: действие команды, события формы и события элементов. Событие — момент, о котором платформа сообщает; обработчик — процедура, которую она в этот момент вызывает. Имена событий сами объясняют клиент-серверную границу: создание формы происходит на сервере, открытие и изменение поля — на клиенте; рядом в модуле стоят директивы компиляции — пометки «на клиенте» и «на сервере», которые говорят, где процедуре работать. Эта книга их не разбирает — она показывает, где они живут. Поведение формы, которое «происходит само», объясняется одним из двух: правилом в дереве или обработчиком в модуле, и сначала ищут правило. Код не отменяет правил: он заполняет, пересчитывает, прячет и даже добавляет элементы, но связь поля с реквизитом, роли форм и состав подсистем остаются за описанием. А прочитать форму с кодом можно и не читая кода: список обработчиков показывает, где она оживает, и насколько она вообще «живая».
Место для кода названо. Но за этой границей лежит не одна тропа, а развилка, и у шагов есть разумная очередь. Какая?
Контрольные вопросы
- В какие три места в форме приходит код?
- Что такое событие и что такое обработчик?
- Как по имени события понять, где оно происходит?
- Что такое директивы компиляции и зачем о них знать читателю форм?
- Какие симптомы в поведении формы ведут к коду?
- Чего код не отменяет?
- Что можно узнать по списку обработчиков, не открывая процедуры?
Упражнения
По образцу. Выпишите для формы поступления все места, куда мог бы прийти код: команды, события формы, события полей.
Своё: предскажите обработчик. В форме выдачи велосипеда сумма залога должна зависеть от типа велосипеда. К какому событию и какого элемента привязали бы обработчик?
Ловушка: «само заполнилось — значит, магия». Пользователь говорит, что склад в документе подставляется сам. Какие два объяснения вы проверите и в каком порядке?
Обратный ход. В форме десять обработчиков, из них восемь — у событий полей. Что это говорит о форме?
На чтение. В чужой форме есть элемент, которого нет в дереве. Как он туда попал и подчиняется ли он общим правилам?
Ответы — в конце части.