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