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