§ 7.5. Своя команда формы: «Обновить цены»

Цены товаров в «Канцтоварах» живут не в карточке, а в регистре «ЦеныТоваров»: их меняет приказ об изменении цен. Кладовщику, который смотрит на карточку, пригодилось бы действие «подтянуть последние цены этого товара». Ни платформа, ни объект такого действия не знают, — значит, это работа для третьего источника: команды, заведённой прямо в форме. Заведём её и доведём до кнопки, а код оставим пустым.

1. Четыре шага от замысла до кнопки

Своя команда появляется в форме за четыре шага, и каждый ложится на одно из свойств, которые мы уже разбирали.

шаггдечто задаём
завестисписок команд формы, закладка собственных командновая строка
назватьсвойства командыимя и заголовок
связать с процедуройсвойство «действие»обработчик-заглушка
предложитьструктура элементовкнопка в командной панели

Первые три шага описывают действие, четвёртый его предлагает. Команда без четвёртого шага уже есть — строкой в списке собственных команд формы, — просто кнопкой её пользователю не показали. Начнём с того, как её назвать.

2. Имя для платформы, заголовок для человека

У новой команды два имени, и они служат разным читателям.

свойствозначениекто читает
имяОбновитьЦеныплатформа и код
заголовокОбновить ценыпользователь, на кнопке

Имя пишут слитно, без пробелов, как всё, что читает платформа. Заголовок — обычными словами: его увидит кладовщик. Если заголовок оставить пустым, на кнопке окажется что-то собранное из имени, — лучше не полагаться на это и написать его самим.

3. Действие и пустой обработчик

Третий шаг — связать команду с процедурой. В свойстве «действие» есть кнопка создания обработчика: редактор сам заведёт в модуле формы процедуру и запишет её имя в это свойство.

Перед тем как создать процедуру, редактор спросит, где ей работать. Документация редактора перечисляет три варианта: создать на клиенте; на клиенте и процедуру на сервере; на клиенте и процедуру на сервере без контекста. Все три начинаются с клиента. Это прямое следствие принципа клиента и сервера: кнопку нажимают у пользователя, значит, и обработчик команды начинает работу там же. Выбираем первый, самый простой вариант, — почему бывают другие, расскажет книга о коде.

что сделал редакторгде это видно
завёл процедурумодуль формы, открылся сам
вписал её имя в командусвойство «действие»
тело процедурыпустое

Команда хранит только имя процедуры — в свойстве «действие». Сама процедура живёт отдельно, в модуле формы. Удалите процедуру — команда и её кнопки останутся, а свойство будет указывать на имя, которого в модуле больше нет: нажимать есть что, а вызывать нечего.

Здесь мы останавливаемся: процедура остаётся пустой. Что в неё написать, чтобы цены действительно подтянулись из регистра, — это язык 1С, и он за рамками разговора о чтении форм. Нам важно другое: связь «команда — процедура» появилась, и её видно в свойствах команды без единой строки кода.

Команда знает имя процедуры, которую надо позвать. Что процедура сделает, не знает ни команда, ни форма: это дело кода.

Строже: в свойстве «действие» записано имя процедуры модуля формы, а её содержимое в структуру формы не входит.

4. Кнопка и первое нажатие

Остался четвёртый шаг: перетащить команду из списка в командную панель формы. Появится кнопка «Обновить цены» — тем же жестом, каким мы ставили вторую «Записать».

Теперь нажмите её в Предприятии. Ничего не произойдёт — и это правильно. Платформа нашла команду, вызвала процедуру из свойства «действие», процедура выполнилась — и ничего не сделала, потому что пуста. Это ровно тот случай, который мы разбирали как правило чтения: кнопка нажимается, а ничего не происходит, — значит, смотреть надо в команду: связана ли кнопка с той командой, задано ли у команды действие и есть ли что-нибудь в её процедуре.

5. Флажок, который работает без кода

У команды есть свойство, которое меняет поведение формы, не требуя ни строки в обработчике, — «Изменяет сохраняемые данные». Документация говорит, что вызов такой команды ставит форме признак изменённости: после нажатия форма ведёт себя так, будто пользователь правил поле, и при закрытии предложит записать.

значениечто будет после нажатия
выключеноформа считает себя нетронутой, закрывается молча
включеноформа считает себя изменённой и при закрытии спросит, записать ли

Для «Обновить цены» флажок честнее оставить выключенным: карточку товара команда не меняет, цены живут в регистре. Но опыт с ним поучителен: форма ведёт себя по-разному от одного свойства — это та же декларативность, что всюду в книге.

6. Своя команда в чужой форме

С этой стороны команды формы — самое интересное, что есть в чужой форме: стандартные команды одинаковы везде, а собственные рассказывают, зачем эту форму делали.

что видночто это значит
собственные команды естьформу открывают ради действий, которых нет у платформы
у команды пустое действиекнопка ничего не сделает — недоделка
действие есть, процедура пустазадумано, но не написано
команда без кнопки — ни в панели, ни в менюдействие заготовлено или вызывается кодом

Две последние строки встречаются в живых конфигурациях чаще, чем хотелось бы. Отличить их от рабочих команд можно, не читая кода целиком: достаточно открыть процедуру и увидеть, есть ли в ней что-нибудь.

7. В Конфигураторе и в Предприятии

Заведём команду «Обновить цены» и доведём её до кнопки.

  1. Откройте форму элемента «Товаров» и её список собственных команд. Добавьте команду.
Здесь будет снимок экраназакладка «Команды формы» редактора формы «Товаров» с новой командой «ОбновитьЦены»
  1. В свойствах команды задайте имя «ОбновитьЦены» и заголовок «Обновить цены».

  2. В свойстве «действие» создайте обработчик, выбрав первый вариант «на клиенте». Посмотрите на модуль формы: там появилась пустая процедура. Ничего в неё не пишите и закройте модуль.

  3. Перетащите команду в командную панель формы.

  4. Обновите конфигурацию, откройте карточку товара и нажмите «Обновить цены»: ничего не происходит.

  5. Включите у команды свойство «Изменяет сохраняемые данные», обновите конфигурацию, нажмите кнопку и закройте карточку: форма спросит, записать ли. Ответьте «нет» и выключите свойство обратно.

Команду «Обновить цены» и её кнопку в карточке товара оставьте: они пригодятся дальше, а код для них — дело языка 1С.

Главное в одном абзаце

Когда нужного действия не знают ни платформа, ни объект, его заводят командой формы — за четыре шага: завести строку в списке собственных команд, дать имя для платформы и заголовок для человека, связать с процедурой через свойство «действие» и предложить кнопкой в панели. Процедуру создаёт редактор, спросив, где ей работать; все варианты начинаются «на клиенте», потому что кнопку нажимают у пользователя. Процедура остаётся пустой: что в неё написать — предмет книги о коде, а для чтения формы важна сама связь команды с процедурой, видная в свойствах. Пустая процедура — причина того, что кнопка нажимается без результата. Одно свойство команды работает и без кода: если она изменяет сохраняемые данные, форма после нажатия считает себя изменённой. В чужой форме собственные команды читают первыми: они говорят, зачем форму делали, а пустые процедуры и команды без кнопок показывают, что недописано.


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

Контрольные вопросы

  1. Когда действие заводят командой формы, а не командой объекта?
  2. Назовите четыре шага от замысла до кнопки.
  3. Чем имя команды отличается от заголовка и кто их читает?
  4. Что делает редактор, когда создаёт обработчик из свойства «действие»?
  5. Почему все варианты создания обработчика команды начинаются «на клиенте»?
  6. Почему кнопка «Обновить цены» ничего не делает и где это видно?
  7. Какое свойство команды меняет поведение формы без единой строки кода?

Упражнения

По образцу. В форме документа «Поступление товаров» заведите команду «ЗаполнитьПоЗаказу» с заголовком «Заполнить по заказу», создайте ей пустой обработчик и поставьте кнопку в панель таблицы товаров. Проверьте и удалите команду вместе с кнопкой.

Своё: назовите команды. Придумайте две команды для карточки контрагента. Для каждой запишите имя, заголовок и скажите, будет ли она изменять сохраняемые данные.

Ловушка: «удалил процедуру — команда пропала». Разработчик удалил из модуля формы процедуру «ОбновитьЦены» и уверен, что команды больше нет. Что стало с командой и кнопкой?

Обратный ход. В чужой форме кнопка «Пересчитать скидки» после нажатия делает форму изменённой, хотя видимых изменений в полях нет. Что может быть тому причиной?

На чтение. В чужой форме пять собственных команд, у двух из них пустые процедуры, у одной нет кнопки. Что вы скажете о состоянии этой формы?

Ответы — в конце части.