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