Чтение форм 1С
Поверхность системы
Книга о том, как читать управляемую форму 1С: видеть, о чём программа разговаривает с пользователем, откуда на форме берётся каждое поле и что делает каждая кнопка, — и собирать свои формы, не написав ни строки кода.
Для кого
Для новичка без опыта программирования. Знакомство с деревом метаданных желательно, но не обязательно: вводная глава даёт минимальный обзор для тех, кто пришёл сразу сюда.
Место в серии
Третья книга линии «Чтение 1С»:
| книга | о чём |
|---|---|
| «1С как иностранный язык» | код |
| «Дерево метаданных 1С» | чертёж системы |
| «Чтение форм 1С» | поверхность системы — эта книга |
| «Чтение данных. Язык запросов 1С» | вопрос к данным |
Книги автономны и связаны сквозным примером — фирмой «Канцтовары».
Что понадобится
- Платформа 1С:Предприятие 8.3; книга сверяется на 8.3.27.
- База «Канцтовары»: та, что собрана по «Дереву метаданных», или готовая из поставки книги (поставка готовится).
Как устроена книга
Одиннадцать глав: от того, что видит пользователь, через устройство формы — данные, элементы, композицию, списки, команды — к командному интерфейсу, особым видам форм и чтению чужой формы из типовой конфигурации.
Каждый параграф заканчивается «Главным в одном абзаце», вопросами и упражнениями; ответы собраны в конце главы. Упражнения идут в Конфигураторе, в режиме Предприятия и на бумаге. Со второй главы каждую главу замыкает «Чужая форма»: одна и та же серия заранее собранных форм, которую каждая следующая глава разбирает глубже.
Состояние
Черновик: написаны два первых параграфа. Полный план — docs/00_plan_knigi.md.
Сборка
Ночная сборка выкладывает книгу в разделе Releases: EPUB, FB2, PDF, HTML, DOCX.
Лицензия
CC BY 4.0.
§ 0.1. Платформа в двух режимах: Конфигуратор и Предприятие
Эта книга учит читать интерфейс прикладной программы 1С: формы, поля, кнопки, команды, разделы — всё, что видит и трогает человек, который в программе работает. По описаниям интерфейс не прочитать, его нужно видеть, и видеть так, как видит пользователь, — изнутри работающей программы. Поэтому прежде, чем разбирать отдельную форму, мы запустим саму платформу 1С.
И сразу обнаруживается подробность, о которую спотыкается почти каждый новичок. Платформа устанавливается на компьютер как одна программа, а запускается двумя разными способами — в двух режимах. С них и начнём: чем они отличаются и зачем их два.
1. Платформа и прикладная программа
Говоря «1С», обычно имеют в виду готовую программу, в которой работает бухгалтер или кладовщик. Это правда, но не вся. То, что видно на экране, — не сама платформа, а прикладная программа, написанная для неё. Прикладные программы бывают типовые, выпущенные фирмой «1С» для множества предприятий, и самописные, собранные под одну фирму и её способ работать.
| что | примеры |
|---|---|
| платформа | 1С:Предприятие 8.3 |
| типовая прикладная программа | «Бухгалтерия предприятия», «Управление торговлей» |
| самописная прикладная программа | «Канцтовары» — пример, который пройдёт через всю книгу |
Платформа — исполнитель: она умеет хранить данные, строить окна, считать итоги, но что именно хранить, показывать и считать, задаёт прикладная программа. Устройство прикладной программы — какие в ней списки, документы, отчёты, формы и код — в 1С называют конфигурацией. Слово здесь стоит мимоходом: пока достаточно понимать его так — устройство программы, а подробнее о нём — в конце этой главы.
Платформа — исполнитель, прикладная программа — то, что она исполняет. Устройство программы называется конфигурацией.
Точнее говоря, исполняет она её в одном из двух режимов, о которых сейчас пойдёт речь; в другом — даёт средства эту программу менять.
Запустить исполнителя можно двумя способами. В одном видно устройство программы, в другом — её работа. Первый режим называется Конфигуратор, второй — 1С:Предприятие, или просто Предприятие.
2. Конфигуратор: где программа устраивается
В Конфигураторе прикладную программу создают и меняют. Здесь работает разработчик: заводит объекты, собирает формы, пишет код, настраивает права.
Открыв Конфигуратор, разработчик видит дерево конфигурации — перечень всего, из чего программа состоит, разложенный по веткам. Вот его верхушка для «Канцтоваров»:
Конфигурация «Канцтовары»
├── Общие
│ ├── Подсистемы
│ ├── Общие формы
│ └── …
├── Константы
├── Справочники
│ ├── ЕдиницыИзмерения
│ ├── Товары
│ ├── Контрагенты
│ └── Склады
├── Документы
│ ├── ПоступлениеТоваров
│ ├── РеализацияТоваров
│ └── ПриказОбИзмененииЦен
├── Отчёты
├── Регистры сведений
└── Регистры накопления
Обратите внимание, каких веток здесь нет: отдельных «Форм» и «Регистров». Дерево разложено по видам объектов — справочники один вид, документы другой, — а форма не отдельный вид, а часть объекта. Поэтому свои формы живут внутри своего справочника или документа, а в ветке «Общие» лежат только формы, общие для всей программы. У регистров свои ветки, по одной на вид.
Всё это чертёж программы, а не программа в работе: тот, кто сюда заходит, накладных не оформляет — он устраивает систему так, чтобы их мог оформлять кто-то другой.
Конфигуратор — режим, в котором программа устраивается.
Бытовое сравнение здесь прозрачное: Конфигуратор — служебный вход в здание, через который заходят строители и электрики. Они в этом здании не живут, они делают его пригодным для жизни. Бывает, что в оба входа ходит один и тот же человек, но назначение входов от этого не меняется. Строже: Конфигуратор — режим запуска платформы, в котором конфигурацию открывают и изменяют; товары и документы здесь не вводят.
3. Предприятие: где в программе работают
В Предприятии с программой работают её пользователи: бухгалтер заводит документы, кладовщик принимает товар, менеджер смотрит, что осталось на складе. Дерева конфигурации никто из них не видит. Они видят разделы, списки, карточки документов и отчёты с готовыми числами.
Предприятие — режим, в котором в программе работают.
Продолжая сравнение: Предприятие — парадный вход. Сюда заходят жильцы, и им неинтересно, как проложена проводка; им важно, чтобы свет зажигался от выключателя. Строже: Предприятие — режим запуска, в котором платформа исполняет конфигурацию и показывает пользователю интерфейс программы.
Два режима удобно поставить рядом:
| Конфигуратор | Предприятие | |
|---|---|---|
| кто работает | разработчик | пользователь |
| что видно | дерево конфигурации | разделы, списки, документы |
| что делают | меняют устройство | вводят и смотрят данные |
| отвечает на вопрос | как устроено | как работает |
4. Одна база — две двери
Конфигуратор и Предприятие — не два приложения, живущих каждое своей жизнью. Оба подключаются к одной и той же информационной базе. В ней хранится и устройство программы, и её данные: товары, документы, остатки на складе.
┌───────────────────────────┐
│ Информационная база │
│ конфигурация + данные │
└───────────────────────────┘
▲ ▲
┌───────┴──────┐ ┌───────┴──────┐
│ Конфигуратор │ │ Предприятие │
│ устройство │ │ работа │
└──────────────┘ └──────────────┘
разработчик пользователь
Стрелки показывают: оба режима смотрят в одну базу. Из Конфигуратора видно её устройство, из Предприятия — её работу. Отдельного мира, где разработчик трудится понарошку, нет: то, что он сделал, происходит с той самой базой, к которой он подключился. Потому на работе конфигурацию обычно правят в копии базы, а рабочую, где идёт учёт, обновляют отдельно и обдуманно.
Конфигуратор и Предприятие подключаются к одной информационной базе. Это два взгляда на одно и то же.
5. Как изменение доходит до пользователя
Раз база одна, изменение, сделанное в Конфигураторе, до пользователя дойдёт. Но не мгновенно и не само: пока разработчик правит конфигурацию, пользователи работают с прежней. Нужны два действия — обновить конфигурацию базы данных и перезапустить сеанс пользователя. По шагам это выглядит так.
| шаг | где | что происходит |
|---|---|---|
| 1 | Конфигуратор | разработчик добавил поле на форму товара |
| 2 | Конфигуратор | обновил конфигурацию базы данных |
| 3 | Предприятие | открытый сеанс ещё показывает прежнюю форму |
| 4 | Предприятие | после перезапуска поле на месте |
Второй шаг — отдельная команда Конфигуратора, «Обновить конфигурацию базы данных»: до неё изменения лежат в Конфигураторе и в работу не пошли. Третий — источник частого недоумения: разработчик уверен, что всё сделал, а пользователь поля не видит, потому что его программа запущена раньше, чем изменение вступило в силу.
Подробной механики обновления книга не разбирает, но из таблицы стоит унести главное: изменение делают, применяют к базе — и только потом его видит пользователь.
6. Смотреть снаружи
В книге мы много времени проведём в Конфигураторе — там, где формы устраиваются. Но почти каждый параграф будет заканчиваться открытием Предприятия и проверкой: как сделанное выглядит для человека, ради которого оно делается.
Правило не случайное. В редакторе всё кажется понятным, потому что мы сами это собирали и помним, что куда положили. Пользователь этого не помнит, он видит только то, что ему показали, — и его «понятно» или «непонятно» решает, годится ли форма.
Форму оценивают так, как её увидит пользователь, а не так, как она выглядит в редакторе.
Проверим это сразу: запустим «Канцтовары» и посмотрим, что видит пользователь, когда открывает программу.
7. В режиме Предприятия
Запустим «Канцтовары» в режиме Предприятия. Если вы собирали конфигурацию по «Дереву метаданных», база у вас уже есть. Если нет — возьмите готовую из поставки книги и распакуйте в любую папку.
Окно запуска выглядит примерно так:
┌─ Запуск 1С:Предприятия ───────────────┐
│ Информационные базы: │
│ ┌──────────────────┐ [1С:Предприятие] │
│ │ Канцтовары │ [Конфигуратор ] │
│ │ … │ [Добавить… ] │
│ └──────────────────┘ [Изменить… ] │
└───────────────────────────────────────┘
-
Запустите ярлык «1С:Предприятие». Откроется окно запуска со списком информационных баз.
-
Если «Канцтоваров» в списке нет, нажмите «Добавить…», выберите добавление в список существующей базы, задайте имя «Канцтовары» и укажите папку, куда распакована база.
-
Выделите «Канцтовары» в списке. Справа — кнопки режимов: «1С:Предприятие» и «Конфигуратор».
-
Нажмите «1С:Предприятие».
В базе из поставки пользователи не заведены, а при пустом списке пользователей платформа имени и пароля не спрашивает: программа откроется сразу.
Откроется программа «Канцтовары». Разбирать экран будем дальше, а сейчас окиньте его взглядом. Окно прикладной программы 1С обычно делится на несколько областей:
┌────────────────────────────────────────┐
│ заголовок, главное меню, поиск │
├────────────┬───────────────────────────┤
│ разделы │ рабочая область: │
│ программы │ начальная страница, │
│ │ открытые формы │
└────────────┴───────────────────────────┘
В «Канцтоварах» левая область почти пуста: разделов пока не задано — их задаёт разработчик, и мы займёмся этим ближе к концу книги. Поэтому платформа собирает всё, что в программе есть, — списки товаров, контрагентов, складов, документы, отчёт — в один общий перечень. Если его на экране не видно, откройте главное меню: в нём есть пункт «Все функции», где перечислено всё. В типовой программе разделов десяток — «Закупки», «Продажи», «Склад», — и каждый собирает свою часть этого перечня.
Окно Предприятия оставьте открытым: оно понадобится в следующем параграфе.
Главное в одном абзаце
Платформа 1С устанавливается как одна программа, а запускается в двух режимах. В Конфигураторе прикладную программу устраивают: разработчик видит дерево конфигурации — справочники, документы, отчёты, формы, код. В Предприятии в программе работают: пользователь видит разделы, списки, документы и отчёты, а устройство от него скрыто. Оба режима подключаются к одной информационной базе, где лежат и конфигурация, и данные, поэтому сделанное в Конфигураторе доходит до пользователя по-настоящему — после того как разработчик обновит конфигурацию базы данных, а пользователь перезапустит программу. Собирать формы мы будем в Конфигураторе, а проверять — в Предприятии, потому что там форма встречается с тем, ради кого сделана.
Окно Предприятия открыто: в нём списки, какие-то окна и кнопки. Всё это вместе называют интерфейсом пользователя. Но что именно в него входит — и что остаётся за ним, невидимым для пользователя?
Контрольные вопросы
- Какие два режима запуска есть у платформы 1С?
- В каком режиме работает разработчик, а в каком — бухгалтер или кладовщик?
- Что общего у Конфигуратора и Предприятия?
- Чем то, что видно в Конфигураторе, отличается от того, что видно в Предприятии?
- Разработчик добавил поле на форму товара. Что должно произойти, прежде чем пользователь это поле увидит?
- Почему результат настройки формы проверяют в Предприятии, а не в редакторе?
Упражнения
Первый взгляд. Запустите «Канцтовары» в режиме Предприятия и перечислите своими словами три-четыре вещи, которые видите на экране. Правильные термины не нужны — описывайте, как видите.
Вторая дверь. Закройте Предприятие и откройте ту же базу в Конфигураторе. Назовите три заметных отличия от того, что вы видели в Предприятии.
Схема по памяти. Нарисуйте схему «одна база — два режима», не заглядывая в параграф. Подпишите, кто пользуется каждым режимом и что он там видит.
Ловушка: поле, которого нет. Разработчик пишет: «Добавил на форму товара новое поле, проверяйте». Кладовщик отвечает: «Открыл товар — никакого нового поля». Разработчик уверен, что всё сделал, кладовщик — что его разыгрывают. Назовите две причины, по которым поля может быть не видно, хотя разработчик действительно его добавил.
По одной фразе. Определите режим по реплике. Бухгалтер: «Открыла программу, слева разделы: Закупки, Продажи, Зарплата». Стажёру велели: «Открой ветку „Документы" и найди там ПоступлениеТоваров». По какому признаку вы узнали режим в каждом случае?
Ответы — в конце части.
§ 0.2. Что такое интерфейс пользователя: всё, что видно и трогается
Слово «интерфейс» слышал каждый, кто хоть раз ругал неудобную программу. Употребляют его широко и не всегда точно: то про одну кнопку, то про всю программу разом. Раз это главный предмет книги, договоримся о нём твёрдо: что мы будем называть интерфейсом, где у него границы и почему смотреть мы будем именно сюда.
1. Интерфейс — место встречи
Интерфейс есть не только у программ, а у любого устройства, с которым человек имеет дело. Сравним три знакомых.
| устройство | человек сообщает | устройство отвечает |
|---|---|---|
| автомобиль | рулём, педалями | стрелками приборов, звуком |
| микроволновка | ручкой времени, кнопками | цифрами на табло, звонком |
| банкомат | клавишами, картой | экраном, купюрами, чеком |
Общее у всех трёх одно: это место встречи человека и системы. Через него человек сообщает, чего хочет, а система отвечает — цифрами, светом, звуком, движением. Обходного пути у пользователя обычно нет: он не лезет под капот и не разбирает банкомат, он работает с тем, что ему выставили наружу.
Интерфейс — это всё, через что человек общается с системой.
Строже: интерфейс — граница системы, через которую она принимает действия человека и показывает ему результат. Формулировка широкая, но точная: она годится и для микроволновки, и для прикладной программы 1С.
2. Что входит в интерфейс программы
У программы интерфейс — всё, что показано на экране, и всё, через что программой управляют. Для «Канцтоваров» это выглядит так.
| часть | зачем | в «Канцтоварах» |
|---|---|---|
| разделы | главы в оглавлении программы | не заданы: их добавит разработчик |
| списки | много однотипных записей | список товаров |
| карточки | одна запись целиком | карточка поступления |
| поля | показать или принять значение | «Артикул» у товара |
| кнопки | запустить действие | «Записать», «Провести и закрыть» |
| сообщения и вопросы | предупредить, переспросить | вопрос о несохранённых изменениях |
Перечень не полный, но масштаб по нему виден: интерфейс — не одна кнопка и не одно окно, а вся видимая и доступная для действия поверхность программы.
Интерфейс программы — набор окон, элементов и команд, через которые она принимает действия пользователя и показывает результат.
«Видно и трогается» — короткая память об этом. Строго говоря, часть интерфейса не видна: горячие клавиши, звуковой сигнал, подсказка, которую читает вслух программа для незрячих. Поэтому точнее говорить о поверхности, доступной для восприятия и действия.
Окна, элементы и команды — как раз те части, на которые мы потом будем разбирать каждое такое окно, так что строгая формулировка ещё поработает. А на первое время хватит короткой: интерфейс — всё, что видно и трогается.
3. Интерфейс — поверхность
У интерфейса есть глубина, в которой его самого нет. Под окнами «Канцтоваров» лежат данные — товары, документы, остатки, — правила, по которым программа считает и проверяет, код, написанный разработчиком, и устройство объектов, описанное в дереве конфигурации. Пользователь всего этого прямо не видит; видит он то, во что оно превращается на поверхности.
пользователь
│ видит и трогает
▼
┌──────────────────────────┐
│ интерфейс: формы, │ ← эта книга
│ кнопки, разделы, отчёты │
└──────────────────────────┘
│ опирается на
▼
┌──────────────────────────┐
│ данные и логика: база, │ ← другие книги
│ код, дерево конфигурации │ серии
└──────────────────────────┘
Проверить себя удобно на трёх вещах с экрана «Канцтоваров»:
| на поверхности | под ней |
|---|---|
| поле «Количество» в поступлении | реквизит строки документа, число в базе |
| кнопка «Провести и закрыть» | свойство документа «Проведение» и код, который делает записи в регистре |
| строка отчёта «Бумага А4 — 200» | записи регистра остатков |
Интерфейс — поверхность системы. Под ним всегда есть данные и логика.
Эта книга — о поверхности. Не потому, что глубина не важна: глубиной заняты другие книги серии, о коде и о дереве объектов. Задача этой — научиться читать поверхность так, чтобы за каждым полем и каждой кнопкой видеть, откуда они взялись.
4. В режиме Предприятия: разные лица одной программы
«Канцтовары» — не одно окно с одним набором кнопок, а много окон, и устроены они по-разному. Чтобы это увидеть, откроем четыре окна и сравним.
-
Найдите в общем перечне команд список товаров и откройте его. Это таблица: строки — товары, колонки — несколько коротких сведений о каждом.
-
Дважды щёлкните по строке «Ручка шариковая». Откроется карточка одного товара — уже не таблица, а несколько отдельных полей.
┌─ Ручка шариковая (Товары) ─────────────┐
│ [Записать и закрыть] [Записать] Ещё │
│ │
│ Код: [000000006 ] │
│ Наименование: [Ручка шариковая] │
│ Родитель: [Письменные…][…] │
│ Артикул: [РУЧ-01 ] │
│ Единица измерения: [шт ][…] │
└────────────────────────────────────────┘
Поле «Родитель» показывает группу, в которой лежит товар: справочник «Товары» иерархический, и ручка лежит в группе «Письменные принадлежности».
- Откройте список документов «Поступление товаров», а в нём — поступление № 12 от 15 марта. Сверху — отдельные поля: номер, дата, поставщик, склад; ниже — таблица товаров с количеством и ценой.
┌─ Поступление товаров 0000000012 ──────┐
│ [Провести и закрыть] [Записать] Ещё │
│ │
│ Номер: [0000000012] от: [15.03.2026] │
│ Контрагент: [Канцелярия Плюс ][…] │
│ Склад: [Основной ][…] │
│ │
│ ┌─────────────────┬──────┬──────┐ │
│ │ Товар │ Кол. │ Цена │ │
│ ├─────────────────┼──────┼──────┤ │
│ │ Бумага А4 │ 500 │ 250 │ │
│ │ Ручка шариковая │ 400 │ 20 │ │
│ │ Папка-регистра… │ 150 │ 90 │ │
│ └─────────────────┴──────┴──────┘ │
└───────────────────────────────────────┘
-
Откройте отчёт об остатках товаров на складе и нажмите «Сформировать». Сверху — настройки, снизу появится результат.
| Склад | Товар | Количество |
|---|---|---|
| Основной | Бумага А4 | 200 |
| Основной | Ручка шариковая | 300 |
| Основной | Папка-регистратор | 100 |
| Дополнительный | Бумага А4 | 200 |
| Дополнительный | Ручка гелевая | 240 |
Теперь сравним четыре окна.
| окно | как устроено | на какой вопрос отвечает |
|---|---|---|
| список товаров | таблица строк | какие товары у нас бывают |
| карточка товара | отдельные поля | каков этот товар |
| карточка поступления | поля и таблица | что произошло: пришла партия |
| отчёт | настройки и результат | сколько товара на складах |
Первые два окна принадлежат одному справочнику «Товары» — и всё же это разные окна: список показывает много товаров сразу, карточка — один целиком. Окна различаются не прихотью того, кто их делал, а тем, что отвечают на разные вопросы: в «Канцтоварах» их вообще никто не рисовал вручную, и всё же платформа построила список и карточку по-разному.
Разные окна программы устроены по-разному, потому что отвечают на разные вопросы. Даже у одного справочника окон несколько.
Каждое такое окно — список, карточка, отчёт — называется формой. Это главное слово книги, и следующий параграф займётся им всерьёз.
Главное в одном абзаце
Интерфейс пользователя — всё, через что человек общается с системой: у автомобиля это руль и приборы, у программы — разделы, списки, карточки, поля, кнопки, сообщения. В прикладной программе 1С интерфейс виден в режиме Предприятия и складывается из множества окон, устроенных по-разному: список товаров — таблица, карточка товара — отдельные поля, карточка поступления — поля и таблица, отчёт — настройки и результат. Устроены они по-разному потому, что отвечают на разные вопросы, и даже у одного справочника окон несколько. Под интерфейсом всегда лежат данные и логика — база, правила, код, дерево конфигурации, — а сам интерфейс есть поверхность, через которую к ним подходят. Эта книга — о поверхности, и каждое отдельное окно на ней называется формой.
Окон много, и все они разные. Но что делает окно формой — и о чём, собственно, каждая форма говорит с пользователем?
Контрольные вопросы
- Что такое интерфейс в широком смысле? Приведите пример не из мира программ.
- Назовите не меньше пяти частей, из которых складывается интерфейс программы 1С.
- В каком режиме платформы виден интерфейс прикладной программы?
- Список товаров и карточка товара принадлежат одному справочнику. Почему окна всё же разные?
- Что лежит «под» интерфейсом?
- Что шире — интерфейс или форма? Почему?
Упражнения
Четыре окна. Откройте в Предприятии список товаров, карточку товара, карточку поступления и отчёт об остатках. Для каждого окна двумя-тремя предложениями опишите, как оно устроено и на какой вопрос отвечает.
Своё устройство. Выберите бытовое устройство, которого не было в параграфе, — лифт, стиральную машину, кофейный автомат. Составьте для него такую же таблицу: чем человек сообщает, чем устройство отвечает, что скрыто под поверхностью.
Ловушка: «программа меня не понимает». Пользователь жалуется: «Нажимаю кнопку — ничего не происходит». Где может быть причина — на поверхности, под ней или в обоих местах? Приведите по примеру для каждого случая.
Где это живёт. Программист говорит: «Здесь мы переводим число в строку и приписываем знак рубля». О поверхности он говорит или о том, что под ней? А если бы он сказал: «Сумму на форме покажем с двумя знаками после запятой»?
Окно не из четырёх. Найдите в «Канцтоварах» окно, которое не похоже ни на список, ни на карточку, ни на отчёт. Опишите его и предположите, для чего оно нужно. Ищите там, где программа что-то у вас спрашивает: например, при выборе значения в поле кнопкой «…».
Ответы — в конце части.
§ 0.3. Форма как единица интерфейса: разговор о чём-то одном
Одно имя досталось сразу четырём непохожим окнам: таблице товаров, карточке ручки, карточке поступления с таблицей внизу, окну отчёта с настройками. Все они — формы. Общее имя для таких разных вещей выглядит натяжкой, пока не увидишь, что у них и правда общего. Что же делает окно формой?
Ответ, на котором держится вся книга, простой: почти каждое такое окно говорит с пользователем о чём-то одном. «Почти» — не оговорка для порядка: у этого правила есть граница, и в конце параграфа мы до неё дойдём.
1. Одно окно — один предмет
Вернёмся к четырём окнам и спросим о каждом не «как оно устроено», а «о чём оно».
| окно | о чём оно |
|---|---|
| карточка товара | об одном товаре — «Ручка шариковая» |
| карточка поступления | об одном документе — поступление № 12 |
| список товаров | о справочнике «Товары» целиком |
| отчёт об остатках | об одном вопросе — сколько товара на складах |
Предметы разные: товар, документ, справочник, вопрос. Но у каждого окна он один. Карточка ручки не рассказывает заодно о бумаге, карточка поступления № 12 — о поступлении № 13, а список товаров не превращается по ходу дела в список контрагентов. Всё, что есть в окне, — поля, таблицы, кнопки — служит одному предмету.
Это удобно представить как разговор. Программа обращается к пользователю репликой: «вот товар — ручка шариковая, вот её артикул, вот единица; хотите — поправьте и запишите». Реплика может быть длинной, но она об одном.
Форма — это разговор системы с пользователем по поводу одного объекта.
Слово «объект» здесь стоит в широком смысле: это то, на чём сосредоточен разговор, — один товар, один документ, справочник как целое или вопрос, на который отвечает отчёт. Одно — не значит «одна запись»: список говорит о многих товарах, но об одном справочнике.
2. Строже: форма в дереве конфигурации
Образ разговора помогает удержать главное, но в Конфигураторе нет ветки «Разговоры». Что там есть на самом деле, удобно записать тремя строками:
образ форма — реплика системы
об одном предмете
строго объект конфигурации, который
описывает одно окно
где ветка «Формы» внутри объекта
или «Общие формы» в «Общих»
Строго говоря, форма — объект конфигурации, который описывает одно окно прикладной программы: из каких частей оно состоит, что показывает и что позволяет сделать. Такую форму задаёт разработчик, и живёт она рядом со своим предметом. Формы товара — внутри справочника «Товары», в его собственной ветке:
Справочники
└── Товары
├── Реквизиты
│ ├── Артикул
│ └── ЕдиницаИзмерения
├── Табличные части
├── Формы ← формы товара
├── Команды
└── Макеты
Если форму решили сделать общей для многих объектов, она лежит в ветке «Общие», среди общих форм. Правило выходит простым: где предмет разговора, там и заданные для него формы.
Здесь вас ждёт первая странность. Раскройте в «Канцтоварах» ветку «Формы» у товаров — она пуста. А карточка ручки в Предприятии открывалась, и список товаров тоже. Окно есть, а формы в дереве нет: окно может обойтись без заданной формы. Кто в таком случае его строит — вопрос следующей главы; пока просто отметьте, что так бывает и что правило выше говорит только о заданных формах.
3. Пять слов разговора
У разговора есть части, и у каждой в 1С своё настоящее имя. Сейчас мы их только назовём: каждое слово раскроется в своей главе, и запоминать всё разом не нужно.
| в разговоре | в 1С | где в Конфигураторе |
|---|---|---|
| реплика | форма | ветка «Формы» объекта |
| предмет реплики | основной реквизит формы | вкладка «Реквизиты» редактора формы |
| видимая часть реплики | элемент формы | вкладка «Элементы» |
| глагол | команда | вкладка «Команды» |
| оглавление | командный интерфейс | в дереве конфигурации, вне формы |
Оговорка про предмет: у карточки он лежит в одном месте — в основном реквизите формы. У списка и отчёта роль предмета играют свои данные, и о них книга скажет в своё время.
Одно предупреждение сразу. «Реквизит формы» — не то же, что реквизит товара из дерева конфигурации, хотя слово одно. Реквизит товара — его свойство, которое хранится в базе; реквизит формы — данные, которые форма объявляет у себя и с которыми работает, пока открыта. Различать их учит глава о данных формы, а до неё слово «реквизит» без уточнения будет значить реквизит объекта.
Приложим пять слов к знакомой форме — карточке поступления № 12:
| слово разговора | на карточке поступления |
|---|---|
| реплика | вся карточка целиком |
| предмет | само поступление № 12 |
| видимые части | поля «Номер», «Контрагент», «Склад», таблица товаров |
| глаголы | «Провести и закрыть», «Записать» |
| оглавление | разделы и команды программы, через которые её открыли |
Заметьте, что предмет на экране не виден сам по себе: видно его отражение — номер, поставщик, строки товаров. Сам документ живёт в базе, а форма держит его у себя, пока открыта, и показывает по частям. Это различие ещё не раз пригодится.
4. С чего начинается чтение формы
Раз у каждой формы один предмет, первый вопрос к любой незнакомой форме — «о чём она?». Ответить на него часто помогает заголовок окна. Когда форму строит платформа, она пишет в заголовке имя предмета, а у карточек — ещё и в скобках, какого вида этот предмет. Автор формы может задать и свой заголовок, поэтому заголовок — подсказка, а не гарантия.
| заголовок окна | предмет разговора |
|---|---|
| Ручка шариковая (Товары) | один элемент справочника «Товары» |
| Поступление товаров 0000000012 от 15.03.2026 | один документ |
| Товары | справочник «Товары» целиком |
| Остатки товаров на складе | один вопрос |
Остальные вопросы — из каких частей форма собрана, какие у неё глаголы, откуда она берёт данные — книга будет добавлять по одному, глава за главой. Но первым всегда остаётся этот.
Чтение формы начинается с вопроса «о чём она?». Первая подсказка — заголовок окна.
5. Где разговор перестаёт быть об одном
Образ разговора об одном объекте точно описывает большинство форм: карточки, списки, отчёты. Но у него есть граница, и о ней лучше знать заранее.
Представьте рабочее место кассира. В одном окне — товары покупателя, сумма, способ оплаты, сдача, кнопка печати чека. О каком одном объекте это окно? Ни о каком: оно не о товаре и не о документе, а о задаче — обслужить покупателя.
| окно | о чём оно |
|---|---|
| карточка поступления | об одном документе |
| рабочее место кассира | о задаче: пробить покупку — товары, оплата, чек |
Такие окна тоже формы, и собраны они из тех же деталей: полей, таблиц, кнопок. Отличается только то, что в центре разговора стоит не предмет, а дело. В дереве конфигурации они чаще всего живут в ветке «Обработки». Подробно мы встретимся с ними ближе к концу книги; пока достаточно знать, что форма «не про один объект» — не ошибка и не нарушение правила, а другой род формы.
Большинство форм — про один объект. Но есть формы, у которых в центре задача, а не предмет. Устроены они из тех же деталей.
6. В режиме Предприятия
Проверим на «Канцтоварах», что у каждой формы один предмет и что заголовок его называет.
-
Откройте карточку товара «Ручка шариковая» и прочитайте заголовок окна: имя предмета и, в скобках, его вид.
-
Откройте список товаров. В заголовке — «Товары», без скобок: предмет — справочник целиком.
-
Откройте список поступлений и нажмите «Создать». Откроется карточка документа, которого ещё нет, — и заголовок об этом скажет. Ничего не вводя, закройте её.
-
Откройте поступление № 12 и нажмите кнопку «…» у поля «Контрагент». Откроется окно со списком контрагентов: его предмет — справочник «Контрагенты», а задача — выбрать из него одного. Закройте его, ничего не выбирая, а затем закройте и карточку.
Обратите внимание на третий шаг: предмета разговора может ещё не быть. Новая карточка говорит о документе, который появится в базе, только когда его запишут. А четвёртый шаг показывает ещё одну форму о справочнике целиком — форму выбора: предмет тот же, что у списка, а разговор другой — «выберите одного».
Главное в одном абзаце
Окна прикладной программы, которые мы называем формами, почти всегда говорят с пользователем о чём-то одном — об одном товаре, одном документе, о справочнике как целом или об одном вопросе. Отсюда образ, на котором держится книга: форма — это разговор системы с пользователем по поводу одного объекта. Строго форма — объект конфигурации, описывающий одно окно; заданная разработчиком, она живёт в ветке «Формы» внутри своего объекта или среди общих форм, но окно может обойтись и без заданной формы. У разговора пять частей — реплика, предмет, видимая часть, глагол, оглавление, — и в 1С им соответствуют форма, реквизит формы, элемент формы, команда и командный интерфейс. Чтение любой формы начинается с вопроса «о чём она?», и первая подсказка — заголовок окна. Граница у образа тоже есть: бывают формы, в центре которых задача, а не предмет, — вроде рабочего места кассира; собраны они из тех же деталей.
Каждая форма — реплика об одном. Но реплик в программе десятки, и пользователь как-то находит нужную. Кто подсказывает ему, какие разговоры в программе вообще возможны и откуда их начинать?
Контрольные вопросы
- Что общего у всех окон программы, которые мы называем формами?
- О чём разговаривает карточка товара, а о чём — список товаров?
- Что такое форма, если сказать строго, и где она живёт в Конфигураторе?
- Назовите пять слов разговора и то, что каждому из них соответствует в 1С.
- По чему в Предприятии быстрее всего понять, о чём форма?
- Чем рабочее место кассира не похоже на карточку документа — и чем похоже?
Упражнения
Назовите предмет. Откройте в Предприятии карточку товара, список товаров, карточку поступления № 12, отчёт об остатках и окно выбора контрагента. Для каждого окна одной фразой ответьте: о чём оно?
Бланк из жизни. Возьмите бумажный бланк — квитанцию за квартиру, заявление в библиотеку, бланк заказа. О каком одном предмете он? Что в нём заполняет человек, а что уже напечатано заранее?
Ловушка: список — это много разговоров? Коллега рассуждает: «Список товаров — не одна реплика, а много: по одной на каждый товар, строк-то много». Прав ли он? Чем проверить?
Предмет по заголовку. Даны заголовки окон: «Контрагенты», «ООО «Ромашка» (Контрагенты)», «Поступление товаров (создание)», «Рабочее место кассира». Назовите предмет разговора в каждом. Какое окно не укладывается в «разговор об одном объекте» и почему?
Ответы — в конце части.
§ 0.4. Командный интерфейс: оглавление прикладной программы
Откуда пользователь вообще знает, что в программе есть список товаров? Ему этого никто не рассказывал, и всё же он находит нужное окно среди десятков, а в типовой программе — среди многих сотен. Значит, программа заранее выкладывает перед ним всё, что умеет, и делает это не как попало. У книги для этого есть оглавление. У прикладной программы 1С — тоже, и называется оно командным интерфейсом.
1. Оглавление программы
Толстую книгу не листают в поисках нужной главы: открывают оглавление, находят часть, в ней строку и по номеру страницы попадают куда нужно. Программа устроена так же — только вместо глав у неё формы.
| в книге | в программе 1С |
|---|---|
| часть | раздел: «Продажи», «Склад» |
| строка оглавления | команда в разделе: «Товары», «Поступления товаров» |
| глава, которую открыли | форма, которая открылась |
Пользователь выбирает раздел, в разделе — команду, и команда открывает форму: список, карточку, отчёт. Главное дело оглавления — не рассказывать, а привести к тому месту, где рассказ начнётся.
Командный интерфейс — оглавление прикладной программы.
Оговорка, без которой образ треснет: рядом со ссылками на формы в разделе живут и действия — «Создать», «Отчёты». Оглавление книги таких кнопок не знает, а оглавление программы знает.
Строгая пара, как обычно, с адресом в Конфигураторе:
образ оглавление программы
строго разделы программы и команды
в них, через которые открывают
списки, карточки, отчёты
где подсистемы в ветке «Общие»;
свойства конфигурации
«Командный интерфейс»
2. Из чего складывается главное окно
Окно программы 1С в интерфейсе «Такси» — в нём работают современные типовые программы — делится на несколько областей. Вот как это выглядит в типовой программе, где разделов много:
┌──────────────────────────────────────────┐
│ заголовок, главное меню, поиск │
├────────────┬─────────────────────────────┤
│ Главное │ Товары │
│ Закупки │ Контрагенты │
│ Продажи ◄ │ Реализации товаров │
│ Склад │ Создать ▾ Отчёты ▾ │
│ ├─────────────────────────────┤
│ │ рабочая область: │
│ │ здесь открываются формы │
└────────────┴─────────────────────────────┘
разделы функции раздела «Продажи»
Слева — панель разделов: список разделов верхнего уровня, между которыми переключаются одним щелчком; стрелкой на наброске отмечен открытый. Рядом — функции текущего раздела: сначала команды, которые открывают списки, затем группы действий — «Создать», «Отчёты», «Сервис». Остальное место — рабочая область: здесь и открываются формы. Бывают и другие панели — избранное, история, открытые окна, — но оглавление держат эти две.
Расположение панелей не жёсткое: пользователь может скрыть лишние или выбрать для них другое место из допустимых. Но состав — какие разделы есть и какие команды в каждом — задаёт не он, а разработчик.
3. Раздел — это подсистема
Откуда берутся разделы? Первый из них, «Главное», есть в любой программе, даже самой маленькой: платформа показывает его всегда. Все остальные — это подсистемы первого уровня, объекты конфигурации из ветки «Общие», у которых включено свойство «Включать в командный интерфейс». Одна подсистема первого уровня — один раздел; вложенные в неё подсистемы становятся группами команд внутри этого раздела.
Конфигурация
└── Общие
└── Подсистемы
├── Закупки → раздел «Закупки»
├── Продажи → раздел «Продажи»
└── Склад → раздел «Склад»
Что попадает в раздел, решает состав подсистемы: разработчик включает в неё объекты — справочники, документы, отчёты, — и их стандартные команды появляются в разделе. Стандартные — это те, которые платформа даёт объекту сама, не спрашивая: открыть список, создать новую запись. Документ «ПоступлениеТоваров», включённый в подсистему «Закупки», даёт в разделе «Закупки» команду открыть список поступлений и команду создать новое. Увидит их пользователь, у которого есть права на этот документ; а если набор по умолчанию не устраивает, разработчик поправит его в командном интерфейсе подсистемы — уберёт лишнее или добавит свои команды.
| что видно в Предприятии | что задано в Конфигураторе |
|---|---|
| раздел «Главное» | есть всегда; состав — свойство конфигурации «Командный интерфейс основного раздела» |
| другие разделы | подсистемы первого уровня |
| команды в разделе | объекты, включённые в подсистему |
| какие разделы кому видны | свойство конфигурации «Командный интерфейс» |
Названия свойств запоминать сейчас не обязательно — важнее связь: подсистема даёт раздел, включённый в неё объект даёт команды в этом разделе. И здесь снова работает правило, которое встретится в книге ещё не раз: стандартные команды в разделе никто не рисовал по одной. Разработчик сказал «поступления относятся к закупкам», а кнопки платформа расставила сама.
4. Что видно в «Канцтоварах»
В «Канцтоварах» ветка «Подсистемы» пока пуста: конфигурация, собранная по «Дереву метаданных», разделов не заводила. Поэтому раздел на экране один — «Главное», тот самый, что есть всегда. Команды в нём платформа расставила сама: списки товаров, контрагентов, складов, поступлений и отчёт об остатках. Если какого-то из них там не окажется, откройте главное меню: в нём есть пункт «Все функции», где перечислено всё, что есть в программе.
Выглядит это бедно, но полезно: вы видите оглавление, которое платформа собрала без участия разработчика. Когда ближе к концу книги мы заведём подсистемы «Закупки» и «Продажи», оглавление «Канцтоваров» станет похоже на оглавление типовой программы — и вы увидите, что поменялось от нескольких строк в Конфигураторе.
Прежде чем идти дальше, разведём два похожих слова про команды: они живут в разных местах и делают разное.
5. Не путать с командной панелью формы
Слово «команда» живёт в двух местах, и их легко спутать. У программы есть командный интерфейс — оглавление. У каждой формы есть своя командная панель — полоса кнопок наверху формы: «Записать», «Провести и закрыть».
| командный интерфейс | командная панель формы | |
|---|---|---|
| чей | всей программы | одной формы |
| где на экране | панель разделов, функции раздела | верх формы, над полями |
| о чём говорит | какие разговоры можно начать | что можно сделать в этом разговоре |
| в образе | оглавление | глаголы реплики |
Проверка простая: команда оглавления доступна, когда не открыто ни одной формы, — её видно в разделе сразу после запуска программы. Глагол формы появляется вместе с формой и без неё не существует.
6. Одна форма — несколько входов
Теперь, когда оглавление отделено от глаголов формы, видно и ещё одно: оглавление — не единственная дорога к форме.
Раздел — не дом формы, а место, где стоит команда, которая её открывает. Одна и та же форма открывается разными путями, и оглавление — только один из них.
| откуда | как попасть в карточку поступления № 12 |
|---|---|
| оглавление | раздел → «Поступления товаров» → строка № 12 |
| другая форма | из отчёта или журнала, двойным щелчком по строке |
| история | панель истории: недавно открытое |
| начальная страница | если список поступлений вынесен туда |
Объект может входить и в несколько подсистем сразу: справочник «Товары» нужен и в закупках, и в продажах, и его список окажется в обоих разделах. Форма от этого не раздваивается — просто у неё два входа.
Форма живёт в своём объекте, а не в разделе. Раздел лишь даёт к ней вход — и не единственный.
7. В режиме Предприятия
-
Посмотрите на панель разделов «Канцтоваров». Сколько в ней разделов и как называется единственный?
-
Откройте «Главное» и перепишите его команды. Какие из них открывают списки, какие что-то создают, какие открывают отчёты?
-
Откройте из «Главного» список поступлений, а в нём — поступление № 12. Затем нажмите в заголовке формы кнопку с домиком: она возвращает на начальную страницу — ту, что программа показывает при запуске. Карточка при этом не закрылась: к ней можно вернуться через список открытых окон или историю.
-
Откройте главное меню и найдите в нём настройку панели разделов. В списке разделов, который она покажет, будет один «Главное».
Главное в одном абзаце
Командный интерфейс — оглавление прикладной программы: разделы и команды в них, через которые пользователь находит и открывает формы, не перебирая их подряд. В главном окне его держат две области — панель разделов и функции текущего раздела, — а формы открываются в рабочей области. Раздел «Главное» есть всегда, остальные разделы — подсистемы первого уровня, а стандартные команды в разделе появляются сами, когда разработчик включает объект в подсистему. В «Канцтоварах» подсистем пока нет, поэтому раздел один — «Главное», и его команды платформа расставила без нас. Путать командный интерфейс с командной панелью формы нельзя: первое — оглавление всей программы, второе — глаголы одной открытой формы. И раздел — не дом формы, а один из входов в неё: форма живёт в своём объекте.
Мы нашли форму по оглавлению и открыли её. Но где в этот момент находится то, что мы видим, — на нашем компьютере или там, где хранится база? И почему от ответа зависит, сохранится ли то, что мы введём?
Контрольные вопросы
- Что в программе 1С играет роль оглавления и из чего оно состоит?
- Какие области главного окна держат оглавление, а в какой открываются формы?
- Откуда берётся раздел «Главное» и откуда — все остальные разделы?
- Как команда попадает в раздел, если её никто не рисовал?
- Почему в «Канцтоварах» раздел только один?
- Чем командный интерфейс отличается от командной панели формы?
Упражнения
Оглавление «Канцтоваров». Перепишите команды раздела «Главное» и разложите их на три группы: открывают список, создают новое, открывают отчёт.
Своё оглавление. Разложите «Канцтовары» на бумаге на три-четыре раздела: какие команды в какой раздел попадут. Какой объект хочется положить сразу в два раздела и почему?
Ловушка: две панели. Коллега пишет: «Кнопку „Провести" надо добавить в командный интерфейс, пользователи её не находят». Что не так в этой фразе? Где на самом деле живёт эта кнопка?
Чужое оглавление. В типовой программе разделы такие: «Главное», «Продажи», «Закупки», «Склад», «Финансы», «Администрирование». В каком разделе вы стали бы искать список поступлений товаров, а в каком — справочник товаров? Почему справочник может найтись сразу в нескольких?
Ответы — в конце части.
§ 0.5. Клиент и сервер: пользователь здесь, данные там
Откройте карточку поступления № 12, поменяйте в ней количество и закройте окно, не нажимая «Записать». Введённое исчезнет. Новички считают это придирчивостью программы, а на самом деле здесь видно её устройство — и вопрос, который за ним стоит: где находится то, что мы видим на экране, — у нас на компьютере или там, где хранится база?
1. Две стороны одной программы
Представьте архив с окошком выдачи. Дела лежат в хранилище, за стеной, и наружу их не выносят: вам приносят к окошку копию дела и чистый лист для пометок. Пока вы правите свою копию, хранилище об этом не знает — и другому человеку у соседнего окошка спокойно выдают копию того же дела. Оригинал меняется только тогда, когда вы сдаёте пометки обратно и архивариус их подшивает.
Программа 1С устроена так же. Всё, что вы видите и трогаете, — окна, поля, кнопки — находится у вас. Данные — товары, документы, остатки — лежат в базе, за стеной. Сторона пользователя называется клиентом, сторона данных — сервером.
| где | что там | кто там работает |
|---|---|---|
| клиент | окна, формы, всё видимое и трогаемое | пользователь |
| сервер | база: данные и правила работы с ними | платформа |
| между ними | описание формы, её данные и обращения к серверу | — |
Данные живут на сервере, пользователь — на клиенте. Между ними ходят описание формы, её данные и обращения к серверу; окно формы — на клиенте.
2. Строже: клиент и сервер — роли
Строже: клиент — часть платформы, которая показывает интерфейс и принимает действия пользователя; сервер — часть, которая работает с базой: читает из неё данные, проверяет их и записывает. Это роли, а не обязательно два разных компьютера.
| вариант базы | где клиент | где сервер |
|---|---|---|
| файловая, как наши «Канцтовары» | ваш компьютер | тот же компьютер, та же запущенная программа |
| клиент-серверная, как на предприятии | ваш компьютер | отдельный сервер 1С |
В файловой базе платформа держит обе роли внутри одной запущенной программы, и сервер ничем не виден. На предприятии сервер — отдельная машина, к которой подключаются десятки пользователей. Но разделение ролей от этого не меняется: окно — у клиента, база — у сервера.
Клиент и сервер — роли, а не обязательно два компьютера.
Где увидеть, какой у вас вариант: в окне запуска выделите базу и нажмите «Изменить…». Файловая база записана там как папка на этом компьютере или в локальной сети, клиент-серверная — как адрес сервера 1С и имя базы на нём.
3. Что происходит, когда открывается форма
Откроем карточку поступления № 12 и проследим, кто что делает.
| шаг | клиент | сервер |
|---|---|---|
| 1 | просит открыть поступление № 12 | |
| 2 | читает документ из базы, готовит данные формы | |
| 3 | отправляет описание формы и её данные | |
| 4 | строит окно и показывает его |
Окно рисует клиент — по описанию и с данными, которые прислал сервер. Описание формы — это её чертёж: какие на ней поля, в каком порядке, с какими надписями и кнопками; данные — то, что в этих полях стоит. Архивариус из нашего сравнения приносит только дело, а чертёж окна — отдельная бумага; кто её пишет — вопрос следующего параграфа. Отсюда первое практическое следствие: открытие формы — не мгновенное дело. Между щелчком и окном прошло обращение к серверу и ответ от него, и на медленной сети эта пауза заметна.
4. Что происходит, когда вы вводите и записываете
Теперь изменим в карточке количество и посмотрим, куда оно попадёт.
| шаг | клиент | сервер |
|---|---|---|
| 1 | вы ввели в поле новое количество | ничего не знает |
| 2 | значение в данных формы, на экране | в базе прежнее |
| 3 | нажата «Записать»: данные уходят на сервер | |
| 4 | проверяет и записывает в базу | |
| 5 | получает ответ, окно обновляется | в базе новое |
Пока не нажата «Записать», новое значение живёт в данных формы, у клиента. В базе его нет, другие пользователи его не видят, и если закрыть окно, отказавшись сохранять, оно пропадёт. Это и есть ответ на вопрос, с которого начался параграф: введённое в поле не сохраняется само, потому что поле — у клиента, а база — у сервера.
Пока не нажата «Записать», новое значение живёт в данных формы и в базу не попадает.
5. Почему так устроено
Потому что клиентов много, а база одна. Каждый пользователь сидит за своим компьютером и видит своё окно, а правда о товарах и остатках должна быть одна на всех. Хранит её сервер, и только он решает, что записать, — там же живут правила проверки, общие для всех клиентов.
клиент 1 ──┐
клиент 2 ──┼──► сервер ──► база
клиент 3 ──┘
Если бы каждое нажатие клавиши сразу уходило в базу, два кладовщика, правящие одно поступление, мешали бы друг другу на каждой букве. Вместо этого каждый работает со своими данными формы и отправляет их серверу целиком — когда решил, что готово.
6. «Форма ушла на сервер»: как говорят и как точнее
Разработчики говорят быстро: «форма ушла на сервер», «форма пришла с сервера». Образ удобный, но неточный, и разницу стоит видеть с самого начала.
| как говорят | как точнее |
|---|---|
| форма ушла на сервер | форма обратилась к серверу и отправила ему свои данные |
| форма пришла с сервера | сервер прислал описание формы и данные, клиент построил окно |
| программа думает | клиент ждёт ответа сервера |
Окно никуда не ходит: его строит и держит клиент. Путешествуют данные и обращения к серверу — разработчики называют их серверными вызовами. Эта поправка ещё пригодится в главе о списках.
7. В режиме Предприятия
Увидеть два клиента одной базы можно на одном компьютере: каждый запуск программы — отдельный клиент.
-
Запустите «Канцтовары» в режиме Предприятия, а затем, не закрывая первое окно, — ещё раз. Теперь у вас два клиента одной базы.
-
В первом окне откройте товар «Ручка шариковая» и замените артикул на «РУЧ-01-Т». Пока не записывайте.
-
Во втором окне откройте тот же товар. Артикул — прежний, «РУЧ-01»: изменение живёт только в первом клиенте.
-
В первом окне нажмите «Записать и закрыть». Во втором закройте карточку и откройте снова: теперь артикул новый.
-
Верните товару прежний артикул «РУЧ-01» и запишите: дальше книга опирается на него.
Главное в одном абзаце
У программы 1С две стороны: клиент, где окна, поля и кнопки и где работает пользователь, и сервер, где лежит база и выполняется всё, что связано с данными. Это роли, а не обязательно два компьютера: в файловой базе обе живут в одной запущенной программе, на предприятии сервер — отдельная машина. Когда форма открывается, сервер читает данные и присылает клиенту описание формы и её данные, а окно строит клиент. Когда вы вводите значение, оно остаётся на клиенте и попадает в базу только после записи, поэтому введённое в поле не сохраняется само. Так устроено потому, что клиентов много, а база одна, и правду о данных держит сервер. Образ «форма ушла на сервер» неточен: окно остаётся у клиента, путешествуют данные и обращения к серверу.
Окно строит клиент — по описанию, которое прислал сервер. Но кто написал это описание? И почему в нём нет ни одной фразы вида «когда нажмут кнопку, сделай то-то»?
Контрольные вопросы
- Что находится на клиенте, а что — на сервере?
- Почему клиент и сервер называют ролями, а не компьютерами?
- Кто строит окно формы и из чего?
- Где находится новое значение, которое вы ввели в поле, но ещё не записали?
- Почему правду о данных держит сервер, а не каждый клиент?
- Что неточного во фразе «форма ушла на сервер»?
Упражнения
Два клиента. Повторите опыт из параграфа и для каждого шага запишите, где в этот момент находится артикул «РУЧ-01-Т»: только на первом клиенте, на сервере или уже у обоих клиентов.
Своё окошко. Найдите клиент и сервер в бытовой системе, которой не было в параграфе: банкомат и банк, касса и магазин, кассир и кухня в кафе. Что в ней ходит между сторонами? Где лежит «правда»?
Ловушка: «у нас нет сервера». Бухгалтер небольшой фирмы говорит: «У нас база файловая, на одном компьютере, сервера нет — значит, всё, что я ввожу, сохраняется сразу». В чём он ошибается дважды?
Где это происходит. Для каждого события скажите, где оно происходит — на клиенте или на сервере: окно карточки стало шире; из базы прочитаны строки поступления; в поле появилась набранная буква; документ записан в базу; пользователь переключился на другое открытое окно.
Ответы — в конце части.
§ 0.6. Декларативность платформы: не написать действие, а задать правило
У справочника «Товары» ветка «Формы» пуста — мы замечали это дважды. А карточка товара открывается, и в ней есть всё нужное: поля, кнопки, заголовок. Кто-то ведь решил, что показать и в каком порядке. Ответ неожиданный: иногда не человек. Чертёж окна может написать сама платформа. Из чего?
1. Не действие, а правило
Держать в комнате тепло можно двумя способами. Можно сидеть у градусника и включать обогреватель, когда стало двадцать, а выключать, когда стало двадцать три. А можно поставить на термостате «22» и забыть: как этого добиться, решает сам термостат.
| действиями | правилом | |
|---|---|---|
| что вы задаёте | что делать и когда | каким должен быть результат |
| кто следит | вы | термостат |
| если условия поменялись | переписываете свою инструкцию | правило работает; при нужде меняют само правило, а не сценарий |
Платформа 1С устроена по второму способу. Разработчик не пишет «когда откроют товар, нарисуй поле с артикулом, а когда нажмут кнопку, сохрани». Он задаёт, каким всё должно быть: у товара есть артикул, у поступления есть поставщик из справочника контрагентов, поступления относятся к закупкам. А как из этого получить окна, кнопки и разделы, решает платформа.
Мы не пишем «когда нажмут кнопку — сделай то-то». Мы задаём правила, по которым платформа сама строит и оживляет интерфейс.
Строгая пара с адресом:
образ не «сделай», а «пусть будет»
строго описание свойствами: что есть
и как связано, а как этого
достичь, решает платформа
где палитра свойств: тип — у
реквизита, автонумерация —
у документа, состав раздела —
у подсистемы
Такой способ описания называют декларативным — от латинского «объявлять»: разработчик объявляет, каким должен быть результат. Противоположный — «включи свет», а не «пусть будет светло» — называют императивным: на нём пишут код, и книга дойдёт до него только в самом конце, как до своей границы.
2. Правила, которые уже сработали у нас на глазах
Вспомним, что за пять параграфов произошло «само», и назовём правило за каждым случаем.
| что произошло само | какое правило сработало | где оно задано |
|---|---|---|
| карточка товара построилась, хотя формы в дереве нет | нет своей формы — платформа строит её из реквизитов | справочник «Товары» |
| у поля «Контрагент» есть кнопка «…» и окно выбора | реквизит — ссылка на справочник | тип реквизита «Контрагент» |
| у поступления номер «0000000012», его никто не набирал | номер присваивается автоматически | свойство документа «Автонумерация» |
| список поступлений оказался в разделе | объект включён в подсистему | состав подсистемы |
| раздел «Главное» на месте, хотя его не заводили | первый раздел платформа показывает всегда | встроенное поведение; состав — свойство конфигурации «Командный интерфейс основного раздела» |
Ни одна из этих вещей не написана как действие. Каждая — следствие того, что в дереве конфигурации что-то объявлено.
Если форма ведёт себя сама — значит, где-то в дереве задано правило.
3. Одно правило — много последствий
Самое сильное в правилах — их отдача. Возьмём одно-единственное свойство: реквизит «Контрагент» у поступления имеет тип «ссылка на справочник „Контрагенты“». Ссылка — это не текст с именем, а указание на конкретного контрагента в справочнике. Вот что следует из одного этого свойства, без единого слова сверх него.
| следствие одного свойства | что видит пользователь |
|---|---|
| поле показывает контрагента по имени | «Канцелярия Плюс», а не внутренний код |
| рядом с полем кнопка выбора | «…» справа от поля |
| выбор идёт из справочника | окно со списком контрагентов |
| и в других формах — имя, а не код | колонка «Контрагент» в списке поступлений |
В поле можно и просто начать набирать имя — «Канц», — и платформа предложит «Канцелярия Плюс». Но это уже не одно свойство: так работает ввод по строке, у которого свои настройки у справочника и у поля.
Верно и обратное: поменяйте правило — и форма поменяется сама. В «Дереве метаданных» склад у поступления сначала был простой строкой, а потом стал ссылкой на справочник «Склады». Форму поступления при этом никто не открывал, а поле «Склад» из строки для ввода превратилось в поле с кнопкой выбора и окном со списком складов.
4. Где искать правило
Отсюда рабочая привычка, которая пригодится в каждой главе: увидев, что форма ведёт себя сама, спросить «какое правило?» — и знать, где его искать. По ней быстрее всего находят, почему форма ведёт себя так, а не иначе, и где это поменять, не трогая кода.
| что происходит само | где искать правило |
|---|---|
| окно есть, а формы в дереве нет | ветка «Формы» объекта пуста — окно строит платформа |
| поле ведёт себя по-особому | свойства реквизита: тип, проверка заполнения |
| команда появилась в разделе | состав подсистемы |
| номер проставился сам | свойства документа, нумерация |
| элементы разложились по окну | группы формы и их свойства — об этом отдельная глава |
Про проверку заполнения стоит сказать отдельно, это частый случай. Если у реквизита объекта «Контрагент» свойство «Проверка заполнения» стоит в значении «Выдавать ошибку», платформа не даст записать поступление без поставщика, сообщит об этом и подсветит пустое поле. Ни строки кода — одно значение в палитре свойств.
5. Где правил не хватает
Правила покрывают многое, но не всё. Когда в строке поступления меняют количество, хочется, чтобы сумма пересчиталась сама: количество на цену. Такого свойства у реквизита нет — это уже поведение, и его разработчик дописывает кодом, в обработчике события «при изменении количества». В типовых программах таких обработчиков тысячи.
| поведение | чем задано |
|---|---|
| кнопка выбора у поля «Контрагент» | правилом: тип реквизита |
| номер нового документа | правилом: автонумерация |
| отказ записать документ без поставщика | правилом: проверка заполнения |
| пересчёт суммы при изменении количества | кодом: обработчик события |
В «Канцтоварах» такого обработчика нет, и если поменять количество в строке поступления, сумма останется прежней. Код в конфигурации всё же есть — проведение документа записано в модуле объекта, — но это другое место и другая работа. Это не поломка, а честная граница: книга учит читать то, что задано правилами, а код — следующий уровень, к которому она подведёт в самом конце.
Сначала ищите правило. Код — там, где правила кончились.
6. В Предприятии и в Конфигураторе
Проверим на «Канцтоварах», что за «самим собой» стоят свойства. В Конфигураторе мы только смотрим и ничего не меняем.
-
В Предприятии откройте поступление № 12 и нажмите «…» у поля «Контрагент». Откроется окно выбора. Закройте его, ничего не выбирая, и закройте карточку.
-
В Конфигураторе раскройте в дереве «Документы» → «ПоступлениеТоваров» → «Реквизиты» и откройте свойства реквизита «Контрагент». Найдите его тип: «СправочникСсылка.Контрагенты». Вот правило, из которого выросли кнопка и окно выбора.
-
Там же найдите у реквизита свойство «Проверка заполнения» и посмотрите, какое значение в нём стоит.
-
Откройте окно документа «ПоступлениеТоваров» и найдите на вкладке нумерации флажок «Автонумерация». Закройте окна, ничего не сохраняя.
Главное в одном абзаце
Платформа 1С декларативна: разработчик не пишет последовательность действий «когда нажмут кнопку, сделай то-то», а задаёт свойства — каким должен быть результат, что с чем связано, — и платформа сама строит и оживляет по ним интерфейс, как термостат сам держит заданную температуру. Всё, что до сих пор происходило «само», — карточка без формы в дереве, кнопка выбора у поля, номер документа, команды в разделе — было сработавшим правилом, заданным в дереве или в свойствах. Одно правило даёт много следствий, и, поменяв его, меняешь форму, не трогая её. Отсюда привычка: увидев, что форма ведёт себя сама, искать правило в палитре свойств. Правила кончаются там, где нужно поведение, — например, пересчёт суммы; его дописывают кодом, и эта книга такой код не пишет.
Правила, окно, которое платформа раскладывает сама, формы, построенные без рисовальщика, — всё это черты управляемых форм. Но в 1С были и другие формы, нарисованные по координатам. Куда они делись и почему книга о них почти молчит?
Контрольные вопросы
- Чем задание правилом отличается от задания действием? Приведите бытовой пример.
- Что значит «декларативное описание» и где в Конфигураторе живут правила?
- Назовите три вещи в «Канцтоварах», которые произошли «сами», и правило за каждой.
- Что изменится в карточке поступления, если поменять тип реквизита «Склад» со строки на ссылку на справочник, и почему форму при этом трогать не нужно?
- Где искать правило, если поле формы ведёт себя по-особому?
- Почему пересчёт суммы при изменении количества — не правило, а код?
Упражнения
Найдите правило. Для каждого случая назовите правило и где оно задано: у нового поступления сам появился номер; в карточке товара есть поле «Артикул», хотя формы товара в дереве нет; у поля «Склад» в поступлении есть кнопка выбора.
Своё: правила вокруг. Найдите в быту три устройства, которые работают по правилу, а не по командам, — вроде термостата. Для каждого запишите, что вы задаёте и что устройство решает само.
Ловушка: где спрятан код? Новичок говорит: «Кнопку „…“ у поля „Контрагент“ кто-то запрограммировал — найду обработчик и посмотрю, как она работает». Найдёт ли он обработчик? Что он найдёт вместо него?
Правило или код. Для каждого поведения скажите, чем оно, скорее всего, задано — правилом или кодом: поле «Контрагент» подсвечивается, если пустое; при выборе товара в строке сама подставляется его цена; поступление попадает в раздел «Закупки»; документ не записывается без склада.
Ответы — в конце части.
§ 0.7. Два режима форм: управляемые и обычные
Слово «управляемая» стояло в этой главе почти в каждом абзаце, и до сих пор мы обходились без объяснения. Пора сказать, с чем его противопоставляют: раз формы управляемые, значит, бывают и другие. Они называются обычными, и разговор о них будет коротким — увидеть, научиться отличать и больше к ним не возвращаться.
1. Две эпохи
Обычные формы — из первых выпусков восьмой версии. Их рисовали мышью на холсте: поле стоит там, куда его положили, и окно выглядит ровно так, как его нарисовал разработчик. Управляемые появились в версии 8.2, вместе с тонким и веб-клиентом, а основным способом работы стали позже. Устроены они иначе: в конфигурации описано, что на форме есть и с чем связано, а где что окажется на экране, решает платформа.
| обычная форма | управляемая форма | |
|---|---|---|
| как задана | нарисована: элементы стоят там, где их положили, и под окно не пересчитываются | описана свойствами: что есть и с чем связано |
| кто раскладывает | разработчик, при рисовании | платформа, при открытии |
| где работает | только толстый клиент | тонкий клиент, веб-клиент, мобильный, толстый |
| когда появилась | первые выпуски восьмёрки | версия 8.2; основным способом стали в 8.3 |
2. Почему платформа сменила подход
Причина прямо следует из того, о чём мы говорили. Окно строит клиент — а клиентов стало несколько: обычная программа на компьютере, браузер, телефон.
Их и называют клиентами: программу на компьютере — толстым или тонким клиентом, браузер — веб-клиентом, телефон — мобильным. Разница между толстым и тонким здесь неважна; важно, что рисуют они по-разному. Нарисованную по координатам картинку в браузер как есть не перетащишь: там другие шрифты, другие размеры, другое окно, и подогнать её под каждый экран нечем. А описание «здесь поле артикула, здесь таблица товаров, вот кнопки» переносится куда угодно — каждый клиент рисует его своими средствами.
Отсюда и название, которое сбивает с толку почти всех новичков. Слышится в нём, будто управляет формой пользователь: двигает поля, меняет их размер. На деле пользователь управляет данными и командами, а раскладкой — платформа.
Управляемая форма названа так не потому, что ею управляет пользователь, а потому, что её раскладкой управляет платформа.
Кое-что пользователю платформа всё же отдаёт: в разрешённых пределах он подстраивает вид под себя — прячет колонки, меняет их порядок и ширину. Но раскладку в целом считает она.
3. Как отличить одну от другой
Отличить нетрудно, и полезно уметь: по признакам сразу ясно, применима ли к форме эта книга.
| где смотреть | обычная | управляемая |
|---|---|---|
| редактор формы в Конфигураторе | холст, элементы двигаются мышью | дерево элементов, координат нет |
| каким клиентом открывается | только толстым | тонким, веб-клиентом, мобильным, толстым |
| свойства корня конфигурации | «Основной режим запуска» — «Обычное приложение» | «Управляемое приложение» |
редактор обычной редактор управляемой
┌──────────────────┐ Форма
│ Наименование [ ] │ ├── Реквизиты
│ Артикул [ ] │ ├── Элементы
│ │ │ ├── Наименование
│ [Записать] │ │ └── Артикул
└──────────────────┘ └── Команды
элементы двигают порядок и группы
Самый быстрый признак — редактор. Если разработчик двигает поле мышью и оно остаётся там, куда его положили, перед вами обычная форма. Если вместо холста дерево элементов, а расположение задаётся порядком и группами, — управляемая.
4. Где обычные формы ещё попадаются
Совсем они не исчезли. Встретить их можно в трёх случаях.
| случай | что увидите |
|---|---|
| старая конфигурация, начатая до 8.2 и не переведённая | все формы обычные |
| у конфигурации включён режим совместимости с версией 8.1 | управляемое приложение запрещено: программа работает как обычное |
| включено свойство «Использовать обычные формы в управляемом режиме» | приложение управляемое, но в толстом клиенте работают обычные формы |
Третий случай стоит прочитать внимательно: «управляемый режим» здесь — про режим работы приложения, а не про тип клиента. Обычные формы и в такой конфигурации открываются только толстым клиентом.
Во всех трёх случаях дело не в отдельной форме, а в решении, принятом для всей конфигурации. Перевод такой конфигурации на управляемые формы — отдельная большая работа, и книга её не разбирает.
5. Что это значит для книги
Дальше в книге слово форма значит «управляемая форма», и оговариваться об этом мы больше не будем. Всё, что сказано про правила, раскладку, клиент и сервер, относится к ним.
Если, открыв чужую конфигурацию, вы увидите холст с координатами, — это не повод решить, что книга вас обманула. Это повод узнать обычную форму в лицо и понять, что перед вами наследство прежней эпохи.
Главное в одном абзаце
Формы в 1С бывают двух родов. Обычные рисовали мышью на холсте, элементы в них стоят по координатам, и работают такие формы только в толстом клиенте, — это наследство первых выпусков восьмёрки. Управляемые появились в версии 8.2: в конфигурации описано, что на форме есть и с чем оно связано, а раскладку считает платформа при открытии, поэтому одно и то же описание живёт и в программе на компьютере, и в браузере, и на телефоне — выглядя на каждом по-своему. Отсюда название: формой управляет не пользователь, а платформа. Отличают их по редактору — холст против дерева элементов, — по клиенту и по свойствам конфигурации. Обычные формы ещё встречаются в старых конфигурациях и при режиме совместимости с 8.1, но эта книга дальше говорит только об управляемых.
Мы всё время ссылались на дерево конфигурации: там задан тип реквизита, там живут подсистемы, там лежат формы. А что это, собственно, за дерево — и где в нём место коду?
Контрольные вопросы
- Чем обычная форма отличается от управляемой по способу задания?
- Почему управляемая форма называется управляемой?
- Какими клиентами открывается обычная форма, а какими — управляемая?
- По каким признакам вы отличите одну от другой в Конфигураторе?
- В каких случаях в конфигурации до сих пор работают обычные формы?
Упражнения
Найдите режим. В Конфигураторе откройте свойства корня конфигурации «Канцтовары» и найдите свойство «Основной режим запуска». Какое значение в нём стоит и что это значит для форм, которые мы будем делать?
Два описания. Опишите словами, как выглядело бы задание карточки товара в обычной форме и в управляемой: что в каждом случае задаёт разработчик, а что остаётся платформе.
Ловушка: кто управляет. Новичок говорит: «Управляемая форма — это форма, которой пользователь может управлять: двигать поля, менять колонки. А обычная — та, где ничего не подвинешь». Что здесь перепутано и почему вывод всё же получился отчасти верным?
Чужая форма из описания. Дано: «окно открывается только в толстом клиенте, поля стоят на своих местах и не переставляются, разработчик менял их расположение мышью». Какого рода эта форма и в какой конфигурации она могла сохраниться?
Ответы — в конце части.
§ 0.8. Связь с метаданными и с кодом: где здесь дерево, где здесь язык
Откройте Конфигуратор — и первое, что вы увидите, будет дерево: «Справочники», «Документы», «Отчёты», «Регистры». За главу мы сослались на него с десяток раз, ни разу не объяснив, как оно устроено: там задан тип реквизита, оттуда берутся разделы, там лежат формы. Пора собрать необходимый минимум в одном месте. Если «Дерево метаданных» вы читали, этот параграф освежит знакомое; если нет — даст то, чего хватит до конца книги.
1. Дерево конфигурации: чертёж программы
Конфигурация — устройство прикладной программы, и показывают его деревом. Ветки дерева — это виды объектов, а внутри веток то, что завёл разработчик.
| ветка дерева | о чём она | в «Канцтоварах» |
|---|---|---|
| Справочники | то, что существует и повторяется | ЕдиницыИзмерения, Товары, Контрагенты, Склады |
| Документы | то, что произошло | ПоступлениеТоваров, РеализацияТоваров, ПриказОбИзмененииЦен |
| Регистры сведений и накопления | записи о состоянии и о движениях; по ним получают ответы | ЦеныТоваров — цены, ТоварыНаСкладах — остатки, Продажи — обороты |
| Отчёты | вопрос к данным и показ ответа | ОстаткиТоваровНаСкладе |
| Обработки | задача, которую делают над данными | пока ни одной |
Дерево конфигурации — чертёж программы: что в ней есть и как оно устроено. Чертёж устройства, а не поведения: поведение задают свойства и код.
Полное объяснение, почему объекты именно такие и чем документ отличается от справочника, — в «Дереве метаданных». Здесь нам хватит трёх слов.
2. Объект, реквизит, табличная часть
Объект конфигурации — то, что заведено в дереве: справочник «Товары», документ «ПоступлениеТоваров». Он описывает не одну запись, а целый вид: справочник «Товары» — это все товары, какие есть и будут.
Реквизит объекта — его свойство, которое хранится в базе: артикул у товара, контрагент у поступления.
Табличная часть — таблица внутри объекта: у поступления это строки товаров.
Документ «ПоступлениеТоваров»
├── Реквизиты
│ ├── Контрагент → Контрагенты
│ └── Склад → Склады
└── Табличная часть «Товары»
├── Товар → Товары
├── Количество
├── Цена
└── Сумма
Сравните это с карточкой поступления, которую мы открывали в начале главы, — и станет видно, что форма собрана по чертежу.
| в дереве | на форме |
|---|---|
| реквизит объекта | поле, которое его показывает, — если его вывели |
| табличная часть | таблица со строками |
| стандартные команды, которые платформа кладёт на форму | кнопки «Записать», «Провести и закрыть» |
Оговорка в первой строке не случайна: показывают не всё, что хранится, и об этом речь в конце параграфа.
Ещё два слова понадобятся по дороге. Ссылка — значение, которое указывает на конкретную запись: на элемент справочника, на отдельный документ. В поступлении хранится не имя «Канцелярия Плюс», а ссылка на этого контрагента; на форме её видно как поле с кнопкой выбора. Проведение — операция документа, при которой платформа выполняет правила, заданные для него, и записывает движения в регистры: после проведения поступления остаток товара на складе увеличивается. Где живут эти правила, увидим в следующем разделе.
3. Где в этом дереве код
Правила живут в свойствах, а код — в модулях. Модули есть у формы, у объекта, у менеджера объекта, у набора записей регистра и в других местах; отдельно — общие модули, которыми пользуется вся конфигурация. Нам понадобятся первые два. В модулях лежат процедуры, и среди них — обработчики событий, свои у каждого модуля: у формы — «при открытии», «при изменении», у объекта — «перед записью», «при записи», обработка проведения.
| где | что там лежит |
|---|---|
| свойства объекта, реквизита, формы | правила |
| модуль формы | обработчики событий формы |
| модуль объекта | обработчики событий объекта: перед записью, при записи, обработка проведения |
| общие модули | код, нужный во многих местах; лежат в ветке «Общие», рядом с общими формами, но это разные вещи |
Правила — в свойствах, код — в модулях. Эта книга читает свойства.
Граница книги проходит ровно здесь. Мы будем открывать свойства, сравнивать их с тем, что видно на экране, и собирать формы, не написав ни строки кода. В формах, которые мы сделаем, обработчики останутся пустыми и помеченными — чтобы было видно: это не забыли, это граница.
4. Как искать в дереве то, что видишь на экране
Дальше в книге этот путь будет повторяться постоянно, поэтому проговорим его один раз.
| от чего | к чему |
|---|---|
| открытая форма в Предприятии | заголовок называет предмет: товар, поступление |
| предмет | его объект в дереве: справочник, документ |
| объект | ветка «Формы» внутри него |
| поле на форме | чаще всего — реквизит объекта, который оно показывает |
Строже: поле — элемент формы, и живёт оно на вкладке «Элементы» редактора формы; реквизит — в дереве, у объекта. «Чаще всего» в таблице стоит не зря: поле может показывать и не реквизит объекта — такие случаи разберём дальше. Обратный путь тоже рабочий: увидели в дереве реквизит — ищите на форме поле, которое его показывает. Если поля нет, это не ошибка: не всё, что хранится, показывают.
5. В Конфигураторе
Откроем «Канцтовары» в Конфигураторе и посмотрим на чертёж целиком. Ничего не меняем.
-
Раскройте дерево и найдите ветки «Справочники», «Документы», «Отчёты», «Регистры сведений», «Регистры накопления». Сравните с тем, что видели в Предприятии: списки, карточки, отчёт — всё это собрано отсюда.
-
Раскройте документ «ПоступлениеТоваров»: найдите реквизиты «Контрагент» и «Склад» и табличную часть «Товары» с её реквизитами.
-
Найдите у документа ветку «Формы». Она пуста — а карточка поступления в Предприятии открывается.
-
Откройте модуль объекта документа. Он не пуст: там лежит процедура проведения, которую написал за разработчика конструктор движений в «Дереве метаданных». Читать её мы не будем — важно увидеть, где живёт код. Закройте окна, ничего не сохраняя.
Главное в одном абзаце
Дерево конфигурации — чертёж прикладной программы: его ветки суть виды объектов, а внутри лежит то, что завёл разработчик, — справочники для того, что существует, документы для того, что произошло, регистры для записей о состоянии и о движениях, отчёты для вопросов. Объект конфигурации описывает целый вид, а не одну запись; реквизит объекта — его свойство, хранимое в базе; табличная часть — таблица внутри объекта. По этому чертежу платформа собирает форму: реквизит показывается полем — если его вывели, — табличная часть таблицей, стандартные команды кнопками. Правила живут в свойствах, а код — в модулях, и граница этой книги проходит между ними: мы читаем и задаём свойства, а обработчики оставляем пустыми. Путь от экрана к дереву и обратно — заголовок формы, объект, его ветка «Формы», реквизит и поле — дальше будет повторяться в каждой главе.
Мы дважды натыкались на одно и то же: формы в дереве нет, а окно открывается. Пора выяснить, что именно платформа строит сама, из чего она это берёт и где у неё предел.
Контрольные вопросы
- Что такое дерево конфигурации и что лежит в его ветках?
- Чем объект конфигурации отличается от одной записи — например, справочник «Товары» от товара «Ручка шариковая»?
- Что такое реквизит объекта и что такое табличная часть?
- Во что превращаются на форме реквизит, табличная часть и стандартные команды объекта?
- Где в конфигурации живут правила, а где — код?
- Каким путём от открытой формы дойти до объекта в дереве?
Упражнения
Прочитайте чертёж. По ветке документа «ПоступлениеТоваров» в Конфигураторе предскажите, что будет на его карточке в Предприятии: какие поля, какая таблица, какие кнопки. Потом откройте карточку и сверьте.
Обратный путь. Откройте в Предприятии список складов и по нему найдите в дереве объект, из которого он вырос. Что вы искали в заголовке окна?
Ловушка: реквизит и поле. Коллега говорит: «Реквизит — это поле на форме, просто называется по-другому». В чём он не прав? Приведите случай, когда реквизит есть, а поля нет.
Где искать код. Для каждого вопроса скажите, куда смотреть — в свойства или в модуль: почему у поля «Контрагент» есть кнопка выбора; почему при проведении поступления меняется остаток на складе; почему в списке товаров видно артикул; почему после ввода количества сумма не пересчиталась.
Ответы — в конце части.
Ответы к части 0
Ответы собраны здесь, а не под вопросами: подсказка, увиденная сразу после вопроса, отменяет попытку вспомнить. У каждого ответа до трёх ступеней: сам ответ, указание — если ответ не дался сразу — и полное решение там, где рассуждение важнее вывода.
§ 0.1. Платформа в двух режимах: Конфигуратор и Предприятие
К вопросу 1. Ответ. Конфигуратор и 1С:Предприятие — или просто Предприятие.
К вопросу 2. Ответ. Разработчик — в Конфигураторе, бухгалтер и кладовщик — в Предприятии.
К вопросу 3. Ответ. Оба подключаются к одной информационной базе, в которой лежат и конфигурация, и данные. Одна база — две двери.
К вопросу 4. Ответ. В Конфигураторе видно устройство программы: дерево конфигурации, формы в редакторе, код; товары и документы здесь не вводят. В Предприятии видна работа программы: разделы, списки, документы, отчёты, а устройство скрыто.
К вопросу 5. Указание. Должны случиться две вещи: одна — в Конфигураторе, другая — у пользователя.
Полное решение. Сначала разработчик обновляет конфигурацию базы данных: до этого изменение лежит в Конфигураторе и в работу не пошло. Затем пользователь перезапускает программу: сеанс, открытый раньше, работает с прежней конфигурацией и нового поля не покажет. Обе вещи нужны — не хватит любой, и пользователь поля не увидит.
К вопросу 6. Ответ. Чтобы видеть форму глазами того, для кого она сделана. В редакторе всё кажется понятным, потому что мы сами это собирали и помним, что куда положили; пользователь видит только то, что ему показали.
К упражнению «Первый взгляд». Ответ. Свободный. Типичные наблюдения: «сверху — заголовок и меню», «сбоку — раздел со списком всего, что есть», «в центре — пустая область или начальная страница». Хорошо, если описано своими словами: в этом и задача.
К упражнению «Вторая дверь». Ответ. Свободный. Типичные отличия: вместо раздела — дерево с ветками «Справочники», «Документы», «Отчёты»; товаров и документов не видно, видны только объекты, из которых программа устроена; названия объектов пишутся слитно — «ПоступлениеТоваров», а не «Поступление товаров».
К упражнению «Схема по памяти». Ответ. Одна база, подписанная «конфигурация + данные», и две стрелки к ней — от Конфигуратора и от Предприятия. У Конфигуратора подпись «разработчик; видит устройство», у Предприятия — «пользователь; видит работу».
К упражнению «Ловушка: поле, которого нет». Указание. Вспомните таблицу из четырёх шагов: какие из них разработчик мог счесть сделанными раньше, чем они случились?
Полное решение. Первая причина — разработчик изменил конфигурацию, но не обновил конфигурацию базы данных: изменение осталось в Конфигураторе. Вторая — у кладовщика открыта программа, запущенная до обновления: ей нужен перезапуск. Ловушка в слове «добавил»: для разработчика поле добавлено, как только оно появилось в редакторе, а для пользователя — только когда оно дошло до его экрана. Бывает и третья причина — поле добавили не на ту форму, которую открывает кладовщик: у одного товара окон несколько, и об этом — в следующей главе.
К упражнению «По одной фразе». Ответ. Бухгалтер — в Предприятии, стажёр — в Конфигураторе.
Полное решение. Разделы «Закупки», «Продажи», «Зарплата» названы деловыми словами, и так они выглядят только в Предприятии; в Конфигураторе их следы лежат в ветке «Подсистемы» внутри «Общих». У стажёра признаков два: «ветка» — это слово дерева конфигурации, а имя «ПоступлениеТоваров» написано слитно, как пишут имя объекта. В Предприятии пользователь увидел бы «Поступление товаров».
§ 0.2. Что такое интерфейс пользователя: всё, что видно и трогается
К вопросу 1. Ответ. Всё, через что человек общается с системой: сообщает ей, чего хочет, и получает ответ. Примеры: руль, педали и приборы автомобиля; ручка и табло микроволновки; экран и клавиши банкомата.
К вопросу 2. Ответ. Разделы, списки, карточки, поля, кнопки, сообщения и вопросы — любые пять.
К вопросу 3. Ответ. В режиме Предприятия. Конфигуратор показывает устройство программы, а не её интерфейс.
К вопросу 4. Ответ. Потому что они отвечают на разные вопросы. Список — «какие товары у нас бывают»: ему нужно показать много товаров сразу. Карточка — «каков этот товар»: ей нужно показать один товар целиком.
К вопросу 5. Ответ. Данные в информационной базе, правила, по которым программа считает и проверяет, код, написанный разработчиком, и устройство объектов в дереве конфигурации.
К вопросу 6. Указание. Можно ли назвать интерфейсом одно окно? А можно ли назвать формой всё, что видит пользователь?
Полное решение. Интерфейс шире. Это всё видимое и доступное для действия в программе: разделы, меню, списки, карточки, сообщения. Форма — одно отдельное окно: список товаров, карточка поступления, окно отчёта. Раздел программы или главное меню — часть интерфейса, но не форма; как они устроены, книга разберёт ближе к концу. Помогает сравнение с квартирой: интерфейс — вся обстановка, форма — одна комната, и каждая комната устроена по-своему, потому что служит своему делу.
К упражнению «Четыре окна». Ответ. Свободный. Опорные наблюдения: список товаров — таблица, по строке на товар; карточка товара — отдельные поля одного товара; карточка поступления — поля сверху и таблица товаров ниже, кнопки записи и проведения; отчёт — настройки и область результата, которая заполняется после «Сформировать».
К упражнению «Своё устройство». Ответ. Свободный. Пример для лифта: человек сообщает кнопками этажей и кнопкой вызова; лифт отвечает табло с номером этажа, звонком, открывающимися дверями; под поверхностью — мотор, тросы и управляющее устройство, которое решает, куда ехать сначала.
К упражнению «Ловушка: „программа меня не понимает"». Ответ. Возможны оба места.
Полное решение. На поверхности: нажата не та кнопка; кнопка недоступна; программа показала сообщение, которого пользователь не заметил. Под поверхностью: правило или код, который должен сработать, работает не так; у пользователя нет права на это действие. Ловушка в том, что «ничего не происходит» — наблюдение с поверхности, а причина может быть на любой глубине. Поэтому разбор начинают с поверхности — та ли кнопка, доступна ли, не было ли сообщения — и только потом ищут глубже.
К упражнению «Где это живёт». Ответ. Первое — о том, что под поверхностью: значение превращается кодом. Второе — о поверхности.
Полное решение. Когда число переводят в строку и приписывают знак рубля, меняется само значение — это работа кода. Когда сумму «показывают с двумя знаками», значение в базе остаётся тем же, меняется только то, как поле его выводит. Это свойство того, как показано, а не того, что лежит, — то есть интерфейса. Ловушка в том, что обе фразы звучат как «про деньги на экране», а живут на разных этажах.
К упражнению «Окно не из четырёх». Ответ. Свободный. Подойдут окно настроек, окно со списком всех функций программы, маленькое окно выбора, которое открывается, когда в документе выбирают контрагента из списка. Последнее особенно интересно: это тоже форма, но с другой задачей — не показать и не принять данные, а помочь выбрать одно значение.
§ 0.3. Форма как единица интерфейса: разговор о чём-то одном
К вопросу 1. Ответ. Почти каждое окно говорит с пользователем о чём-то одном: об одном товаре, одном документе, о справочнике целиком или об одном вопросе.
К вопросу 2. Ответ. Карточка — об одном товаре, например о ручке шариковой. Список — о справочнике «Товары» целиком: какие товары у нас бывают.
К вопросу 3. Ответ. Форма — объект конфигурации, который описывает одно окно: из каких частей оно состоит, что показывает и что позволяет сделать. Живёт она в ветке «Формы» внутри своего объекта — справочника, документа, отчёта, — а если её сделали общей, то среди общих форм в ветке «Общие». Такую форму задаёт разработчик; окно может обойтись и без неё, и кто его тогда строит — вопрос следующей главы.
К вопросу 4. Ответ. Реплика — форма; предмет реплики — реквизит формы; видимая часть реплики — элемент формы; глагол — команда; оглавление — командный интерфейс.
К вопросу 5. Указание. Посмотрите на окно сверху, раньше, чем на поля.
Полное решение. По заголовку окна. Платформа пишет в нём имя предмета, а у карточки — ещё и вид предмета в скобках: «Ручка шариковая (Товары)». Заголовок без скобок, «Товары», говорит, что предмет — справочник целиком. Но это подсказка, а не гарантия: автор формы может задать свой заголовок, и тогда предмет придётся искать по содержимому окна.
К вопросу 6. Ответ. Не похоже тем, что говорит не об одном объекте, а о задаче — обслужить покупателя: в нём сразу товары, оплата и чек. Похоже тем, что собрано из тех же деталей — полей, таблиц, кнопок — и тоже является формой.
К упражнению «Назовите предмет». Ответ. Карточка товара — об одном товаре; список товаров — о справочнике «Товары» целиком; карточка поступления — об одном документе, поступлении № 12; отчёт — об одном вопросе, сколько товара на складах; окно выбора — отдельная форма о справочнике «Контрагенты» целиком, с задачей выбрать одного.
К упражнению «Бланк из жизни». Ответ. Свободный. Пример: квитанция за квартиру — об одном платеже за одну квартиру за один месяц. Напечатаны заранее получатель, адрес, строки услуг; заполняет человек показания счётчиков, сумму, дату. Хорошо, если вы заметили, что бланк, как и форма, собран вокруг одного предмета.
К упражнению «Ловушка: список — это много разговоров?». Ответ. Не прав.
Полное решение. У списка один предмет — справочник «Товары» целиком, а строки — его содержимое, как строки в оглавлении книги не делают из неё много книг. Проверить можно глаголами списка. Кнопка «Создать» добавляет товар в справочник — это действие над целым, а не над строкой. А отдельный разговор о каждом товаре начинается там, где открывается его собственное окно, — в карточке, по двойному щелчку на строке.
К упражнению «Предмет по заголовку». Ответ. «Контрагенты» — справочник целиком. «ООО «Ромашка» (Контрагенты)» — один контрагент. «Поступление товаров (создание)» — один документ, которого ещё нет в базе: он появится, когда его запишут. «Рабочее место кассира» не укладывается в разговор об одном объекте: это задача — обслужить покупателя, — а не предмет. Это форма того рода, в центре которого дело, как у рабочего места кассира.
§ 0.4. Командный интерфейс: оглавление прикладной программы
К вопросу 1. Ответ. Командный интерфейс: разделы программы и команды в них, через которые открывают формы: списки, карточки, отчёты.
К вопросу 2. Ответ. Оглавление держат панель разделов и функции текущего раздела. Формы открываются в рабочей области.
К вопросу 3. Ответ. «Главное» платформа показывает всегда, в любой программе. Остальные разделы — это подсистемы первого уровня из ветки «Общие»: одна подсистема первого уровня — один раздел, а вложенные в неё подсистемы становятся группами команд внутри него.
К вопросу 4. Указание. Что разработчик делает с подсистемой, а что платформа делает сама?
Полное решение. Разработчик включает объект в состав подсистемы — например, документ «ПоступлениеТоваров» в «Закупки». Команды объекта — открыть список, создать новый — платформа сама ставит в раздел этой подсистемы. Разработчик задаёт правило «поступления относятся к закупкам», а кнопок по одной не рисует.
К вопросу 5. Ответ. Потому что подсистем в конфигурации нет: по «Дереву метаданных» их не заводили. Остаётся только раздел, который есть всегда, — «Главное».
К вопросу 6. Ответ. Командный интерфейс — оглавление всей программы: его команды открывают формы. Командная панель — полоса кнопок одной формы: её команды что-то делают с тем, что уже открыто. Проверка: открывает команда новую форму — это оглавление; действует над открытой — это глагол формы.
К упражнению «Оглавление „Канцтоваров"». Ответ. Ожидаемо: списки — товары, контрагенты, склады, поступления товаров; создание — новое поступление, новый товар; отчёт — остатки товаров на складе. Точный состав сверьте с экраном: что платформа кладёт в «Главное», зависит от настроек объектов.
К упражнению «Своё оглавление». Ответ. Свободный. Пример: «Закупки» — поступления, контрагенты; «Склад» — товары, склады, отчёт об остатках; «Справочники» — всё, что заводят один раз. Контрагентов хочется положить и в закупки, и в продажи: у них покупают и им продают. Так и делают — объект входит в две подсистемы, и у его списка появляются два входа.
К упражнению «Ловушка: две панели». Ответ. Кнопка «Провести» — глагол формы документа, она живёт в командной панели его формы, а не в оглавлении.
Полное решение. Командный интерфейс открывает формы; провести же можно только документ, который уже открыт, — значит, это действие над открытой репликой. Если пользователи кнопку не находят, искать нужно в командной панели формы: возможно, кнопка убрана в меню «Ещё». Добавлять её в разделы программы бессмысленно — там нечего проводить.
К упражнению «Чужое оглавление». Ответ. Поступления — в «Закупках». Справочник товаров — в «Складе», а скорее всего ещё и в «Продажах» и «Закупках».
Полное решение. Раздел — не дом формы, а вход в неё. Справочник товаров нужен и тому, кто закупает, и тому, кто продаёт, и тому, кто считает остатки, поэтому разработчик включает его в несколько подсистем. Форма списка при этом одна и та же — у неё просто несколько входов.
§ 0.5. Клиент и сервер: пользователь здесь, данные там
К вопросу 1. Ответ. На клиенте — окна, формы, поля, кнопки: всё, что видит и трогает пользователь. На сервере — база с данными и всё, что с ними делают: чтение, проверка, запись.
К вопросу 2. Ответ. Потому что это разделение обязанностей, а не устройств. В файловой базе обе роли выполняет одна запущенная программа на одном компьютере; на предприятии сервер — отдельная машина. Обязанности при этом те же.
К вопросу 3. Ответ. Клиент — по описанию формы и с данными, которые прислал сервер, прочитав объект из базы.
К вопросу 4. Ответ. На клиенте, в данных формы. В базе его ещё нет, и другие пользователи его не видят.
К вопросу 5. Указание. Сколько пользователей и сколько баз?
Полное решение. Клиентов много, база одна. Если бы каждый клиент считал правдой своё, два пользователя видели бы разные остатки одного товара. Сервер принимает записи от всех и держит одну версию данных для всех.
К вопросу 6. Ответ. Окно формы никуда не уходит — его строит и держит клиент. К серверу уходит обращение с данными формы, а обратно приходят описание формы и данные.
К упражнению «Два клиента». Ответ. Шаг 2: «РУЧ-01-Т» только в данных формы первого клиента. Шаг 3: второй клиент получил с сервера прежний артикул — на сервере нового значения нет. Шаг 4: после «Записать и закрыть» новое значение на сервере, в базе; второй клиент видит его, когда снова запрашивает карточку. Шаг 5: прежний артикул возвращён в базу.
К упражнению «Своё окошко». Ответ. Свободный. Пример: банкомат — клиент, банк — сервер. Между ними ходят обращения («снять пять тысяч») и ответы («разрешено, остаток такой-то»). Правда о деньгах — в банке: банкомат ничего не решает сам и не хранит.
К упражнению «Ловушка: „у нас нет сервера“». Ответ. Первая ошибка: сервер есть — это роль, и в файловой базе её выполняет та же программа на том же компьютере. Вторая: введённое не сохраняется сразу — оно остаётся в данных формы, пока не нажата «Записать».
Полное решение. Ловушка в том, что «сервер» представляется отдельным железным ящиком. Бухгалтер его не видит и делает вывод, что нет и разделения. Но окно, в котором он вводит число, и база, где число будет храниться, остаются разными сторонами и в файловой базе, — и между ними по-прежнему нужен шаг записи.
К упражнению «Где это происходит». Ответ. Окно стало шире — клиент. Строки прочитаны из базы — сервер. Буква появилась в поле — клиент. Документ записан в базу — сервер. Переключение на другое окно — клиент.
§ 0.6. Декларативность платформы: не написать действие, а задать правило
К вопросу 1. Ответ. Действием задают, что делать и когда: «в двадцать градусов включи обогреватель». Правилом — каким должен быть результат: «пусть будет двадцать два», а как этого добиться, решает устройство. Бытовой пример — термостат, свет с датчиком движения.
К вопросу 2. Ответ. Описание свойствами: что есть и как связано, без последовательности действий; способ получить результат выбирает платформа. Правила живут в палитре свойств Конфигуратора — у объектов, реквизитов, форм и их элементов.
К вопросу 3. Ответ. Любые три из: карточка товара построилась без формы в дереве — у объекта нет своих форм, платформа строит сама; кнопка выбора у поля «Контрагент» — тип реквизита, ссылка на справочник; номер поступления — свойство документа «Автонумерация»; команды в разделе — состав подсистемы; раздел «Главное» — первый раздел платформа показывает всегда.
К вопросу 4. Указание. Что тип реквизита сообщает платформе о поле?
Полное решение. Поле «Склад» из строки для ввода станет полем с кнопкой выбора и окном со списком складов, а в списке поступлений склад будет показан по имени. Форму трогать не нужно, потому что всё это — следствия одного свойства, типа реквизита: платформа строит поле по правилу, а правило поменялось.
К вопросу 5. Ответ. В свойствах реквизита, с которым поле связано: тип, проверка заполнения и другие.
К вопросу 6. Ответ. Потому что это поведение — «когда изменили одно, пересчитай другое», — а не свойство результата. Такого свойства у реквизита нет, и разработчик дописывает пересчёт в обработчике события.
К упражнению «Найдите правило». Ответ. Номер — свойство документа «Автонумерация». Поле «Артикул» — реквизит справочника: платформа строит карточку из реквизитов, когда своей формы нет. Кнопка выбора у «Склада» — тип реквизита, ссылка на справочник «Склады».
К упражнению «Своё: правила вокруг». Ответ. Свободный. Примеры: термостат — задаёте температуру, он решает, когда греть; свет с датчиком движения — задаёте «гореть, когда кто-то есть», он решает, когда включиться; стиральная машина — задаёте программу, она решает, сколько набрать воды и когда отжимать.
К упражнению «Ловушка: где спрятан код?». Ответ. Не найдёт: обработчика нет. Найдёт тип реквизита — «СправочникСсылка.Контрагенты».
Полное решение. Привычка «раз что-то происходит, значит, это кто-то запрограммировал» в 1С часто ведёт мимо. Кнопка «…» и окно выбора — следствия одного свойства, и искать их нужно в палитре свойств реквизита, а не в модуле формы. Правило «сначала ищите правило» экономит здесь часы.
К упражнению «Правило или код». Ответ. Подсветка пустого поля — правило: проверка заполнения реквизита. Подстановка цены при выборе товара — код: это поведение «при изменении товара найди цену». Поступление в разделе «Закупки» — правило: состав подсистемы. Отказ записать без склада — правило: проверка заполнения.
§ 0.7. Два режима форм: управляемые и обычные
К вопросу 1. Ответ. Обычная нарисована: элементы стоят по координатам, куда их положил разработчик. Управляемая описана свойствами — что на ней есть и с чем связано, — а раскладку считает платформа при открытии.
К вопросу 2. Ответ. Потому что её раскладкой управляет платформа, а не потому, что ею управляет пользователь.
К вопросу 3. Ответ. Обычная — только толстым клиентом. Управляемая — тонким, веб-клиентом, мобильным и толстым.
К вопросу 4. Ответ. По редактору: у обычной холст, элементы двигаются мышью; у управляемой дерево элементов и никаких координат. Ещё по свойству конфигурации «Основной режим запуска».
К вопросу 5. Ответ. В старых конфигурациях, начатых до 8.2 и не переведённых; при режиме совместимости с версией 8.1, когда управляемое приложение запрещено; при включённом свойстве «Использовать обычные формы в управляемом режиме» — тогда приложение управляемое, но в толстом клиенте работают обычные формы.
К упражнению «Найдите режим». Ответ. В «Канцтоварах» стоит «Управляемое приложение»: формы, которые мы будем делать, — управляемые, и всё, что книга говорит о правилах и раскладке, к ним относится.
К упражнению «Два описания». Ответ. Свободный. Ожидаемо: в обычной форме разработчик сам ставит поле «Артикул» в нужное место, задаёт его размер и следит, чтобы при другом размере окна ничего не наехало друг на друга. В управляемой он говорит, что на форме есть поля наименования, артикула и единицы и в каком они порядке, а размеры и расположение платформа рассчитает сама — под окно, клиент и настройки пользователя.
К упражнению «Ловушка: кто управляет». Указание. Кто в слове «управляемая» управляет — человек или программа?
Полное решение. Перепутано, кто управляет: раскладкой управляет платформа, и название про неё. Но вывод отчасти верен по другой причине: раз расположение считает платформа, она же умеет учесть настройки пользователя — скрытые колонки, их порядок и ширину. У обычной формы, нарисованной по координатам, такой свободы нет. То есть пользователь действительно получает больше власти над управляемой формой, но не потому, что она так названа.
К упражнению «Чужая форма из описания». Ответ. Это обычная форма. Сохраниться она могла в конфигурации, начатой до версии 8.2 и не переведённой на управляемые формы, или в конфигурации с режимом совместимости с 8.1.
§ 0.8. Связь с метаданными и с кодом: где здесь дерево, где здесь язык
К вопросу 1. Ответ. Дерево конфигурации — чертёж прикладной программы. Его ветки — виды объектов: справочники, документы, регистры, отчёты, обработки; внутри веток лежит то, что завёл разработчик.
К вопросу 2. Ответ. Объект конфигурации описывает целый вид: справочник «Товары» — это все товары, какие есть и будут. «Ручка шариковая» — одна запись в нём, один элемент справочника.
К вопросу 3. Ответ. Реквизит объекта — его свойство, которое хранится в базе: артикул товара, контрагент поступления. Табличная часть — таблица внутри объекта: строки товаров в поступлении.
К вопросу 4. Ответ. Реквизит — в поле, табличная часть — в таблицу со строками, стандартные команды — в кнопки вроде «Записать» и «Провести и закрыть».
К вопросу 5. Ответ. Правила — в свойствах объектов, реквизитов и форм. Код — в модулях: модуле формы, модуле объекта, общих модулях.
К вопросу 6. Указание. С чего начинается чтение любой формы?
Полное решение. Сначала заголовок формы: он называет предмет разговора — товар, поступление, справочник целиком. По предмету находят объект в дереве: справочник «Товары», документ «ПоступлениеТоваров». Внутри объекта лежит ветка «Формы», а поля формы возводятся к его реквизитам.
К упражнению «Прочитайте чертёж». Ответ. По ветке документа ожидаемо: поля «Контрагент» и «Склад» с кнопками выбора, таблица товаров с колонками «Товар», «Количество», «Цена», «Сумма», кнопки записи и проведения. Плюс то, чего в ветке реквизитов не видно: номер и дата — они есть у каждого документа.
К упражнению «Обратный путь». Ответ. В заголовке окна искали имя предмета — «Склады». Отсюда объект: справочник «Склады» в ветке «Справочники».
К упражнению «Ловушка: реквизит и поле». Ответ. Реквизит — то, что хранится; поле — то, чем это показывают. Это разные вещи, и одно бывает без другого.
Полное решение. Реквизит объекта живёт в базе и существует, даже когда его никто не смотрит. Поле — элемент формы, через который реквизит показывают пользователю. Реквизит без поля — обычное дело: разработчик может не выводить служебное значение на форму, и оно всё равно хранится и участвует в отчётах. Обратный случай — поле без реквизита — тоже бывает, но о нём книга скажет позже, когда дойдёт до элементов формы.
К упражнению «Где искать код». Ответ. Кнопка выбора у поля «Контрагент» — свойства: тип реквизита. Изменение остатка при проведении — код: процедура проведения в модуле объекта. Артикул в списке товаров — свойства: реквизит справочника и состав колонок списка. Сумма не пересчиталась — код, которого в «Канцтоварах» нет.
§ 1.1. Автогенерируемая форма: что это и когда срабатывает
Справочник «Товары» живёт в «Канцтоварах» с тех пор, как его завели по «Дереву метаданных». Форм у него нет: ветка «Формы» пуста, и никто никогда не открывал редактор форм. А список товаров открывается. Двойной щелчок по строке открывает карточку, в ней наименование, артикул, единица, кнопки записи — всё на месте. Окно есть, а в редакторе форм его никто не собирал.
За этим стоит первое правило платформы, которое мы разберём вплотную.
1. Форма, которой нет в дереве
Когда пользователь просит показать товар, платформа ищет, какую форму ему открыть. Если у объекта назначена управляемая форма нужного вида, откроется она. Если назначенной управляемой формы нет — платформа не разводит руками, а строит форму сама, по описанию объекта: берёт его реквизиты, табличные части, стандартные команды и собирает из них окно. Такую форму называют автогенерируемой, или коротко — автоформой.
Если форма не задана явно — платформа создаёт её из метаданных.
Строгая пара, как всегда, с адресом:
образ окно, которое не собирали
в редакторе
строго форму строит платформа по
описанию объекта, когда ни одна
форма ему не назначена
где окно редактирования объекта,
закладка «Формы», страницы
«Основные» и «Дополнительные»
На этих двух страницах разработчик и говорит платформе: «для элемента открывай вот эту форму, для списка — вот эту». Пока там пусто, решение остаётся за платформой.
2. Когда правило срабатывает
Правило простое, но у него есть одна неочевидная строка. Вот что откроется в тонком клиенте — а в нём работают все современные программы.
| что назначено объекту | что откроется |
|---|---|
| ничего | форма, построенная платформой |
| управляемая форма | она и откроется |
| только обычная форма | форма, построенная платформой |
Третья строка — та самая неочевидная. Обычную форму тонкий клиент открыть не может, и вместо неё платформа строит управляемую: так описан порядок в документации платформы. Речь о конфигурациях, которые живут на управляемых формах, — только их эта книга и разбирает. Получается, что старая нарисованная форма в новом клиенте не работает, а пользователь всё равно видит окно — построенное на лету.
Отсюда важное следствие для чтения чужих конфигураций: пустая ветка «Формы» не означает, что объект нельзя открыть. Она означает ровно одно — форму для него строит платформа.
3. «Строит в момент, когда понадобилась»
Автоформа не лежит готовой. Её собирают тогда, когда она понадобилась: сервер читает описание объекта, строит из него описание формы, добавляет данные и отправляет клиенту — а тот рисует окно. Именно поэтому автоформы нет в дереве: до открытия её не существует.
Из этого следует всё остальное, что про неё нужно знать.
| у явной формы | у автоформы |
|---|---|
| открывается в редакторе форм | открывать нечего |
| можно добавить свои реквизиты | только то, что есть у объекта |
| можно задать свои команды | только стандартные |
| есть модуль с обработчиками | модуля нет, поведение — платформенное |
Автоформы нет в дереве, потому что до открытия её не существует.
4. Это не заглушка, а рабочее окно
Слово «автоматически» часто звучит как «наспех», и здесь этого оттенка нет. Автоформа — не набросок и не заглушка: через неё делают всё, ради чего объект заводили.
Вы уже пользовались автоформами всю прошлую главу, просто не знали об этом.
| окно, которое мы открывали | это автоформа? |
|---|---|
| список товаров | да |
| карточка «Ручка шариковая» | да |
| карточка поступления № 12 | да |
| окно выбора контрагента | да |
| окно отчёта об остатках | нет: у отчёта своё устройство |
Через эти окна мы смотрели список, открывали документ, меняли артикул, записывали изменения, выбирали контрагента. Ни одна из этих форм не нарисована человеком.
И это не весь список того, что автоформа умеет. В построенном платформой списке ищут по первым буквам, сортируют по колонке, ставят отбор, помечают запись на удаление, выводят список на печать — всё это стандартные возможности, и ни одну из них никто не заказывал отдельно.
5. Порядок, по которому платформа выбирает форму
Формы, которые платформа откроет сама, называют основными: их указывают на странице «Основные». Дополнительные — те, что объекту тоже принадлежат, но открываются по особому требованию. Платформа перебирает их именно в этом порядке.
Правило удобно держать в голове лестницей. Пользователь просит открыть товар — платформа спускается по ступеням, пока не найдёт, что открыть.
нужна форма элемента
│
назначена основная? ──да──► она
│ нет
есть дополнительная? ─да──► она
│ нет
построить по описанию объекта
Важно, что лестница своя у каждого вида формы. У справочника есть форма элемента, форма списка, форма выбора — что это за виды и кто каждый из них просит, разберём сразу дальше; вопрос «назначена ли своя» задаётся про каждую отдельно. Поэтому обычное состояние живой конфигурации — смешанное: у одного объекта список нарисован, а карточка строится платформой, у другого наоборот.
6. Зачем платформе это умение
Можно спросить: почему бы не потребовать от разработчика нарисовать форму, как требуют почти везде? Ответ виден, если сравнить два порядка работы.
| в системе без автоформ | в 1С |
|---|---|
| описать, что хранить | описать, что хранить |
| нарисовать окно для ввода | — |
| нарисовать окно для списка | — |
| связать поля окна с данными | — |
| запустить и ввести первые данные | запустить и ввести первые данные |
Три шага из пяти пропадают. Дело не только в экономии времени: пока формы нет, объект всё равно работает, и это меняет сам порядок работы. Разработчик заводит справочник, тут же запускает Предприятие, вводит десяток записей, смотрит, чего не хватает, — и правит дерево, а не форму. Форму он сделает потом и только там, где она нужна.
Есть и вторая причина, важнее первой. Автоформа строится из описания объекта, и значит, она не отстаёт от него. Добавили реквизит — он появился в окне сам. Нарисованная форма так не умеет: в ней новый реквизит нужно ставить руками, и всякий раз, когда об этом забывают, форма начинает врать — показывать не всё, что у объекта есть.
Пока формы нет, окно не отстаёт от объекта: платформа строит его заново по текущему описанию.
7. Как узнать автоформу в лицо
Различать их полезно: от этого зависит, где искать причину того, что вы видите на экране.
| признак | автоформа | своя форма |
|---|---|---|
| в дереве, в ветке «Формы» | пусто | форма лежит |
| порядок полей | как в дереве объекта | какой задал разработчик |
| группы, страницы, оформление | нет | бывают |
| лишние кнопки и особое поведение | нет | бывают |
Самый быстрый признак — первый: посмотреть в дерево. Остальные помогают, когда дерева под рукой нет, например при разговоре с пользователем: если окно выглядит ровно как список полей подряд и в нём нет ничего, кроме стандартных кнопок, — скорее всего, его построила платформа.
8. В Конфигураторе и в Предприятии
Убедимся, что окна, с которыми мы работали, действительно ниоткуда не взялись.
-
В Конфигураторе откройте справочник «Товары» и перейдите на закладку «Формы». На странице «Основные» все поля пусты: ни формы элемента, ни формы списка, ни формы выбора.
-
Раскройте в дереве ветку «Формы» у этого справочника — она пуста. Открывать нечего: автоформу в редакторе не показать.
-
То же самое проделайте с документом «ПоступлениеТоваров».
-
Запустите Предприятие и откройте список товаров и карточку любого товара. Оба окна платформа собрала только что, в момент открытия.
Главное в одном абзаце
Форма может существовать для пользователя и не существовать в дереве конфигурации. Когда объекту не назначено ни одной формы нужного вида, платформа строит её сама — по описанию объекта, из его реквизитов, табличных частей и стандартных команд; такую форму называют автогенерируемой. В тонком клиенте она же появится и тогда, когда объекту назначена только обычная форма: открыть её тонкий клиент не умеет. Автоформа не хранится готовой — её собирают в момент открытия, и потому её нет в дереве, нельзя открыть в редакторе, нельзя добавить к ней свои реквизиты, команды и обработчики. При этом она не заглушка: почти все окна, с которыми мы работали в прошлой главе, — автоформы, и через них делается всё, ради чего объект заводили.
Платформа собрала окно из описания объекта. Но по каким правилам — что именно она берёт, в каком порядке ставит и чего не показывает никогда?
Контрольные вопросы
- Что такое автогенерируемая форма и из чего платформа её строит?
- Когда правило срабатывает — при каких условиях платформа строит форму сама?
- Что откроется в тонком клиенте, если объекту назначена только обычная форма?
- Почему автоформы нет в дереве конфигурации и почему её нельзя открыть в редакторе?
- Чего у автоформы не может быть в принципе?
- Почему пустая ветка «Формы» — не признак недоделанной конфигурации?
Упражнения
Найдите автоформы. Откройте в Предприятии четыре окна из прошлой главы — список товаров, карточку товара, карточку поступления, окно выбора контрагента — и для каждого скажите, есть ли у него форма в дереве. Проверьте себя в Конфигураторе.
Своё: предскажите. В конфигурацию добавили справочник «Сотрудники» с реквизитами «Должность» и «Телефон» и ни одной формы не сделали. Что увидит пользователь, открыв список сотрудников? Что он сможет с ним сделать?
Ловушка: «форму забыли». Новичок открыл чужую конфигурацию, увидел у половины справочников пустую ветку «Формы» и решил, что работа не доделана. В чём он ошибается и какой вопрос стоило задать вместо этого?
Правило по таблице. Объекту назначена управляемая форма списка, а формы элемента нет. Что откроется при щелчке по строке списка, а что — при открытии самого списка?
Ответы — в конце части.
§ 1.2. Что попадает в автогенерируемую форму: правила сборки
Откройте рядом две вещи: ветку справочника «Товары» в Конфигураторе и карточку ручки шариковой в Предприятии. Совпадение бросается в глаза — те же имена, тот же порядок. Платформа не выдумывает окно, она переписывает описание объекта в поля, таблицы и кнопки. Правила этого переписывания стоит знать: по ним читают любую автоформу и по ним же предсказывают, что увидит пользователь, ещё не открыв программу.
1. Из чего собирается окно
Источников ровно четыре, и все они лежат в дереве.
объект «Товары» автоформа
─────────────── ─────────
стандартные реквизиты → поля
свои реквизиты → поля
табличные части → таблицы
стандартные команды → кнопки
Больше платформе брать неоткуда: своих выдумок у неё нет. Отсюда первое практическое следствие — всё на автоформе либо задано в дереве, либо следует из стандартных правил показа: кнопка календаря у даты и кнопки над таблицей — не узлы дерева, а следствие типа и вида элемента. И обратное верно: чего в дереве нет, того в окне не появится.
2. Стандартные реквизиты: то, что есть у всех
Часть реквизитов разработчик не пишет руками: их даёт объекту сама платформа. Их так и называют — стандартные реквизиты. Одни есть всегда: ссылка, пометка удаления, версия данных. Другие появляются по настройкам объекта: код и наименование — если заданы их длины, родитель — у иерархического справочника, владелец — у подчинённого. У документа стандартные свои: номер, дата, признак проведения.
Живут их настройки в окне редактирования объекта, на закладке «Данные», за кнопкой «Стандартные реквизиты».
| стандартный реквизит | что это | видно в карточке |
|---|---|---|
| Код | номер по порядку внутри справочника; есть, если задана его длина | да |
| Наименование | имя, которым объект показывают; есть, если задана его длина | да |
| Родитель | группа, в которой лежит элемент | да, у иерархического |
| Владелец | хозяин, если справочник подчинён другому | да, у подчинённого |
| Ссылка | сам объект как значение | нет |
| Пометка удаления | признак «помечен на удаление» | нет, показывается иначе |
Заведены они не от щедрости платформы. Без наименования объект нечем показать в списке и в чужом поле; без кода трудно отличить тёзок; без пометки удаления нечем сказать «этот больше не нужен», не ломая ссылки на него из старых документов. Это рабочий минимум — а что из него объекту нужно, решает разработчик.
Последние две строки объясняют вопрос, который возникает у всех: почему в карточке нет поля «Ссылка» и галочки «Пометка удаления». Они есть у объекта, но показывать их полем незачем: ссылка — это сам объект, а пометку ставят командой и видят по значку в списке.
3. Как объект показывает себя в чужом поле
Есть ещё одно правило, которое видно не в карточке товара, а в карточке поступления. Поле «Контрагент» показывает «Канцелярия Плюс» — наименование, а не код и не какой-нибудь внутренний номер. Кто это решил?
Решил справочник, у которого есть свойство основное представление: показывать его элементы по наименованию или по коду. Выбор действует везде, где этот справочник попадает в чужое поле или колонку.
| основное представление | что видно в поле «Контрагент» |
|---|---|
| в виде наименования | Канцелярия Плюс |
| в виде кода | 000000004 |
Правило то же, что и с типом: автоформа ничего не выбирает сама, она читает решение из дерева. Поэтому вопрос «почему здесь показан код, а не имя» — вопрос не к форме, а к справочнику.
4. Свои реквизиты и их порядок
Дальше идут реквизиты, которые завёл разработчик, — в том порядке, в каком они стоят в дереве.
дерево карточка
────── ────────
Код Код
Наименование Наименование
Родитель Родитель
├── Артикул → Артикул
└── ЕдиницаИзмерения Единица измерения
Отсюда вывод, неочевидный для новичка: порядок своих реквизитов в дереве — это не бухгалтерия, а порядок полей на экране. Переставили реквизиты местами — переставились поля у всех, кто работает с автоформой. На стандартные реквизиты это не распространяется: их платформа ставит по своим правилам, и перестановкой в дереве ими не управляют.
5. Тип реквизита решает, как выглядит поле
Платформа не спрашивает, каким полем показать значение: вид поля следует из типа. Это то самое правило из прошлой главы, только теперь видно, как широко оно работает.
| тип реквизита | что видит пользователь |
|---|---|
| строка | поле ввода |
| число | поле ввода, значение прижато вправо |
| дата | поле ввода с кнопкой календаря |
| булево | флажок |
| ссылка на справочник | поле с кнопкой выбора и окном выбора |
| перечисление | поле с выпадающим списком значений |
Автоформа не решает, как показать значение, — она читает это из типа.
6. Табличная часть становится таблицей
Табличная часть объекта превращается в таблицу, а её реквизиты — в колонки, всё в том же порядке дерева. Над таблицей платформа ставит свои кнопки: добавить строку, удалить, передвинуть.
ПоступлениеТоваров карточка
────────────────── ────────
Контрагент → поле
Склад → поле
ТЧ «Товары» → таблица
├── Товар → колонка
├── Количество → колонка
├── Цена → колонка
└── Сумма → колонка
7. Чего в автоформе не бывает
Правила сборки простые, и оборотная сторона этой простоты — отсутствие всего, что требует замысла.
| чего нет | что это значит на практике |
|---|---|
| групп и страниц | поля идут подряд, длинная карточка не разложена по вкладкам |
| декораций | нет пояснений, разделителей, картинок |
| своих команд | только стандартные кнопки |
| скрытых и переставленных полей | видно всё и в порядке дерева |
| особого поведения | ничто не подставляется и не пересчитывается само |
Ни одна из этих строк не поломка: пока форма показывает то, что нужно, и в понятном порядке, ни групп, ни своих команд не требуется.
Заметно это становится на объёме. У справочника с тремя реквизитами автоформа выглядит опрятно. У документа с двумя десятками полей она превращается в длинный столбец, где связанное не собрано вместе: платформа не знает, что «Склад» и «Ответственный» — про разное, а «Цена» и «Сумма» — про одно. Знает это только человек, и ровно с этого места начинается своя форма.
8. В Конфигураторе и в Предприятии
Сверим дерево и экран напрямую. Это не упражнение, а короткая проверка правил, которые мы только что назвали: проделав её один раз, дальше вы будете видеть соответствие без сверки.
- В Конфигураторе откройте справочник «Товары» и выпишите на бумагу порядок его реквизитов.
- В Предприятии откройте карточку любого товара и сверьте порядок полей с вашим списком. Совпало ли? Что появилось в карточке сверх выписанного?
- Найдите в карточке поля стандартных реквизитов. Каких стандартных реквизитов на экране нет?
- Откройте карточку поступления и сверьте с деревом документа: поля шапки, таблица, колонки. Какие кнопки стоят над таблицей?
Главное в одном абзаце
Автоформа собирается из четырёх источников, и все они лежат в дереве: стандартные реквизиты, реквизиты разработчика, табличные части и стандартные команды. Стандартные реквизиты — те, что есть у объекта сами по себе: код, наименование, родитель у иерархического справочника, номер и дата у документа; часть из них полем не показывается, потому что показывать нечего — ссылка есть сам объект, а пометку удаления видно по значку. Свои реквизиты идут в том порядке, в каком стоят в дереве, поэтому порядок в дереве — это порядок полей на экране. Как выглядит поле, решает тип реквизита: строка даёт поле ввода, булево — флажок, ссылка — поле с кнопкой выбора. Табличная часть становится таблицей, её реквизиты — колонками. И наоборот: в автоформе не бывает групп, страниц, декораций, своих команд и особого поведения — всё, что требует замысла, появляется только в форме, которую собрал человек.
Правила сборки одни, а окна у справочника разные: список не похож на карточку, а окно выбора — на список. Значит, платформа строит не одну форму, а несколько. Сколько и зачем?
Контрольные вопросы
- Из каких четырёх источников платформа собирает автоформу?
- Что такое стандартные реквизиты и где их настройки?
- Почему в карточке нет поля «Ссылка» и флажка «Пометка удаления»?
- В каком порядке идут поля в автоформе и что из этого следует для дерева?
- Что решает, каким полем показать реквизит?
- Чего в автоформе не бывает никогда и почему это не поломка?
Упражнения
Предскажите карточку. По ветке справочника «Склады» (у него только наименование) скажите, что будет в его автоформе элемента. Проверьте в Предприятии.
Своё: нарисуйте по дереву. Дан справочник «Сотрудники»: реквизиты «Должность» (строка), «ДатаПриёма» (дата), «Уволен» (булево), «Руководитель» (ссылка на «Сотрудники»). Нарисуйте на бумаге, как будет выглядеть его автоформа элемента: порядок полей и вид каждого.
Ловушка: поля не видно. Разработчик добавил справочнику реквизит, открыл Предприятие — поля нет. Он решил, что автоформа берёт не все реквизиты. Какие две причины вероятнее и что он должен проверить в первую очередь?
Обратный ход. Пользователь описывает окно: «сверху три поля, потом таблица с четырьмя колонками, сверху кнопки „Провести и закрыть“ и „Записать“». Что вы скажете об объекте, который за этим окном стоит?
Ответы — в конце части.
§ 1.3. Виды автогенерируемых форм: список, элемент, выбор, группа
Двойной щелчок по строке в списке товаров открывает карточку. Двойной щелчок в окне, которое открылось по кнопке «…» у поля «Контрагент», не открывает ничего — он выбирает контрагента и закрывает окно. Оба окна показывают список записей одного справочника, а ведут себя по-разному, потому что это разные формы. У одного объекта их несколько, и, пока своих форм у него нет, каждую строит платформа.
1. У одного объекта несколько лиц
Справочник — не одно окно, а набор окон под разные случаи. Разговор с пользователем каждый раз другой, и форма нужна другая.
| вид формы | когда открывается | о чём разговор |
|---|---|---|
| форма списка | команда из раздела | какие записи есть |
| форма элемента | двойной щелчок в списке, «Создать» | одна запись целиком |
| форма выбора | нажали «…» в поле ссылочного типа | выберите одну запись |
| форма группы | открыли группу иерархического справочника | одна папка |
У документа набор свой, но устроен так же: форма документа вместо формы элемента, форма списка, форма выбора.
Один объект — несколько форм: по одной на каждый способ разговора.
2. Кто просит форму
Платформа не решает, какое окно показать, — она отвечает на просьбу. Повод даёт пользователь, а просит форму то место, откуда он нажал: команда раздела, строка списка, поле другой формы.
| что сделал пользователь | какую форму просит |
|---|---|
| выбрал команду «Товары» в разделе | форму списка |
| щёлкнул по строке дважды | форму элемента |
| нажал «Создать» | форму элемента для новой записи |
| нажал «…» в поле «Контрагент» | форму выбора контрагентов |
| открыл папку «Бумага» | форму группы |
Дальше работает лестница из первого параграфа главы, и работает она для каждого вида отдельно: назначена ли для этого вида своя форма? Если нет — платформа строит её сама. Поэтому у одного и того же справочника список может быть нарисован человеком, а карточка построена платформой.
3. Список и выбор: близнецы, но не одно
Эти два вида путают чаще всего: на экране оба показывают таблицу записей. Разница не в том, как они выглядят, а в том, чем кончаются.
| форма списка | форма выбора | |
|---|---|---|
| зачем открыта | посмотреть, найти, завести новое | вернуть одно значение тому, кто спросил |
| двойной щелчок | открывает карточку записи | выбирает запись и закрывает окно |
| чем заканчивается | закрывают, когда посмотрели | закрывается сама, отдав выбранное |
| кто открыл | пользователь из раздела | поле другой формы |
Последняя строка — главная. Форма выбора всегда открыта для кого-то: её попросило поле, и она вернётся к нему с ответом. Поэтому в ней и появляется кнопка «Выбрать», которой в списке нет.
4. Иногда окно выбора не открывается вовсе
Поле ссылочного типа не всегда зовёт форму выбора. Если у справочника включён быстрый выбор и записей немного, платформа показывает их выпадающим списком прямо под полем: выбрали строку — и всё, окна не было. Быстрый выбор — свойство справочника, а не формы.
| сколько записей и как настроено | что увидит пользователь |
|---|---|
| быстрый выбор включён, записей мало | выпадающий список под полем |
| быстрый выбор выключен | окно формы выбора |
Правило то же, что и всюду в этой главе: решение принято в дереве, а форма только исполняет. И следствие то же: увидев выпадающий список там, где ждали окно, ищите причину в свойствах справочника, а не в форме документа.
5. Почему у папки своя карточка
В иерархическом справочнике папка — тоже запись, но разговор о ней другой: у группы «Бумага» нет ни артикула, ни единицы, у неё есть имя и место в иерархии. Поэтому форма группы — не укороченная карточка элемента, а самостоятельный вид формы: у неё свой состав полей, и назначают её отдельно от формы элемента.
Товары
├── Бумага ← группа: имя, родитель
│ ├── Бумага А4 ← элемент: имя, артикул,
│ └── Бумага А3 единица
└── Письменные
Какие реквизиты достаются группе, а какие элементу, задаёт свойство самого реквизита — и это снова правило из дерева, а не решение формы.
6. Сборка у всех одна
Важно не потерять за разнообразием главное: все эти формы платформа собирает по тем же правилам, что мы разобрали. Берёт стандартные реквизиты, свои реквизиты, табличные части, стандартные команды — и раскладывает подряд.
| что различается | что одинаково |
|---|---|
| задача разговора | источники: дерево объекта |
| набор кнопок | порядок полей — как в дереве |
| поведение по двойному щелчку | вид поля — по типу реквизита |
Иначе говоря, видов форм несколько, а правило сборки одно. Отсюда и сходство автоформ во всех конфигурациях: их собирает один механизм по одному описанию.
Для читателя чужой конфигурации это подарок. Открыв незнакомую программу, вы узнаёте автоформу с первого взгляда и сразу понимаете: всё, что в ней есть, лежит в дереве, и ничего сверх этого искать не нужно. А вот встретив окно с группами, страницами и непонятной кнопкой, вы знаете, что за ним стоит человеческий замысел, — и вот его уже надо разбирать.
7. В режиме Предприятия
Откроем четыре окна подряд и назовём вид каждого — это и есть навык, ради которого параграф написан.
-
Откройте список товаров. Это форма списка: в ней много записей и есть кнопка «Создать».
-
Щёлкните дважды по «Ручка шариковая» — открылась форма элемента. Закройте её.
-
Откройте папку «Бумага» двойным щелчком. Открывшееся окно — форма группы: полей меньше, артикула нет.
-
Откройте поступление № 12 и нажмите «…» у поля «Контрагент». Это форма выбора: двойной щелчок по строке закроет окно и подставит контрагента. Нажмите «Отмена» или закройте окно, ничего не выбирая.
Главное в одном абзаце
У одного объекта не одна форма, а несколько: форма списка отвечает на вопрос «какие записи есть», форма элемента — «какова эта запись», форма выбора — «выберите одну», форма группы — «какова эта папка». Платформа не выбирает между ними: форму просит то место, откуда нажали, — команда раздела просит список, строка списка просит карточку, поле ссылочного типа просит форму выбора. Для каждого вида отдельно работает знакомая лестница: если своя форма этого вида не назначена, платформа строит её сама, поэтому у одного справочника список бывает нарисован, а карточка построена. Список и форма выбора похожи только на вид: у выбора другая задача — вернуть значение тому, кто его попросил, и потому двойной щелчок в ней выбирает, а не открывает. При всём разнообразии правило сборки одно, и собранные формы похожи во всех конфигурациях.
Пока всё складывается удачно: платформа делает лица объекта сама, и они работают. И всё же разработчики зачем-то рисуют формы руками — значит, у этого удобства где-то кончается запас. Где?
Контрольные вопросы
- Какие виды форм бывают у справочника и на какой вопрос отвечает каждый?
- Кто решает, какую форму открыть?
- Чем форма выбора отличается от формы списка — не по виду, а по задаче?
- Чем форма группы отличается от формы элемента и почему это отдельный вид, а не укороченная карточка?
- Может ли у одного объекта список быть нарисован человеком, а карточка построена платформой? Почему?
- Что общего у всех автоформ одного объекта?
Упражнения
Назовите вид. Откройте в Предприятии четыре окна из параграфа и для каждого скажите вслух: какой это вид формы, кто её попросил и чем она закончится.
Своё: кто просит. Для каждого действия скажите, какая форма откроется: пользователь нажал «Создать» в списке товаров; выбрал товар в строке поступления; открыл список поступлений из раздела; открыл папку в списке товаров.
Ловушка: «это тот же список». Коллега говорит: «Окно выбора — это тот же список, просто открытый в другом режиме». В чём он прав и в чём ошибается?
Обратный ход. Пользователь рассказывает: «Нажал на кнопку с тремя точками, выбрал строку двойным щелчком, окно само закрылось, и значение подставилось». Какие формы участвовали в этой истории и в каком порядке?
Ответы — в конце части.
§ 1.4. Где у платформы предел: когда автоформ перестаёт хватать
Автоформа поступления показывает всё, что у документа есть: номер, дату, контрагента, склад, таблицу товаров. Ни одного поля не забыто. И всё-таки кладовщик, оформляющий на ней по двадцать поступлений в день, через неделю придёт с просьбой «сделать под работу». Разберём, чего именно ему не хватает, — а заодно поймём, где у платформенной сборки предел.
1. Предел первый: длинный столбец
Платформа ставит поля подряд, в порядке дерева. Пока полей четыре, это незаметно. Когда их полтора десятка, экран превращается в ленту, по которой надо ехать глазами.
как строит платформа как нужно человеку
──────────────────── ──────────────────
Номер ┌ Шапка ─────────┐
Дата │ Номер Дата │
Контрагент │ Контрагент │
Склад │ Склад │
Ответственный └────────────────┘
Комментарий ┌ Товары ────────┐
таблица товаров │ таблица │
└────────────────┘
Слева — как собирает платформа: всё равнозначно, всё в одну колонку. Справа — как это устроено в голове у человека: шапка отдельно, товары отдельно, и служебное внизу. Платформа так не умеет не потому, что слаба, а потому, что не знает, что «Склад» и «Ответственный» — про разное. Это знание есть только у того, кто понимает задачу.
Платформа знает, из чего состоит объект. Она не знает, что из этого важно.
2. Предел второй: ничего не объяснить
В автоформе есть поля и нет слов о них. Нельзя ни пояснить, что значит «Ответственный», ни предупредить, что цену вводят без налога, ни отделить чертой то, что заполняют всегда, от того, что заполняют изредка.
| что хочется сказать пользователю | чем сказать в автоформе |
|---|---|
| «цена без налога» | нечем |
| «эти три поля заполняет кладовщик» | нечем |
| «остальное — бухгалтерия, не трогайте» | нечем |
Пояснения на форме — не украшение. Каждая такая надпись снимает вопрос, который иначе задают вслух по телефону.
3. Предел третий: показывается всё
Автоформа показывает все реквизиты объекта — включая те, которые пользователю видеть незачем: служебные признаки, технические поля, реквизиты, заполняемые программой. Спрятать их нельзя: в автоформе нет способа сказать «этого не показывай».
Обратная сторона того же предела — нельзя и добавить. Если на форме нужно показать что-то, чего у объекта нет — например, остаток товара на складе рядом со строкой, — автоформа этого не сделает: она знает только объект.
4. Предел четвёртый: только стандартные действия
Кнопки автоформы — те, что платформа даёт всем: записать, провести, закрыть. Ни одного своего действия в неё не добавить.
| что нужно в жизни | есть ли в автоформе |
|---|---|
| «Записать» и «Провести» | да |
| «Подобрать товары» из отдельного окна | нет |
| «Заполнить по прошлому поступлению» | нет |
| «Напечатать приходный ордер» | нет |
Последняя строка особенно показательна: печатная форма — обычная потребность любой конторы, и появляется она только вместе со своей формой и своей командой.
5. Предел пятый: ничего не происходит само
Автоформа не считает и не подставляет. Ввели количество и цену — сумма осталась пустой. Выбрали товар — цена не подтянулась. Ошиблись складом — никто не переспросил.
Причину стоит назвать точно, потому что поведение бывает двух родов. То, что следует из свойств, платформа обеспечивает сама: проверка заполнения сработает и в автоформе, потому что задана у реквизита. А то, что нужно описать шагами — «когда изменили количество, умножь его на цену», — пишут кодом, в модуле формы. У автоформы нет описания в дереве, а значит, нет и модуля, который можно было бы открыть: писать некуда. Чтобы у формы появилось место для кода, её придётся сначала сделать своей.
| откуда берётся поведение | работает в автоформе |
|---|---|
| тип реквизита | да |
| проверка заполнения | да |
| пересчёт, подстановка, свой вопрос пользователю | нет |
6. Чего этот список не означает
Пределы легко прочитать как приговор: раз всего этого нет, значит, автоформа — временная мера. Это не так.
| что думают | как на самом деле |
|---|---|
| автоформа медленнее своей | нет, она такая же |
| данные через неё вводить опасно | нет, проверки и права работают одинаково |
| её рано или поздно заменят | у служебных справочников она живёт годами |
| своя форма всегда лучше | своя форма лучше там, где есть что улучшать |
Автоформа перестаёт годиться не вообще, а для конкретной работы конкретного человека. Справочник складов, куда заглядывают раз в квартал, проживёт на автоформе всю жизнь конфигурации. Документ, который оформляют по двадцать раз в день, своей формы попросит быстро.
7. Как понять, что предел достигнут
Признаки одинаковы в любой конторе, и ни один из них не про красоту.
| признак | что за ним стоит |
|---|---|
| одно и то же объясняют новичкам устно | форме нечем объяснить |
| в поля попадает мусор, его чистят потом | форма не мешает ошибиться |
| ввод одного документа занимает минуты | лишние поля, лишние переходы |
| заводят инструкцию «как заполнять» | инструкция должна была стать формой |
Своя форма нужна не тогда, когда автоформа некрасива, а тогда, когда она заставляет человека помнить лишнее.
Проверяются эти признаки не в редакторе, а разговором. Три вопроса тому, кто работает с формой каждый день: что вы делаете в ней чаще всего? где чаще всего ошибаетесь? что приходится держать в голове или подсматривать в бумажке? Ответы и есть список того, чего форме не хватает, — и он всегда короче, чем кажется со стороны.
8. В режиме Предприятия
Посмотрим на предел своими глазами — это займёт пять минут.
-
Откройте любое поступление — например, № 12 — и попробуйте заполнить его так, будто принимаете товар: выберите контрагента, склад, добавьте строку, введите количество и цену.
-
Обратите внимание на сумму в строке. Она не пересчиталась — считать некому.
-
Выпишите на бумагу, чего вам не хватило: пояснений, порядка полей, кнопок, автоматических подстановок.
-
Сохранять не нужно: закройте карточку, отказавшись от записи.
Список, который у вас получился, — это и есть заказ на свою форму. Держите его под рукой: к концу книги вы соберёте форму, которая его закрывает.
Главное в одном абзаце
Автоформа даёт полный доступ к объекту и ничего не забывает, но у неё есть пять пределов, и все они об одном: платформа знает, из чего состоит объект, и не знает, что из этого важно. Поля идут подряд, в порядке дерева, и на длинном документе превращаются в ленту; пояснить, предупредить, разделить смысловые части нечем; показывается всё подряд, а спрятать лишнее или добавить чужое нельзя; кнопки только стандартные, поэтому ни подбора, ни печатной формы; и наконец, ничего не считается и не подставляется само: поведение, которое нужно описать шагами, живёт в коде, а у автоформы модуля нет — писать некуда. Предел достигнут не тогда, когда форма некрасива, а тогда, когда она заставляет человека помнить лишнее: объяснять новичкам устно, чистить мусор в полях, писать инструкцию по заполнению.
Пределы названы. Но из этого не следует, что своя форма нужна везде, где автоформа чего-то не умеет: у своей формы есть цена. Как решать?
Контрольные вопросы
- Почему платформа ставит поля подряд, а не группирует их по смыслу?
- Чего нельзя сказать пользователю в автоформе?
- Что автоформа показывает и чего не может показать?
- Какие действия доступны в автоформе и каких в ней не бывает?
- Почему в автоформе не пересчитывается сумма, хотя проверка заполнения работает?
- По каким признакам видно, что автоформы перестало хватать?
Упражнения
Соберите заказ. Проделайте опыт из параграфа и выпишите не меньше пяти вещей, которых вам не хватило в карточке поступления.
Своё: разложите по пределам. Возьмите свой список и отнесите каждый пункт к одному из пяти пределов: порядок, пояснения, состав, действия, поведение.
Ловушка: «сделаем красиво». Разработчик говорит: «Автоформы уродливы, надо нарисовать свои для всех справочников». Что он упускает и какой вопрос стоит задать вместо этого?
Чужая жалоба. Кладовщик пишет: «Каждый раз спрашиваю, в какое поле писать номер накладной поставщика, и всегда забываю поставить склад». Какие пределы автоформы стоят за этой жалобой?
Ответы — в конце части.
§ 1.5. Когда оставляем автоформу, когда делаем свою
Список набрался — свой или принесённый кладовщиком: тут непонятно, здесь долго, это приходится помнить. Казалось бы, ответ очевиден — рисуем форму. Но прежде чем открывать редактор, стоит посмотреть на другую сторону сделки: у своей формы есть цена, и платят её не один раз.
1. Чем платят за свою форму
Своя форма — не рисунок, а обязательство. Её делают один раз, а живут с ней годами.
| что стоит | в чём проявляется |
|---|---|
| работа | собрать, разложить, проверить на разных размерах окна |
| сопровождение | каждое изменение объекта придётся повторить в форме |
| риск отстать | добавили реквизит — в своей форме он сам не появится |
| новое место для логики | у своей формы есть модуль, и за тем, что в нём заводится, придётся следить |
Третья строка — главная и самая обидная. Автоформа строится заново при каждом открытии и потому всегда показывает объект целиком. Своя форма собрана однажды: новый реквизит в дереве появился, а на форме его нет — и об этом узнают через полгода, когда бухгалтер спросит, куда делось поле.
Автоформа составом не отстаёт от объекта: она каждый раз собирается по дереву. Своя форма отстаёт всякий раз, когда о ней забыли.
2. Правило решения
Рабочее правило простое и опирается не на вид формы, а на работу, которую ею делают.
| объект | обычное решение |
|---|---|
| служебный справочник, куда заглядывают изредка | автоформа |
| справочник, который заполняют время от времени | автоформа, поправленная деревом |
| документ с табличной частью, который оформляют каждый день | своя форма |
| рабочее место, где делают целую задачу | своя форма, и не одна |
Границу удобно держать деревом решений.
часто ли с ней работают?
├─ редко ───────────────► автоформа
└─ часто
что мешает?
├─ ничего ───────────► автоформа
├─ порядок, пояснения► сначала дерево
└─ действия, расчёты► своя форма
3. Дешёвое лечение: поправить дерево
Прежде чем рисовать форму, стоит вспомнить, что автоформа — прямой снимок дерева. Многое из того, что «мешает», лечится в самом объекте, и лечение достаётся бесплатно: оно действует во всех окнах сразу.
| что болит | чем лечится без своей формы |
|---|---|
| поля идут не в том порядке | порядок реквизитов в дереве |
| непонятное имя поля | синоним реквизита |
| забывают заполнить | проверка заполнения у реквизита |
| в поле видно код вместо имени | основное представление справочника |
| ради одного значения открывается окно | быстрый выбор |
| в списке лишние колонки | пользовательская настройка списка — шаги в конце параграфа |
Последняя строка — про то, что читатель уже умеет, сам того не зная: колонки, их порядок и отборы в списке пользователь настраивает себе сам, и это сохраняется.
Правило из этого выходит такое: сначала дерево, потом форма. Если болезнь лечится свойством, форму не рисуют.
4. Чего деревом чинить нельзя
Обратное тоже верно, и об этом стоит сказать прямо. Дерево описывает данные, а не экран. Заводить реквизит ради вида, менять тип ради удобства ввода, разбивать объект на два, чтобы «форма стала короче», — значит чинить не то.
| соблазн | чем кончается |
|---|---|
| реквизит «для галочки на форме» | лишнее поле в базе у всех |
| разбить документ на два ради длины | два документа там, где событие одно |
| сменить тип ради вида поля | данные перестают быть данными |
Если задача про показ — её решает форма. Если про хранение — дерево. Смешивать их дорого: данные переживут не одну форму.
5. Смешанное решение — норма
Выбор не двоичный. В живой конфигурации обычное состояние такое: у документа своя форма, у его списка — автоформа; у главного справочника своя форма элемента, у служебного — ничего своего.
ПоступлениеТоваров
├── форма документа ── своя
└── форма списка ──── авто
Склады
├── форма элемента ── авто
└── форма списка ──── авто
Это не признак недоделанности, а разумная экономия: своё делают там, где на это есть причина, названная словами.
6. Как выглядит решение на словах
Полезно уметь сформулировать его в одну фразу — ту, которую не стыдно сказать заказчику и вспомнить через год.
| плохо | хорошо |
|---|---|
| «автоформа некрасивая» | «кладовщик оформляет двадцать документов в день и путает склад» |
| «сделаем как у людей» | «нужен подбор товаров: сейчас на документ уходит четыре минуты» |
| «потом переделаем» | «пока хватает автоформы: справочник меняют раз в квартал» |
Причина для своей формы — это предложение о работе человека, а не о внешнем виде окна.
7. Изменили объект — проверьте его формы
Из платы за свою форму следует привычка, которую стоит завести сразу, пока форм у вас ещё нет.
| что сделали с объектом | что проверить в его формах |
|---|---|
| добавили реквизит | появилось ли поле; нужно ли оно пользователю |
| переименовали реквизит | не осталась ли на форме старая подпись |
| добавили табличную часть | есть ли таблица на форме |
| удалили реквизит | не осталось ли поле, которому нечего показывать |
Искать эти формы недолго: они лежат внутри самого объекта, в его ветке «Формы». Открыли объект, поменяли — тут же посмотрели, что у него в этой ветке, и если там пусто, работа закончена: автоформа уже всё показала.
История, которая случается в каждой конторе, выглядит так. Товару добавили реквизит «Страна происхождения». В служебных справочниках, живущих на автоформах, поле появилось само. В карточке товара, для которой полгода назад сделали свою форму, не появилось. Через месяц выясняется, что страну никто не заполняет, — не потому, что не хотят, а потому, что её негде ввести.
8. В режиме Предприятия
Попробуем самое дешёвое лечение своими руками — то, для которого не нужен ни редактор форм, ни Конфигуратор.
-
Откройте список товаров и уберите из него колонку — например, код: меню «Ещё» → изменение формы или настройка списка.
-
Закройте список и откройте снова. Колонка не вернулась: настройка сохранилась за вами.
-
Верните колонку на место тем же путём.
-
Подумайте, что это значит для решения о своей форме: часть претензий пользователь способен закрыть сам, ничего не прося у разработчика.
Главное в одном абзаце
Своя форма — не рисунок, а обязательство: её собирают однажды, а сопровождают годами, и главная её особенность в том, что сама за объектом она не поспевает — добавленный реквизит нужно поставить в неё руками. Поэтому решение принимают не по виду окна, а по работе: служебный справочник живёт на автоформе всю жизнь, документ, который оформляют каждый день, своей формы просит быстро. Прежде чем открывать редактор, стоит вылечить дешёвым: порядок реквизитов, синонимы, проверку заполнения, основное представление, быстрый выбор и пользовательские настройки списка действуют во всех окнах сразу. Но чинить деревом то, что относится к показу, нельзя: данные переживут не одну форму. Обычное состояние живой конфигурации — смешанное: где-то своя форма, где-то автоформа, и у каждой своей формы есть причина, названная словами про работу человека.
Причина названа, решение принято: документу нужна своя форма. Значит, пора открыть редактор и собрать первую — и сначала разобраться, из чего вообще состоит форма изнутри.
Контрольные вопросы
- Чем платят за свою форму, кроме времени на её сборку?
- Почему своя форма отстаёт от объекта, а автоформа — нет?
- По какому признаку выбирают между автоформой и своей формой?
- Что из «мешающего» лечится деревом, а не формой? Приведите три примера.
- Почему нельзя менять дерево ради вида формы?
- Как звучит хорошая причина для своей формы?
Упражнения
Разберите свой список. Возьмите заказ, собранный в прошлом параграфе, и разложите его на две стопки: лечится деревом, требует формы.
Своё: три объекта. Для справочника «Склады», справочника «Товары» и документа «ПоступлениеТоваров» решите, что оставить на автоформе, и объясните каждое решение одной фразой про работу.
Ловушка: «своя форма догонит». Разработчик рассуждает: «Сделаю форму по образцу автоформы, а если в объекте что-то поменяется, форма подхватит». В чём он ошибается и чем это грозит через полгода?
Чужая причина. Заказчик пишет: «Форма поступления неудобная, переделайте». Какие три вопроса вы зададите, прежде чем открывать редактор?
Ответы — в конце части.
Ответы к части 1
Ответы собраны здесь, а не под вопросами: подсказка, увиденная сразу после вопроса, отменяет попытку вспомнить. У каждого ответа до трёх ступеней: сам ответ, указание — если ответ не дался сразу — и полное решение там, где рассуждение важнее вывода.
§ 1.1. Автогенерируемая форма: что это и когда срабатывает
К вопросу 1. Ответ. Форма, которую платформа строит сама по описанию объекта: из его реквизитов, табличных частей и стандартных команд.
К вопросу 2. Ответ. Когда объекту не назначено ни одной формы нужного вида — ни основной, ни дополнительной.
К вопросу 3. Ответ. Форма, построенная платформой. Обычную форму тонкий клиент открыть не может и строит управляемую на лету.
К вопросу 4. Указание. В какой момент автоформа появляется?
Полное решение. Автоформа не хранится: её собирают тогда, когда она понадобилась пользователю. До этого момента её не существует — значит, в дереве нечему лежать и в редакторе нечего открывать. Редактор форм правит описание, которое хранится; у автоформы такого описания нет.
К вопросу 5. Ответ. Своих реквизитов формы, своих команд и модуля с обработчиками. Всё, что в ней есть, приходит от объекта.
К вопросу 6. Ответ. Потому что объект и без своих форм полностью доступен пользователю: платформа построит окно сама. Пустая ветка означает решение, а не недоделку.
К упражнению «Найдите автоформы». Ответ. Списка товаров, карточки товара, карточки поступления и окна выбора контрагента в дереве нет — все четыре окна платформа строит сама. Окно отчёта устроено иначе: у отчёта есть своя схема, и о нём книга скажет отдельно.
К упражнению «Своё: предскажите». Ответ. Пользователь увидит список сотрудников, построенный платформой, и сможет делать в нём всё обычное: просматривать, искать, создавать сотрудника, открывать карточку с полями «Должность» и «Телефон», записывать изменения, помечать на удаление.
К упражнению «Ловушка: „форму забыли“». Ответ. Пустая ветка «Формы» означает, что формы не понадобились, а не что их забыли.
Полное решение. Ошибка в том, что отсутствие формы принято за отсутствие окна. Пока хватает того, что строит платформа, своя форма не нужна — и опытный разработчик не делает её «для порядка». Правильный вопрос звучит иначе: чего в автоформе не хватает для работы? Если ответа нет, то и форма не нужна.
К упражнению «Правило по таблице». Ответ. При открытии списка откроется назначенная управляемая форма списка. При щелчке по строке откроется форма элемента, построенная платформой: своей у объекта нет.
§ 1.2. Что попадает в автогенерируемую форму: правила сборки
К вопросу 1. Ответ. Стандартные реквизиты, реквизиты разработчика, табличные части и стандартные команды. Все четыре источника лежат в дереве.
К вопросу 2. Ответ. Реквизиты, которые есть у объекта сами по себе: код, наименование, пометка удаления, ссылка у справочника; номер, дата, признак проведения у документа. Настройки — в окне редактирования объекта, на закладке «Данные», за кнопкой «Стандартные реквизиты».
К вопросу 3. Ответ. Показывать нечего: ссылка — это сам объект, а пометку удаления ставят командой и видят по значку в списке.
К вопросу 4. Ответ. В том же порядке, в каком реквизиты стоят в дереве. Значит, порядок в дереве — это порядок полей на экране, и перестановка реквизитов меняет вид карточки у всех, кто работает с автоформой.
К вопросу 5. Ответ. Тип реквизита: строка даёт поле ввода, число — поле с выравниванием вправо, дата — поле с календарём, булево — флажок, ссылка — поле с кнопкой выбора.
К вопросу 6. Ответ. Групп, страниц, декораций, своих команд, скрытых или переставленных полей, особого поведения. Это не поломка: пока форма показывает нужное в понятном порядке, замысел человека ей не требуется.
К упражнению «Предскажите карточку». Ответ. Поля кода и наименования и стандартные кнопки записи — больше в справочнике «Склады» ничего нет.
К упражнению «Своё: нарисуйте по дереву». Ответ. Сверху код и наименование, дальше в порядке дерева: «Должность» — поле ввода, «ДатаПриёма» — поле с календарём, «Уволен» — флажок, «Руководитель» — поле с кнопкой выбора, открывающее список сотрудников. Внизу кнопки «Записать и закрыть» и «Записать».
К упражнению «Ловушка: поля не видно». Указание. Что должно случиться между правкой дерева и появлением поля у пользователя?
Полное решение. Первая причина — изменение не дошло до базы: разработчик не обновил конфигурацию базы данных либо пользователь работает в сеансе, запущенном раньше. Вторая — смотрят не туда: у объекта есть назначенная форма, и открывается она, а не автоформа; в назначенной форме новый реквизит сам не появляется. Проверять нужно в этом порядке: сначала дошло ли изменение, потом пуста ли ветка «Формы». Предположение «автоформа берёт не все реквизиты» — последнее, что стоит подозревать.
К упражнению «Обратный ход». Ответ. За окном документ: кнопка «Провести и закрыть» бывает только у документов. Три поля сверху — его реквизиты шапки, таблица с четырьмя колонками — табличная часть с четырьмя реквизитами. Скорее всего, это автоформа: групп и страниц не видно.
§ 1.3. Виды автогенерируемых форм: список, элемент, выбор, группа
К вопросу 1. Ответ. Форма списка — какие записи есть; форма элемента — какова эта запись; форма выбора — выберите одну; форма группы — какова эта папка.
К вопросу 2. Ответ. Никто не выбирает заранее: форму просит то место, откуда пользователь нажал. Команда раздела просит список, строка списка — карточку, поле ссылочного типа — форму выбора.
К вопросу 3. Ответ. Задачей. Список открывают, чтобы смотреть и искать; форма выбора открыта для того, кто её попросил, и её дело — вернуть ему одно значение и закрыться.
К вопросу 4. Ответ. У группы другой состав реквизитов: артикул и единица относятся к элементу. Поэтому форма группы — самостоятельный вид со своим составом полей, и назначают её отдельно от формы элемента, а не получают обрезкой карточки.
К вопросу 5. Ответ. Может. Лестница выбора работает для каждого вида формы отдельно: у списка своя форма назначена, у элемента нет — значит, карточку строит платформа.
К вопросу 6. Ответ. Правило сборки: все они собираются из одного описания объекта — стандартные реквизиты, свои реквизиты, табличные части, стандартные команды, порядок как в дереве, вид поля по типу.
К упражнению «Назовите вид». Ответ. Список товаров — форма списка, попросила команда раздела, закроют её вручную. Карточка ручки — форма элемента, попросила строка списка. Папка «Бумага» — форма группы. Окно контрагентов — форма выбора, попросило поле «Контрагент», закроется само, отдав значение.
К упражнению «Своё: кто просит». Ответ. «Создать» — форма элемента для новой записи. Выбор товара в строке поступления — форма выбора товаров (или выпадающий список, если включён быстрый выбор). Список поступлений из раздела — форма списка. Папка в списке товаров — форма группы.
К упражнению «Ловушка: „это тот же список“». Ответ. Прав в том, что оба окна показывают записи одного справочника и похожи на вид. Ошибается в том, что это одна форма: форма выбора — отдельный вид со своей задачей.
Полное решение. Проверяется поведением. В списке двойной щелчок открывает карточку, в форме выбора — возвращает значение и закрывает окно. В списке есть «Создать», в форме выбора — «Выбрать». И назначают их по отдельности: у объекта может быть своя форма списка и построенная платформой форма выбора.
К упражнению «Обратный ход». Ответ. Сначала была открыта форма документа — в ней поле ссылочного типа. Кнопка с тремя точками попросила форму выбора справочника. Двойной щелчок в форме выбора вернул значение полю и закрыл окно. Итого две формы: та, что просила, и та, что ответила.
§ 1.4. Где у платформы предел: когда автоформ перестаёт хватать
К вопросу 1. Ответ. Потому что она знает состав объекта и не знает, что в нём важно: «Склад» и «Ответственный» для неё одинаковые реквизиты. Смысловые группы видит только человек, понимающий задачу.
К вопросу 2. Ответ. Ничего: в автоформе нет ни надписей, ни пояснений, ни разделителей. Предупредить, что цену вводят без налога, нечем.
К вопросу 3. Ответ. Показывает все реквизиты объекта, включая служебные. Не может ни спрятать лишнее, ни показать то, чего у объекта нет, — например остаток товара рядом со строкой.
К вопросу 4. Ответ. Только стандартные: записать, провести, закрыть. Своих действий — подбора, заполнения по прошлому документу, печати — в ней не бывает.
К вопросу 5. Указание. Поведение поведению рознь: одно следует из свойства, другое нужно описать шагами.
Полное решение. Проверка заполнения задана свойством реквизита, и платформа исполняет её сама — для этого ничего писать не надо. Пересчёт суммы шагами не описан нигде: «когда изменили количество, умножь на цену» — это код, а писать его в автоформе негде: у автоформы нет описания в дереве, а значит, нет и модуля. Чтобы появилось место для кода, форму сначала делают своей.
К вопросу 6. Ответ. Одно и то же объясняют новичкам устно; в полях появляется мусор; ввод одного документа занимает минуты; заводят инструкцию «как заполнять». Все признаки — про работу, а не про красоту.
К упражнению «Соберите заказ». Ответ. Свободный. Типичный список: нет порядка полей и группировки шапки; не сказано, что вводить в «Комментарий»; видны служебные реквизиты; нет кнопки подбора товаров; сумма не считается; цена не подставляется из регистра цен.
К упражнению «Своё: разложите по пределам». Ответ. Свободный. Порядок: группировка шапки. Пояснения: подписи и предупреждения. Состав: лишние поля, отсутствие остатка. Действия: подбор, печать. Поведение: пересчёт и подстановка.
К упражнению «Ловушка: „сделаем красиво“». Ответ. Он упускает, что своя форма стоит работы и сопровождения, а красота сама по себе никому не помогает.
Полное решение. Автоформа не уродлива — она равнодушна: показывает всё в порядке дерева. Для справочника, куда заглядывают раз в квартал, этого хватает навсегда. Вопрос, который стоит задать вместо «нарисуем всем»: кому эта форма мешает работать и чем именно? Если ответа нет, своя форма добавит работы и не добавит пользы.
К упражнению «Чужая жалоба». Ответ. Два предела. «Спрашиваю, в какое поле писать номер накладной» — нечем объяснить: нет ни подписи, ни пояснения. «Забываю поставить склад» — форма не мешает ошибиться: поле не выделено, порядок полей не ведёт, а проверка заполнения у реквизита, видимо, не включена.
§ 1.5. Когда оставляем автоформу, когда делаем свою
К вопросу 1. Ответ. Сопровождением: каждое изменение объекта придётся повторить в форме. Плюс риском отстать и новым местом для логики — модулем формы, за которым тоже нужно следить.
К вопросу 2. Ответ. Автоформа строится заново при каждом открытии, по текущему описанию объекта. Своя форма собрана однажды: новый реквизит в неё нужно поставить руками.
К вопросу 3. Ответ. По работе, а не по виду окна: как часто с формой работают и что именно мешает. Служебный справочник живёт на автоформе, ежедневный документ просит своей формы.
К вопросу 4. Ответ. Порядок полей — порядком реквизитов; непонятное имя — синонимом; забытые значения — проверкой заполнения; код вместо имени — основным представлением; лишние колонки — настройкой списка у самого пользователя.
К вопросу 5. Указание. Что дерево описывает и что живёт дольше — данные или окно?
Полное решение. Дерево описывает данные, а не экран. Реквизит, заведённый ради вида формы, останется в базе у всех и навсегда; документ, разрезанный на два ради длины окна, разрежет и событие, которое на деле одно. Формы меняются чаще, чем данные, и подгонять данные под текущий вид окна — значит платить дважды.
К вопросу 6. Ответ. Она говорит о работе человека: «кладовщик оформляет двадцать документов в день и путает склад», «на документ уходит четыре минуты из-за ручного подбора». Не о красоте и не о «сделаем как у людей».
К упражнению «Разберите свой список». Ответ. Свободный. Ожидаемо: в стопку «дерево» уходят порядок полей, подписи, проверка заполнения, лишние колонки; в стопку «форма» — группы и страницы, пояснения, подбор товаров, пересчёт суммы, печать.
К упражнению «Своё: три объекта». Ответ. «Склады» — автоформа: справочник меняют раз в квартал. «Товары» — автоформа или лёгкая правка дерева: заполняют изредка, полей немного. «ПоступлениеТоваров» — своя форма: документ оформляют каждый день, нужны подбор, пересчёт и порядок полей под руку кладовщика.
К упражнению «Ловушка: „своя форма догонит“». Ответ. Не подхватит: своя форма собрана один раз и новые реквизиты сама не показывает.
Полное решение. Ошибка в слове «по образцу»: мастер заполнит форму тем, что есть у объекта сейчас, и на этом связь кончится. Через полгода в объекте появится реквизит, в форме его не будет, и никто этого не заметит — поле просто не заполняют. Поэтому у своей формы заводят привычку: изменили объект — откройте его формы и проверьте.
К упражнению «Чужая причина». Ответ. Спросить о работе, а не о внешнем виде. Что вы делаете в этой форме чаще всего? Где чаще всего ошибаетесь? Что приходится держать в голове или подсматривать в бумажке? Из ответов получится список, который можно разложить на «лечится деревом» и «требует формы».
§ 2.1. Форма как объект конфигурации: где она живёт в дереве
Откройте карточку бумаги, а следом карточку ручки: на экране два окна. Поля в них одни и те же и стоят в одном порядке — различаются данные да то, что читатель успел в окне пораскрывать. Окон два, а описание, по которому они построены, одно. С этого различия и начинается устройство формы: то, что лежит в дереве, и то, что видит пользователь, — разные вещи, и путать их дорого.
1. Чертёж и окно
Форма в дереве конфигурации не показывается пользователю. Она описывает, каким должно быть окно: какие поля, в каком порядке, с какими кнопками. Окно по этому описанию платформа строит каждый раз заново — и столько раз, сколько понадобится.
одно описание много окон
ФормаТовара ──┬──► Бумага А4
├──► Ручка шариковая
└──► Папка-регистратор
Форма — чертёж окна, а не само окно: по одному чертежу строится сколько угодно окон.
В дереве, иначе говоря, лежит чертёж той самой реплики, о которой мы говорим с первой главы: реплику произносит окно, а форма задаёт, из чего эта реплика состоит.
Отсюда и правило чтения: когда говорят «поправь форму», речь о чертеже, и поправка отзовётся во всех окнах сразу. А когда говорят «у меня открыта форма товара», речь об окне — одном из многих, построенных по этому чертежу.
образ форма — чертёж окна
строго объект конфигурации с именем
и описанием
адрес ветка «Формы» внутри объекта
2. Что лежит внутри формы
Объект «форма» хранит не картинку, а несколько списков и модуль. Списки отвечают на разные вопросы, и разделены они не случайно.
| часть формы | на какой вопрос отвечает |
|---|---|
| реквизиты формы | какие данные форма держит у себя |
| элементы | из чего сложено окно и в каком порядке |
| команды | что пользователь может сделать |
| параметры | с чем форму открыли |
| модуль формы | что делать в ответ на действие |
Оговорюсь сразу: это части описания формы, а не части окна. Две строки в таблице стоят особняком даже среди них. Параметры — не часть окна, а его вход: то, что форма получает в момент открытия, ещё до того, как окно появилось. Модуль — не описание, а действие: остальные части рассказывают, каким быть окну, а он говорит, что делать в ответ на нажатие. В этой книге мы модуль не пишем — знаем, что он есть и где лежит.
Первая же строка требует оговорки, которую придётся повторить не раз. Реквизит формы — не то же самое, что реквизит объекта. Артикул товара — реквизит объекта: он задан справочнику и хранится в базе. А флажок «показывать подробности», который нужен, пока окно открыто, и никуда не записывается, — реквизит формы. Первые заданы в ветке объекта, вторые — внутри формы, и разбираться с ними будем в следующей главе книги.
3. У каждой формы один хозяин
Форма не висит в воздухе: она принадлежит объекту и лежит в его ветке. Поэтому полное имя формы всегда двойное — чей объект и какая форма.
Справочники
├── Товары
│ └── Формы
│ └── ФормаЭлемента ← форма товара
└── Контрагенты
└── Формы
└── ФормаЭлемента ← другая форма
Это две разные формы, просто с совпадающими именами, и друг другу они не мешают: имя формы уникально внутри своего объекта, а не во всей конфигурации. Имена от этого получаются короткими, но разговор требует точности. «Открой форму элемента» без указания объекта не адресует ничего.
Форма принадлежит одному объекту. Имя формы имеет смысл только вместе с именем хозяина.
4. Общая форма: окно без предметного хозяина
У правила есть исключение, и оно честное: пометим его сейчас, а развернём в главе об особых формах. Если окно не про один объект — настройки программы, служебный диалог, — привязывать его к справочнику незачем. Такие формы лежат отдельно.
Общие
└── Общие формы
└── НастройкиПрограммы
Устроена общая форма из тех же частей: те же списки, тот же модуль. Разница в том, что предметного хозяина у неё нет, а значит, нет и объекта, который подставился бы в неё сам: данные попадают в такую форму только через параметры и собственные реквизиты формы. Особые формы — тема отдельной главы ближе к концу книги; пока достаточно знать, что ветка такая есть и что попадают в неё по причине, а не по привычке.
5. Имя и синоним: адрес и подпись
У формы, как у всякого объекта конфигурации, есть имя и есть синоним. Имя — служебное: по нему на форму ссылаются настройки и код. Синоним — человеческое название, его видит тот, кто выбирает форму из списка форм.
| свойство | кто читает | пример |
|---|---|---|
| имя | платформа, настройки, код | ФормаЭлемента |
| синоним | человек | Форма элемента |
| комментарий | разработчик | «переписана под склад» |
Заголовок окна к этой паре отношения не имеет: его платформа складывает из представления объекта-хозяина — то есть из того, как объект называет себя пользователю; обычно это его синоним. Так что имя формы в заголовке не появится, какое бы имя ей ни дали.
6. Вид формы — не имя формы
Здесь спотыкаются почти все. Виды форм — элемента, списка, выбора, группы — мы разобрали в прошлой главе. Кажется, что вид задаётся именем: назвал форму «ФормаЭлемента» — получил форму элемента. Это не так.
| что задаёт | чем задаётся | где живёт |
|---|---|---|
| имя формы | разработчиком, произвольно | свойство самой формы |
| назначение формы | ссылкой из объекта | свойства объекта-хозяина |
Форму можно назвать «Карточка», «ФормаТовара» или «Ф1» — видом элемента она станет тогда, когда справочник укажет её как свою основную форму элемента. Имя — это адрес, по которому форму находят; назначение — решение хозяина, кем эта форма ему приходится. Как объект указывает на форму, разберём дальше в этой главе.
Имя формы не делает её формой элемента. Вид назначает объект, а не название.
7. В Конфигураторе
Три коротких обхода. Ничего не создаём и не меняем — только читаем дерево.
-
Раскройте справочник «Товары» и найдите ветку «Формы». Она пуста — мы это уже видели. Сделайте то же для справочника «Контрагенты» и документа «ПоступлениеТоваров»: пусто везде.
-
Откройте свойства справочника «Товары» и найдите группу свойств, где указываются основные формы объекта. Поля пустые — это они связывают объект с формой.
-
Найдите в дереве ветку «Общие» и в ней «Общие формы». Она тоже пуста. Запомните адрес: когда встретите окно, которое не про один объект, искать его форму нужно здесь.
Вывод из обхода неожиданный только на первый взгляд: в нашей конфигурации не задано ни одной формы — и она полностью работает, потому что окна строит платформа. В типовых конфигурациях всё наоборот: формы заданы почти везде, и читать их мы научимся. Первую форму в этом дереве создадим мы.
Главное в одном абзаце
Форма в дереве конфигурации — не окно, а его чертёж: по одному описанию платформа строит столько окон, сколько понадобится, и правка чертежа отзывается во всех сразу. Внутри формы лежат списки — реквизиты формы, элементы, команды, параметры — и модуль; реквизиты формы не путать с реквизитами объекта: первые нужны, пока открыто окно, вторые хранятся в базе. Каждая форма принадлежит одному объекту и лежит в его ветке «Формы», поэтому имя формы имеет смысл только вместе с именем хозяина, а одинаковые имена у разных объектов друг другу не мешают; формы, которые не про один объект, лежат отдельно, в общих формах. Имя — это адрес, по которому форму находят; кем форма приходится объекту — формой элемента, списка, выбора, — решает не имя, а ссылка из свойств самого объекта.
Ветка «Формы» пуста, и мы знаем, что в ней должно появиться: объект с именем, списками и модулем. Составлять эти списки с нуля, поле за полем, — работа на полдня. А нельзя ли получить основу формы сразу готовой?
Контрольные вопросы
- Чем форма в дереве отличается от окна на экране?
- Из каких частей состоит объект-форма и на какой вопрос отвечает каждая?
- Почему у справочника «Товары» и у справочника «Контрагенты» формы могут называться одинаково?
- Что задаёт имя формы, а что — назначение формы? Где живёт каждое решение?
- Чем реквизит формы отличается от реквизита объекта?
- В каком случае форма попадает в общие формы, а не в ветку объекта?
- Почему наша конфигурация работает, хотя ни одной заданной формы в ней нет?
Упражнения
Прочтите дерево. Пройдите по «Канцтоварам» и выпишите, у каких объектов есть ветка «Формы». Для каждого скажите, что означает пустая ветка.
Своё: назовите хозяина. Коллега говорит: «открой форму списка», «поправь форму элемента», «в форме выбора нет кнопки». Для каждой фразы скажите, какого уточнения не хватает, чтобы понять, о чём речь.
Ловушка: «назвал — значит сделал». Разработчик создал у справочника «Товары» форму с именем «ФормаСписка» и говорит: «теперь список товаров открывается моей формой». Прав ли он и что проверить в первую очередь?
Обратный ход. В чужой конфигурации у документа в ветке «Формы» лежат три формы, а в свойствах документа указана как основная только одна. Что это означает и где искать две остальные в работе программы?
На чтение. В дереве встретилась форма в ветке «Общие формы». Какие выводы о ней можно сделать сразу, ещё не открыв её в редакторе?
Ответы — в конце части.
§ 2.2. Конструктор формы: первое знакомство
Основу формы действительно можно получить готовой. Как только вы добавляете объекту форму, на экране открывается конструктор и задаёт свои вопросы. Их немного, и почти на все есть разумный ответ по умолчанию — а начать с пустого места конструктор тоже позволяет, только предлагать этого не станет.
1. Конструктор приходит сам
Инструмент, который собирает форму, называется конструктором формы. Его не нужно искать в меню: при создании формы он вызывается автоматически. Добраться до создания можно двумя дорогами — обе ведут в одно место.
| откуда начинаем | что делаем |
|---|---|
| окно редактирования объекта | закладка «Основное», кнопка «Добавить» |
| дерево конфигурации | встать на ветку «Формы» объекта и добавить |
Инструмент один, но ведёт себя по-разному: конструктор читает, какие виды форм свойственны этому объекту, и лишнего не показывает. Оттого документация платформы и говорит о конструкторе форм справочника, конструкторе формы документа, конструкторе формы регистра сведений — по объекту, для которого он вызван.
Конструктор предлагает не всё подряд, а только то, что свойственно этому объекту: набор видов форм читается из его описания.
2. Первый вопрос: какая это форма
Конструктор начинает с того, о чём мы говорили в прошлой главе, — с вида формы. Справочнику он предлагает шесть вариантов.
| выбрали | что получите |
|---|---|
| форма элемента | окно одной записи: поля справочника |
| форма группы | окно папки — если у справочника есть иерархия |
| форма списка | окно с таблицей записей |
| форма выбора | окно, открытое ради выбора одной записи |
| форма выбора группы | то же, но выбирают папку |
| произвольная форма | пустая основа: раскладывать будете сами |
Выбор здесь не про внешность, а про разговор: мы говорим конструктору, о чём будет окно, и он раскладывает содержимое под этот разговор. Последняя строка — для случая, когда готовая раскладка мешает: произвольная форма приходит пустой, и всё, что в ней появится, положите туда вы.
У документа набор короче — формы документа, списка, выбора и произвольная: папок у документов не бывает, а значит, нет и форм группы. Набор, как видите, не выдуман конструктором, а прочитан по объекту.
Оговорка для тех, кому она встретится. Если конфигурация ведётся только в управляемом режиме — а в нашей это так, — конструктор больше ни о чём не спрашивает. В конфигурации, где разрешены и обычные формы, он сначала уточнит, какую из двух создавать; про два режима форм мы говорили во вводной главе.
3. Откуда конструктор берёт содержимое
А берёт он его оттуда же, откуда его берёт платформа, когда строит автоформу: из описания объекта. Реквизиты, табличные части, стандартные команды — всё раскладывается по тем же правилам, которые мы разобрали в прошлой главе.
дерево объекта ──► конструктор ──► форма
реквизиты один раз лежит
табличные в дереве
части
Отсюда главное свойство первой своей формы: она начинается как снимок автоформы. Не «почти такая же» — та же самая, только записанная в дерево и отданная вам в руки. Строго это значит вот что: конструктор заполняет реквизиты формы и элементы по тем же правилам, по которым платформа строит автоформу, — и в редакторе обе эти вкладки открываются уже не пустыми.
Своя форма начинается там, где автоформа заканчивается: конструктор снимает с объекта тот же снимок и кладёт его в дерево.
И сразу следствие, о котором мы говорили, когда взвешивали цену своей формы. Снимок сделан один раз. Добавите завтра объекту реквизит — всё, что платформа строит сама, покажет его сразу, а эта форма не покажет: она уже не строится заново, она хранится. Пока форма не назначена объекту, автоформа того же вида тоже продолжает строиться — и новый реквизит в ней появится.
4. Остальные вопросы
Кроме вида формы конструктор спрашивает немного.
| вопрос | что отвечаем сейчас |
|---|---|
| имя формы | оставляем предложенное |
| синоним и комментарий | оставляем как есть |
| «Назначить форму основной» | снимаем отметку нарочно |
| кнопка «Готово» или «Далее» | нажимаем «Готово» |
Две строки требуют пояснения. Отметка «Назначить форму основной» — это ровно та ссылка из свойств объекта, о которой шла речь в прошлом параграфе: поставили её — справочник начал указывать на нашу форму. Конструктор предлагает сделать это заодно; мы отметку снимем и назначим форму руками — чтобы увидеть своими глазами, что создание формы и её назначение объекту два разных действия, а не одно.
А «Далее» ведёт на второй шаг, где выбирают состав реквизитов, число колонок и вид каждого поля. Нам туда рано: сейчас важно увидеть раскладку по умолчанию, а не спорить с ней. Нажимаем «Готово» — конструктор размещает элементы сам и открывает форму.
5. Чего конструктор не делает
Соблазн считать конструктор умным велик, а список его отказов короткий и полезный.
| чего ждут | что на самом деле |
|---|---|
| «разложит поля удобно» | разложит по порядку из дерева |
| «поймёт, что тут главное» | главного не знает: всё равноправно |
| «подхватит изменения объекта» | не подхватит: снимок сделан один раз |
| «заменит автоформы» | заменит одну — ту, что назначат |
Последняя строка стоит отдельного слова. Создав форму элемента, вы не отменили автоформы списка, выбора и группы: для них ничего не изменилось, платформа по-прежнему строит их сама. Своя форма занимает ровно одно место в разговоре — то, на которое её поставили.
6. В Конфигураторе
Создаём первую форму. Это первое изменение конфигурации в книге — до сих пор мы только читали дерево.
-
В дереве конфигурации раскройте справочник «Товары», встаньте на ветку «Формы» и добавьте форму. Конструктор откроется сам.
-
Выберите вид «Форма элемента справочника». Имя, синоним и комментарий оставьте предложенные.
-
Снимите отметку «Назначить форму основной» — назначать будем отдельно.
-
Нажмите «Готово». Откроется редактор формы — пока просто посмотрите на него и ничего не меняйте.
-
Вернитесь к дереву: ветка «Формы» у справочника «Товары» больше не пуста.
Теперь проверьте, что изменилось для пользователя. Запустите Предприятие и откройте карточку любого товара. Если Предприятие попросит обновиться — обновитесь; почему это вообще требуется, разберём дальше в этой главе. Она открылась ровно такой же, как раньше, — потому что справочник на нашу форму пока не ссылается. Форма есть, а разговор идёт по-прежнему через автоформу.
Главное в одном абзаце
Форму собирает конструктор, и вызывать его не нужно — он открывается сам, как только объекту добавляют форму, и предлагает только те виды форм, которые этому объекту свойственны, вплоть до произвольной — пустой. Первый вопрос конструктора — какая это форма: элемента, списка, выбора, группы, — и это вопрос не о внешности, а о том, про что будет разговор. Содержимое конструктор берёт из описания объекта по тем же правилам, по которым платформа строит автоформу, поэтому первая своя форма — это снимок автоформы, положенный в дерево; снимок сделан один раз, и дальше форма за объектом не следует. Остальные вопросы конструктора — имя, синоним и отметка «назначить основной»; последняя ставит ту самую ссылку из свойств объекта, и создание формы и её назначение — два разных действия. Пока форма не назначена, пользователь её не увидит: платформа продолжает строить автоформу.
Форма в дереве есть, и редактор открыт. На экране несколько панелей, дерево элементов и превью окна — всё это надо научиться читать. С чего начать?
Контрольные вопросы
- Как вызывается конструктор формы и почему его не ищут в меню?
- Почему у справочника и у документа конструкторы разные?
- О чём на самом деле спрашивает конструктор, предлагая выбрать вид формы?
- Откуда конструктор берёт содержимое будущей формы?
- Почему первую свою форму называют снимком автоформы и чем это обернётся через полгода?
- Что делает отметка «назначить форму основной» и почему мы её сняли?
- Мы создали форму элемента. Что изменилось для формы списка того же справочника?
Упражнения
По образцу. Создайте в «Канцтоварах» форму элемента для справочника «Контрагенты» — тем же порядком, не назначая её основной. Проверьте в Предприятии, что карточка контрагента открывается по-прежнему.
Своё: предскажите набор. Прежде чем открывать конструктор для документа «ПоступлениеТоваров», выпишите, какие виды форм он предложит и что окажется в форме документа. Потом откройте и сверьте.
Ловушка: «форма создана — дело сделано». Разработчик создал форму элемента для справочника и отчитался: «карточку переделал». Пользователь говорит, что ничего не изменилось. Оба правы — объясните, что произошло.
Обратный ход. В чужой конфигурации форма справочника показывает поля не в том порядке, в каком они идут в дереве объекта. Что это говорит о её истории?
На чтение. Объекту год назад добавили реквизит. В форме списка он виден, в форме элемента — нет. Что из этого следует про обе формы?
Ответы — в конце части.
§ 2.3. Редактор формы: три области и предпросмотр
Начать стоит с того, что это не одно окно, а шесть редакторов, сложенных в одно. Каждый занимается своей частью формы — теми самыми списками, которые мы перечисляли, — и переключаются они закладками. Плюс снизу набросок будущего окна. Разберём, кто за что отвечает, и заведём привычку читать форму именно отсюда.
1. Шесть редакторов в одном окне
Документация платформы называет редактор форм группой из шести связанных между собой редакторов — и это тот случай, когда её слова стоит просто перечислить.
| редактор | чем занят |
|---|---|
| элементов | из чего сложено окно |
| командного интерфейса | что стоит в меню и панелях формы |
| реквизитов | какими данными форма располагает |
| команд | что форма умеет делать |
| параметров | с чем её открывают |
| модуля формы | код обработчиков |
В нижней части окна — форма в режиме предварительного просмотра: набросок того, что увидит пользователь. Он показывает раскладку — где встанет элемент, — но не работу: значения реквизитов не заполнены, обработчики не выполняются. Зато сразу видно, куда попадёт поле, которое вы только что перетащили.
Редактор формы — не рисовалка окна, а шесть списков плюс набросок. Окно получается из списков, а не наоборот.
2. Три вопроса, на которые отвечает форма
Из шести редакторов три несут главную нагрузку, и держать в голове надо именно их. Проще всего запомнить как три вопроса об одном разговоре.
реквизиты о чём говорим ← данные
элементы что видно ← окно
команды что можно ← действия
Порядок здесь не случаен. Данные первичны: элемент, которому нечего показывать, бессмыслен, а команда, которой нечего делать, бесполезна. Поэтому и читают форму в этом порядке, и собирают её так же.
| вопрос читателя | куда смотреть |
|---|---|
| откуда это поле берёт значение | реквизиты |
| почему поля стоят в таком порядке | элементы |
| что делает эта кнопка | команды |
Остальные три редактора в этой главе только назовём. Командный интерфейс формы — тема главы о командах; параметры — разговор об открытии формы; модуль мы не пишем вовсе.
3. Реквизиты: чем форма располагает
Здесь перечислено то, что форма держит у себя, пока открыта. После конструктора список не пуст: в нём уже есть строка, которую мы не заводили, — через неё форма и связана с товаром. Как она устроена, разберём в следующей главе, здесь достаточно увидеть, что она есть.
Важно не потерять различение, о котором мы условились. В этом редакторе живут реквизиты формы. Реквизиты объекта — артикул, единица — заданы в дереве справочника, и форма получает их не отсюда.
4. Элементы: из чего сложено окно
Структура окна — иерархическая, и корень у неё один: элемент «Форма». Всё остальное вложено в него.
Форма
├── Наименование ← поле
├── Артикул ← поле
├── Группа «Учёт» ← группа
│ └── ЕдиницаИзмерения ← поле
└── Записать ← кнопка
Виды элементов немногочисленны: группа, поле, таблица, кнопка, декорация. За каждым — своя роль: группа собирает, поле показывает данные, таблица показывает их строками, кнопка запускает действие, декорация не делает ничего, кроме подписи или картинки.
Структуру меняют командами панели, контекстным меню — или перетаскиванием: берут реквизит в редакторе реквизитов и переносят в элементы, и там появляется поле. Второй путь длиннее: добавить элемент, а потом указать ему, откуда брать данные. Это и есть тот жест, которым форма связывается с данными; мы к нему вернёмся, когда дойдём до связи элемента с реквизитом.
Поле не «показывает реквизит» по случайности: его либо перетащили из реквизитов, либо добавили и указали, откуда брать данные.
5. Команды: что форма умеет
Редактор команд перечисляет действия. А вот где эти действия увидит пользователь, решается в другом месте — и путей к экрану у команды два.
| путь команды к пользователю | где задаётся |
|---|---|
| кнопкой в структуре окна | элементы |
| в панели навигации или командной панели формы | командный интерфейс формы |
Отсюда понятная ловушка: команда объявлена, кнопки не видно — и ошибки в этом нет, её просто никуда не вынесли. И обратный случай: кнопка на форме есть, а в списке команд формы соответствующей строки нет — за такой кнопкой стоит стандартная команда, которую форма не объявляла, а получила от объекта.
6. Палитра свойств: где живут настройки
Списки отвечают на вопрос «что есть», а на вопрос «как себя ведёт» отвечает палитра свойств: выделили элемент — справа его свойства. Выделили корневой элемент «Форма» — увидели свойства самой формы.
Правило то же, что и во всей книге: если что-то ведёт себя не так, как ждали, ищите заданное правило. В редакторе форм оно почти всегда в палитре свойств — у элемента, у реквизита или у самой формы.
7. В Конфигураторе
Открываем форму, созданную в прошлом параграфе, и обходим её.
- Пройдите по закладкам и назовите вслух, чем занят каждый редактор. Шесть названий — хватит одного круга, чтобы они улеглись.
-
В редакторе элементов раскройте структуру и найдите корневой элемент «Форма». Выделите его и посмотрите палитру свойств: это свойства всей формы.
-
Выделите поле наименования и сравните его свойства со свойствами формы — набор другой, потому что и предмет другой.
-
Посмотрите на предпросмотр внизу и сравните с карточкой товара в Предприятии. Отличия есть, и они ожидаемы: предпросмотр показывает раскладку, а не работу.
Ничего не меняйте: цель обхода — научиться смотреть, а не править.
Главное в одном абзаце
Редактор формы — это шесть редакторов в одном окне: элементов, командного интерфейса, реквизитов, команд, параметров и модуля, а внизу набросок будущего окна, который показывает раскладку, но не работу. Главную нагрузку несут три: реквизиты отвечают на вопрос «о чём говорим», элементы — «что видно», команды — «что можно сделать», и читать форму стоит в этом порядке, потому что элемент без данных пуст, а команда без дела бесполезна. Структура элементов иерархическая, её корень — элемент «Форма», а виды элементов немногочисленны: группа, поле, таблица, кнопка, декорация. Поле появляется из реквизита — перетаскиванием или указанием, откуда брать данные, — и это тот жест, которым окно связывается с данными. К пользователю команда попадает двумя путями: кнопкой в структуре окна или через редактор командного интерфейса формы. А на вопрос «как себя ведёт» отвечают не списки, а палитра свойств: у элемента, у реквизита или у самой формы.
Читать форму мы научились, и форма в дереве лежит. Пользователь между тем по-прежнему видит автоформу — справочник о нашей работе не знает. Чем именно ему об этом сообщают?
Контрольные вопросы
- Почему редактор формы называют группой редакторов, а не одним окном?
- На какие три вопроса отвечают реквизиты, элементы и команды?
- Почему форму читают именно в этом порядке, а не наоборот?
- Что показывает предпросмотр внизу и чего он не показывает?
- Какой элемент стоит в корне структуры и что означают его свойства?
- Чем отличается вопрос «есть ли такое действие» от вопроса «видно ли оно»?
- Где искать ответ на вопрос «почему этот элемент ведёт себя так»?
Упражнения
По образцу. Пройдите по шести закладкам формы товара и для каждой скажите одной фразой, на какой вопрос она отвечает.
Своё: три вопроса к чужому окну. Возьмите любое окно в Предприятии и задайте ему три вопроса — о чём, что видно, что можно. Ответы, которые вы знаете, отметьте; остальные оставьте на потом.
Ловушка: «нарисую окно и заполню». Разработчик собирается сначала разложить поля, а потом придумать, откуда они берут значения. Почему из этого выйдет лишняя работа?
Обратный ход. В форме есть кнопка, но в редакторе команд нужного действия не видно. Какие объяснения этому возможны?
На чтение. В структуре элементов чужой формы вы видите группу, в ней три поля и таблицу, а рядом — декорацию. Что из этого показывает данные, а что нет?
Ответы — в конце части.
§ 2.4. Назначение формы объекту
Сообщают одной строкой в свойствах объекта. Справочник хранит список того, чем он отвечает на каждый повод: вот этой формой — на открытие карточки, вот этой — на открытие списка. Пока строка пуста, повод обрабатывает платформа. Как только в ней появилось имя формы, отвечать начинает она.
1. Где живёт назначение
Адрес точный, и запомнить его стоит: окно редактирования объекта, закладка «Формы», группа свойств «Основные формы». Там по строке на каждый вид действия.
Справочник «Товары»
└── Формы (закладка)
└── Основные формы
├── элемента ─── ФормаЭлемента
├── группы ─── (пусто)
├── списка ─── (пусто)
└── выбора ─── (пусто)
Обратите внимание, где это лежит: в свойствах объекта, а не формы. Годится ли форма на эту роль, видно по её устройству — по тому, чем она в себе распоряжается; об этом вся следующая глава. Но выбор делает хозяин: форма не назначает себя сама.
Пригодность формы определяет её устройство, а выбор — объект. Два разных решения, и принимают их в разных местах.
2. Что значит «основная»
Слово выбрано точно. Основная — та, которую платформа откроет, если при вызове не сказано, какую именно открыть. А сказать можно: команда или код умеют потребовать конкретную форму по имени.
| как открыли | какая форма откроется |
|---|---|
| двойным щелчком, командой раздела | основная для этого вида |
| вызовом, где форма указана явно | указанная |
| основная не назначена | построенная платформой |
Соберём эти случаи в одну лестницу — но сначала следствие, которое удивляет: форм одного вида у объекта может быть несколько. Основной будет одна, остальные открываются явным вызовом — из команды, из другой формы. Пустая строка «Основная форма списка» при трёх формах списка в ветке — не ошибка, а решение: ни одна из трёх сама не откроется, а двойной щелчок по-прежнему приведёт к форме, построенной платформой.
3. Лестница, у которой теперь видно оба конца
В первой главе мы разбирали, как платформа выбирает, что показать. Тогда было видно только нижнюю ступень — автоформу. Теперь видно и верхнюю.
1. основная форма этого вида назначена?
да → открываем её
нет ↓
2. платформа строит форму сама
Ступеней ровно две, и для объектов, о которых идёт речь в этой книге — справочников, документов, — вторая срабатывает без исключений. Поэтому не бывает так, что окно не открылось, раз форму забыли назначить: не назначили — построит платформа. Назначение меняет не наличие окна, а его содержание.
| что задаёт назначение | чего не задаёт |
|---|---|
| какое окно откроется по умолчанию | будет ли окно вообще |
| чьими глазами пользователь увидит объект | что хранится в базе |
4. Чего назначение не делает
Три отказа, за которые потом благодарят.
Назначение не меняет саму форму. Она как лежала в дереве, так и лежит: её содержимое не пересобирается и не сверяется с объектом. Тот снимок, который сделал конструктор при создании формы, остаётся ровно таким, каким был.
Назначение не запрещает остальные формы. Другие формы того же вида по-прежнему открываются — просто их надо позвать по имени.
Назначение не отменяет автоформы других видов. Назначили форму элемента — список, выбор и группа остались за платформой, и ничего в них не изменилось.
Назначить — значит ответить на вопрос «что открывать по умолчанию». Ни на один другой вопрос это не отвечает.
5. Почему пользователь не видит изменений сразу
Строку в свойствах мы поменяли в Конфигураторе — то есть в описании программы. Пользователь работает не с описанием, а с базой данных, и между ними есть шаг: конфигурацию базы данных нужно обновить. Пока он не сделан, в Предприятии по-прежнему старое поведение.
| где меняли | где увидят |
|---|---|
| свойства объекта в Конфигураторе | после обновления конфигурации базы данных |
| открытый сеанс Предприятия | после перезапуска сеанса |
Это тот же порядок, о котором мы говорили в самом начале книги, и он не особенность форм: так доходит до пользователя любое изменение конфигурации.
6. В Конфигураторе
Назначаем нашу форму элемента — ту, которую собрал конструктор.
-
Откройте окно редактирования справочника «Товары» и перейдите на закладку «Формы».
-
В группе «Основные формы» в строке формы элемента выберите нашу форму. Остальные строки не трогайте — там по-прежнему пусто.
-
Обновите конфигурацию базы данных и запустите Предприятие.
-
Откройте карточку любого товара. Теперь её строит не платформа, а наша форма.
-
Откройте список товаров. Он остался прежним: своей формы списка мы не назначали.
Проверьте себя одним вопросом: что изменится, если сейчас очистить строку основной формы элемента? Ответ должен даваться без запуска.
Главное в одном абзаце
Назначение формы живёт в свойствах объекта — в окне его редактирования, на закладке «Формы», в группе «Основные формы», по строке на каждый вид действия: годится ли форма на роль, видно по её устройству, а выбирает хозяин. Основная — это та, которую платформа откроет, когда при вызове не сказано, какую именно открывать; форм одного вида у объекта может быть несколько, но основная одна, а остальные открываются явным вызовом. Лестница выбора теперь видна целиком: назначена основная — откроется она, не назначена — платформа построит форму сама, и у справочников и документов второй ступени достаточно, чтобы окно открылось в любом случае. Назначение не меняет саму форму, не запрещает остальные и не отменяет автоформы других видов. А до пользователя изменение доходит не сразу: сначала обновляют конфигурацию базы данных, и только потом Предприятие показывает новое окно.
Карточка товара открывается теперь нашей формой — и выглядит точно так же, как раньше. Это не осечка: мы ведь ничего в ней не меняли. Но раз окно наше, стоит рассмотреть, что именно мы получили.
Контрольные вопросы
- Где задаётся назначение формы и почему именно там, а не в самой форме?
- Что означает слово «основная» в названии свойства?
- Может ли у объекта быть несколько форм одного вида? Что тогда откроется двойным щелчком?
- Из каких ступеней состоит выбор формы и почему окно открывается в любом случае?
- Что назначение не меняет — назовите три вещи.
- Почему после назначения пользователь не сразу видит новое окно?
- Мы назначили форму элемента. Что теперь откроется по команде раздела «Товары»?
Упражнения
По образцу. Форму элемента для «Контрагентов» вы делали упражнением раньше; если её нет, соберите так же. Назначьте её основной и проверьте в Предприятии, что карточка контрагента открывается ею. Список не трогайте.
Своё: предскажите экран. В справочнике назначена основная форма списка, но не назначена форма элемента. Опишите, что увидит пользователь, открыв список и щёлкнув по строке.
Ловушка: «форма не работает». Разработчик назначил форму, сохранил конфигурацию и говорит: «в Предприятии всё по-старому, форма не работает». Что он пропустил и в каком порядке это проверять?
Обратный ход. В чужой конфигурации у справочника четыре формы, а в группе «Основные формы» заполнена одна строка. Что это говорит о трёх остальных?
На чтение. Строку основной формы элемента очистили, форму из дерева не удаляли. Что изменится для пользователя и что останется как было?
Ответы — в конце части.
§ 2.5. Запуск в Предприятии: видим то, что собрали
Открываем карточку — и не находим ни одного отличия. Те же поля, в том же порядке, те же кнопки. Первое чувство обманчиво: кажется, что работа пропала зря. На самом деле мы получили доказательство, ради которого стоило пройти весь путь.
1. Совпадение — это результат
Конструктор собрал форму из того же описания объекта, по которому платформа строит автоформу, и теми же правилами. Потому и результат тот же: будь карточка заметно другой, это значило бы, что где-то по дороге что-то потерялось или прибавилось.
| что увидели | что это значит |
|---|---|
| окно не изменилось | конструктор собрал ровно то же |
| поля в том же порядке | порядок берётся из дерева, а не из вкуса |
| кнопки те же | стандартные команды пришли от объекта |
Первая своя форма и должна выглядеть как автоформа. Отличия начнутся там, где мы их сделаем сами.
2. Что всё-таки изменилось
Изменилось не окно, а то, откуда оно берётся, — и из этого следуют два разных последствия. Одно приятное, другое нет.
было: объект ──► платформа строит ──► окно
стало: объект ──► наша форма ──► окно
(лежит в дереве)
Приятное: теперь окно можно менять. Убрать поле, собрать поля в группу, поменять заголовок — всё это стало возможным ровно в ту минуту, когда форма появилась в дереве.
Неприятное: окно больше не следует за объектом. Добавите справочнику реквизит — в карточке он сам не появится, потому что карточка теперь берётся из нашей формы. А список, своей формы не имеющий, платформа построит заново при следующем открытии, и новый реквизит там будет. Разница не между карточкой и списком: она между формой заданной и формой, которую строят каждый раз.
3. Как отличить назначенную форму от автоформы
Это вопрос читателя чужих конфигураций, и честный ответ неожиданный: глядя на одно окно — почти никак. Пока форму не трогали, она выглядит как автоформа, потому что ею и была.
| признак на экране | о чём говорит |
|---|---|
| поля идут не в порядке дерева | форму правил человек |
| поля собраны в группы или страницы | форму правил человек |
| есть кнопка, которой нет у соседей | форму правил человек |
| ничего необычного | не говорит ни о чём |
Последняя строка и есть главная. Отсутствие странностей не означает, что формы нет: она может быть и нетронутой. Точный ответ даёт строка основных форм объекта — там видно, какая форма открывается для каждого вида. Одна лишь ветка «Формы» не ответ: форма может в ней лежать и не быть назначенной ни на что.
На экране видно, что форму правили. Открывается ли она — видно в строке основных форм, и больше нигде.
4. Круг, который придётся пройти много раз
Путь правки до пользователя мы уже знаем: описание меняют в Конфигураторе, а работает пользователь с базой. Теперь он становится рабочим кругом, и ходить по нему предстоит столько раз, сколько будет правок.
редактор формы ──► обновить конфигурацию
базы данных ──► Предприятие
Пропускают в нём всегда одно и то же — средний шаг, и выглядит это одинаково: «я же поменял, а ничего не изменилось». Привыкать стоит сейчас, пока правки маленькие и проверять их легко.
5. В режиме Предприятия и обратно
Сделаем маленькую правку и проведём её до экрана — весь цикл целиком.
- Откройте карточку товара в Предприятии и запомните порядок полей.
-
Вернитесь в Конфигуратор, откройте нашу форму и поменяйте местами два поля в структуре элементов.
-
Обновите конфигурацию базы данных.
-
Откройте карточку снова: порядок изменился. Это первая правка формы, которая дошла до пользователя.
-
Откройте список товаров и убедитесь, что в нём ничего не менялось: он по-прежнему строится платформой.
Верните порядок полей обратно, когда посмотрите: дальше книга исходит из того, что форма осталась такой, какой её собрал конструктор.
Главное в одном абзаце
Назначенная форма открывается неотличимо от автоформы, и это не осечка, а доказательство: конструктор снял с объекта точный снимок. Изменилось не окно, а его источник — и отсюда два следствия: окно теперь можно менять, но оно больше не следует за объектом, так что новый реквизит в нём сам не появится. Отличить назначенную форму от автоформы по одному экрану почти невозможно: странности в раскладке говорят, что форму правили, но их отсутствие не говорит ни о чём — точный ответ даёт дерево. И у каждой правки формы один и тот же путь: редактор, обновление конфигурации базы данных, Предприятие; пропущенный средний шаг выглядит как «ничего не изменилось».
Свою форму мы собрали, назначили и научились править. Но чаще приходится не собирать, а читать — открывать чужую форму и понимать, что в ней происходит. С чего начинать такой разбор?
Контрольные вопросы
- Почему совпадение нашей формы с автоформой — правильный результат?
- Что изменилось после назначения, если окно осталось прежним?
- Какое следствие у того, что форма хранится, а не строится заново?
- Можно ли, глядя на окно, сказать, что у объекта есть своя форма?
- О чём говорит необычный порядок полей в чужой форме?
- Какой путь проходит правка формы до пользователя?
- Мы поменяли порядок полей в форме элемента. Что произойдёт со списком?
Упражнения
По образцу. Проведите весь цикл на «Контрагентах»: правка в редакторе, обновление конфигурации базы данных, проверка в Предприятии.
Своё: предскажите последствие. Справочнику «Товары» добавили реквизит «Вес». Опишите, что увидит пользователь в карточке товара и что — в списке. Объясните разницу.
Ловушка: «форма сломалась». Коллега говорит: «после того как я добавил реквизит, форма сломалась — поля нет». Что на самом деле произошло и что нужно сделать?
Обратный ход. В чужой конфигурации карточка справочника выглядит ровно так, как выглядела бы автоформа. Что из этого следует и как проверить наверняка?
На чтение. В одной конфигурации у справочника поля собраны в две группы, а у соседнего справочника идут подряд. Что можно сказать о каждой из двух форм?
Ответы — в конце части.
§ 2.6. Чужая форма: разбор по трём областям
Начинать надо не с окна. Окно — это результат, а разбор начинается с вопроса, откуда результат взялся: чья это форма, назначена ли она и есть ли у объекта другие. Порядок разбора один и тот же, и в этом параграфе мы его закрепим — он пригодится в каждой следующей главе.
1. Сначала дерево, потом окно
Три вопроса, которые задают до того, как разглядывать поля.
| вопрос | где ответ |
|---|---|
| чья это форма | ветка объекта, в которой она лежит |
| открывается ли она сама | строки основных форм объекта, по одной на вид |
| есть ли у объекта другие формы | та же ветка «Формы» |
Ответы на них меняют всё дальнейшее чтение. Форма, которая не назначена, может оказаться заброшенной или вызываться из кода. Форма, лежащая в общих формах, объекту не принадлежит: сам собой он в неё не подставится, и данные попадают туда явно — параметрами при открытии или через реквизиты формы.
Разбор формы начинается в дереве. Кто хозяин и открывается ли форма сама — два вопроса, без которых остальное читается вслепую.
2. Три области по порядку
Дальше — сама форма, и порядок тот же, что мы разобрали: данные, вид, действия.
1. реквизиты что у формы есть
2. элементы что из этого видно
3. команды что можно сделать
Читать в обратную сторону — распространённая ошибка. Начав с элементов, вы увидите поле и не будете знать, откуда оно берёт значение; начав с реквизитов, вы прочтёте элемент сразу вместе с его источником.
| смотрим | что выписываем |
|---|---|
| реквизиты | что форма держит у себя |
| элементы | порядок, группы, что не выведено |
| команды | что объявлено и что вынесено на экран |
Третья строка стоит внимания: полезно не только то, что в форме есть, но и то, чего в ней нет. Реквизит, который есть в списке, но не выведен элементом, — чей-то осознанный отказ показывать его пользователю.
3. Где кончается чтение без кода
Пройдя три области, упираемся в вопросы, на которые сама форма не отвечает, — и границу стоит провести сразу. Модуль формы мы не читаем, в этой книге не читаем вовсе. Значит, часть ответов останется недоступной, и важно понимать, каких именно.
| читается по форме | требует модуля |
|---|---|
| какие поля есть и откуда берут значение | что случится при нажатии |
| какие команды объявлены | что происходит при открытии |
| что вынесено на экран, а что нет | откуда берутся вычисляемые значения |
Это не поражение, а граница. Большинство вопросов, с которыми человек приходит к чужой форме — «почему поле пустое», «откуда взялось это значение», «почему кнопки нет», — решаются без единой строки кода.
4. Что выдаёт замысел
Зато и без модуля видно многое — прежде всего по тому, как расположены элементы. Автоформа раскладывает всё подряд. Как только в форме появляется порядок, не совпадающий с деревом, за ним стоит человеческое решение — и его стоит прочесть.
| что видно | что за этим обычно стоит |
|---|---|
| поля собраны в группы | разговор разбит на смысловые части |
| часть полей на второй странице | редкое отделено от частого |
| поля переставлены | важное поднято наверх |
| реквизит есть, поля нет | показывать не захотели |
| декорация с текстом | читателю формы что-то объясняют |
Вопрос, который стоит задавать при каждом таком наблюдении, один: какую работу это облегчает? Если ответа не находится, возможно, решение устарело — формы живут дольше, чем причины, по которым их такими сделали.
5. Три ловушки чтения
Первая: считать, что всё на форме пришло от объекта. Реквизиты формы заводят и руками, и такое поле в дереве объекта искать бесполезно.
Вторая: считать кнопку командой формы. Часть кнопок приходит от объекта стандартными командами: в списке команд формы их не найти, а на экране они есть — в командной панели формы.
Третья: судить о форме по одному окну. У объекта форм бывает несколько, и та, что открылась двойным щелчком, — только одна из них.
Прочесть форму — значит объяснить каждое поле и каждую кнопку: откуда оно и почему здесь. Всё, чего объяснить не удалось, — список вопросов, а не провал.
6. Разбор по шагам
Порядок, которым дальше разбирается любая чужая форма.
-
Найдите форму в дереве: чей объект, как называется, есть ли соседи.
-
Посмотрите строки основных форм объекта: открывается ли эта форма сама и для какого вида.
-
Откройте редактор и выпишите реквизиты формы.
-
Пройдите структуру элементов сверху вниз: что выведено, в каком порядке, что собрано в группы.
-
Сверьте два списка: какие реквизиты не выведены и какие элементы не связаны с реквизитами.
-
Посмотрите команды: что объявлено формой, что вынесено на экран и какие кнопки пришли от объекта стандартными командами.
-
Назовите одно решение, которое видно в этой форме, и объясните его словами про работу пользователя.
Главное в одном абзаце
Чужую форму разбирают не с окна, а с дерева: чей это объект, назначена ли форма основной и есть ли у объекта другие — без этих ответов остальное читается вслепую. Дальше идут три области в неизменном порядке: реквизиты — что у формы есть, элементы — что из этого видно, команды — что можно сделать; и полезно не только то, что в форме есть, но и то, чего в ней нет. Модуль мы не читаем, и это граница, а не поражение: почти все вопросы, с которыми приходят к чужой форме, решаются без кода. Всякий порядок, не совпадающий с деревом, — след человеческого решения, и его стоит прочесть вопросом «какую работу это облегчает». А главных ловушек три: считать, что всё на форме пришло от объекта; принимать любую кнопку за команду формы; судить об объекте по одному открытому окну.
Разбирать формы мы научились по трём областям, но первая из них так и осталась списком без объяснения. Что это за реквизиты, откуда они берутся и почему среди них есть строка, которую никто не заводил?
Контрольные вопросы
- Почему разбор чужой формы начинают с дерева, а не с окна?
- Какие три вопроса задают к дереву до того, как открыть форму?
- В каком порядке читают три области и почему именно в таком?
- Почему полезно смотреть, чего в форме нет?
- Какие вопросы о форме нельзя решить, не читая модуль?
- Что означает порядок полей, не совпадающий с деревом объекта?
- Назовите три ловушки чтения формы.
Упражнения
По образцу. Разберите по семи шагам форму, которую вы собрали сами. Ответы на все шаги известны заранее — это и есть проверка самого порядка.
Своё: разбор соседа. Возьмите форму элемента другого справочника и пройдите по ней те же шаги. Сравните с первым разбором и назовите одно отличие.
Ловушка: «это поле из справочника». В чужой форме есть флажок «показывать подробности». Коллега ищет его в дереве справочника и не находит. Где искать и почему.
Обратный ход. В форме выведены не все реквизиты объекта. Какие объяснения этому возможны и как отличить одно от другого?
На чтение. Форма открывается двойным щелчком по строке списка, а строка формы элемента в основных формах объекта пуста. Что это означает?
Ответы — в конце части.
Ответы к части 2
Ответы собраны здесь, а не под вопросами: подсказка, увиденная сразу после вопроса, отменяет попытку вспомнить. У каждого ответа до трёх ступеней: сам ответ, указание — если ответ не дался сразу — и полное решение там, где рассуждение важнее вывода.
§ 2.1. Форма как объект конфигурации: где она живёт в дереве
К вопросу 1. Ответ. Форма — описание окна, которое хранится в дереве; окно — то, что платформа по этому описанию строит. По одной форме окон бывает много, и правка формы отзывается во всех сразу.
К вопросу 2. Ответ. Реквизиты формы — какие данные форма держит у себя; элементы — из чего сложено окно; команды — что пользователь может сделать; параметры — с чем форму открыли; модуль — что делать в ответ на действие. Параметры при этом не часть окна, а его вход, а модуль не описывает, а действует.
К вопросу 3. Ответ. Имя формы уникально внутри своего объекта, а не во всей конфигурации: у каждого хозяина своё пространство имён.
К вопросу 4. Указание. Что изменится, если форму переименовать?
Полное решение. Имя — адрес, по которому форму находят: оно живёт в свойствах самой формы. Назначение — кем форма приходится объекту — живёт в свойствах объекта-хозяина, в ссылке на эту форму. Переименование меняет адрес, но не назначение: пока объект ссылается на форму, она остаётся его основной формой элемента, как бы её ни звали.
К вопросу 5. Ответ. Реквизит объекта задан в дереве объекта и хранится в базе; реквизит формы задан внутри формы и живёт, пока открыто окно.
К вопросу 6. Ответ. Когда окно не про один объект — настройки, служебный диалог. Привязывать такое окно к справочнику не к чему, и форма ложится в общие.
К вопросу 7. Ответ. Потому что окна для объектов платформа строит сама, пока своя форма не задана. Заданная форма нужна не для работы, а для того, чтобы разговор шёл иначе, чем по умолчанию. В типовых конфигурациях картина обратная: там формы заданы почти везде.
К упражнению «Прочтите дерево». Ответ. Ветка «Формы» есть у всех прикладных объектов «Канцтоваров» — справочников, документов, отчёта — и всюду пуста. Пустая ветка означает решение: своих форм объекту не понадобилось, окна строит платформа.
К упражнению «Своё: назовите хозяина». Ответ. Во всех трёх фразах не хватает объекта: чей список, чей элемент, выбор чего. Имя формы без имени хозяина не адресует ничего.
К упражнению «Ловушка: „назвал — значит сделал"». Ответ. Не прав. Проверить нужно свойства справочника: указана ли эта форма как основная форма списка.
Полное решение. Имя формы — только адрес. Пока объект не сослался на форму, платформа о ней не знает и продолжает строить список сама. Со стороны это выглядит обидно: форма нарисована, а в Предприятии всё по-старому. Причина не в форме и не в платформе, а в незаполненном свойстве объекта.
К упражнению «Обратный ход». Ответ. Основная форма открывается сама, а две остальные вызываются явно — из кода, из команды или другой формой. Искать их в работе программы нужно там, где окно открывается не двойным щелчком, а по кнопке или по действию.
К упражнению «На чтение». Ответ. У этой формы нет предметного хозяина: объект в неё сам не подставится, данные придут через параметры и собственные реквизиты формы, а открывается она не двойным щелчком по записи, а откуда-то из программы. Скорее всего, окно не про один предмет — настройки, служебный диалог, помощник.
§ 2.2. Конструктор формы: первое знакомство
К вопросу 1. Ответ. Конструктор вызывается автоматически при создании формы: его не выбирают в меню, он открывается сам, как только объекту добавляют форму.
К вопросу 2. Ответ. Потому что набор видов форм читается по объекту: у справочника есть папки, а значит, и формы группы, у документа их нет.
К вопросу 3. Ответ. О том, про что будет разговор: одна запись, список записей, выбор одной записи, папка. Внешность здесь ни при чём.
К вопросу 4. Ответ. Из описания объекта — тех же реквизитов, табличных частей и стандартных команд, из которых платформа строит автоформу.
К вопросу 5. Указание. Что происходит с автоформой при каждом открытии и чего не происходит с сохранённой формой?
Полное решение. Автоформа собирается заново каждый раз, поэтому она всегда соответствует объекту. Конструктор делает с объекта такой же снимок, но однократно и кладёт результат в дерево. С этой минуты форма живёт отдельно от объекта: добавленный через полгода реквизит в ней не появится, и, если он нужен пользователю, форму придётся править руками. Это и есть та цена своей формы, о которой шла речь в прошлой главе.
К вопросу 6. Ответ. Ставит ссылку из свойств объекта на созданную форму — то самое назначение. Мы её сняли, чтобы увидеть: создать форму и назначить её объекту — два разных действия.
К вопросу 7. Ответ. Ничего. Для списка, выбора и группы платформа по-прежнему строит окна сама; своя форма занимает одно место, и только то, на которое её поставят.
К упражнению «По образцу». Ответ. Форма у контрагентов появилась, а карточка контрагента открывается прежней: справочник на новую форму не ссылается. То же самое мы видели у товаров.
К упражнению «Своё: предскажите набор». Ответ. Конструктор предложит форму документа, форму списка, форму выбора и произвольную; форм группы у документа нет. В форме документа окажутся реквизиты шапки и табличная часть «Товары» — то же, что показывает автоформа.
К упражнению «Ловушка: „форма создана — дело сделано"». Ответ. Оба правы: форма действительно создана и лежит в дереве, но объект на неё не ссылается, поэтому пользователь по-прежнему видит автоформу.
Полное решение. Разработчик выполнил первое из двух действий: форма существует. Второе — назначение — осталось несделанным, а именно оно решает, какое окно откроется пользователю. Проверять нужно свойства объекта: указана ли форма как основная форма нужного вида. Пока не указана, разговор идёт через автоформу, и никакая правка формы на экран не попадёт.
К упражнению «Обратный ход». Ответ. Порядок полей в ней меняли руками: конструктор раскладывает поля в порядке дерева, значит, после него форму правили. Это признак формы, за которой стоит замысел, а не автоматическая раскладка.
К упражнению «На чтение». Ответ. Форма списка строится платформой — своей формы списка у объекта нет или она не назначена. А форма элемента задана и хранится: снимок сделан до того, как реквизит появился, и сам он туда не попадёт.
§ 2.3. Редактор формы: три области и предпросмотр
К вопросу 1. Ответ. Потому что под одним окном собраны шесть редакторов — элементов, командного интерфейса, реквизитов, команд, параметров и модуля, — и каждый занимается своей частью формы.
К вопросу 2. Ответ. Реквизиты — о чём говорим; элементы — что видно; команды — что можно сделать.
К вопросу 3. Ответ. Данные первичны: элемент, которому нечего показывать, бессмыслен, а команда, которой нечего делать, бесполезна.
К вопросу 4. Ответ. Показывает раскладку — где встанут элементы. Не показывает работы: значения реквизитов не заполнены, обработчики не выполняются.
К вопросу 5. Ответ. Элемент «Форма». Его свойства в палитре — свойства всей формы, а не отдельного поля.
К вопросу 6. Указание. Через сколько мест команда может попасть на экран?
Полное решение. «Есть ли действие» решает редактор команд: там оно объявляется. «Видно ли оно» решается в другом месте, и путей два — кнопкой в структуре элементов или через редактор командного интерфейса формы, в панели навигации или командной панели. Поэтому объявленная команда без кнопки — не ошибка, а незаконченное решение: действие есть, а на экран его не вывели.
К вопросу 7. Ответ. В палитре свойств — у самого элемента, у реквизита или у формы целиком.
К упражнению «По образцу». Ответ. Элементы — из чего сложено окно; командный интерфейс — что стоит в панелях; реквизиты — чем форма располагает; команды — что она умеет; параметры — с чем её открывают; модуль — что делать в ответ на действие.
К упражнению «Своё: три вопроса к чужому окну». Ответ. Проверка не на знание, а на привычку: если после трёх вопросов окно перестало быть картинкой и стало устройством, упражнение сделано.
К упражнению «Ловушка: „нарисую окно и заполню"». Ответ. Поле без данных показывать нечего: его придётся или связывать с реквизитом потом, или заводить реквизит задним числом. Работа выйдет двойная.
Полное решение. Порядок «сначала данные, потом вид» держится не на вкусе, а на устройстве формы: поле появляется из реквизита, и связь эта задаётся при создании поля. Разложив пустые поля, разработчик получает окно, которое выглядит готовым и ничего не показывает, — а потом связывает каждое поле вручную. Тот же результат достигается перетаскиванием реквизитов сразу.
К упражнению «Обратный ход». Ответ. За кнопкой стандартная команда, которую форма не объявляла, а получила от объекта. Либо действие пришло через редактор командного интерфейса формы, а не через структуру элементов.
К упражнению «На чтение». Ответ. Данные показывают поля и таблица; группа только собирает их вместе, а декорация не показывает ничего — это подпись или картинка.
§ 2.4. Назначение формы объекту
К вопросу 1. Ответ. В свойствах объекта: окно редактирования, закладка «Формы», группа «Основные формы». Там, потому что решает хозяин: форма не выбирает, кем ей быть.
К вопросу 2. Ответ. Основная — та, которую платформа откроет, если при вызове не сказано, какую именно открывать.
К вопросу 3. Ответ. Может. Двойным щелчком откроется основная; если основная не назначена — форма, построенная платформой, а не одна из существующих.
К вопросу 4. Ответ. Из двух: назначена ли основная форма этого вида; если нет — платформа строит форму сама. У справочников и документов вторая ступень срабатывает в любом случае, поэтому окно открывается.
К вопросу 5. Ответ. Не меняет саму форму, не запрещает остальные формы того же вида, не отменяет автоформы других видов.
К вопросу 6. Указание. Где мы меняли строку и с чем работает пользователь?
Полное решение. Строку правят в Конфигураторе, то есть в описании программы. Пользователь работает с базой данных, а описание попадает в неё отдельным действием — обновлением конфигурации базы данных. Пока оно не сделано, Предприятие живёт по старому описанию. Открытый сеанс к тому же держит своё состояние, поэтому его перезапускают.
К вопросу 7. Ответ. Список товаров, построенный платформой: мы назначили форму элемента, а команда раздела просит форму списка.
К упражнению «По образцу». Ответ. Карточка контрагента открывается назначенной формой, список — по-прежнему автоформой. Порядок тот же: назначить, обновить конфигурацию базы данных, проверить.
К упражнению «Своё: предскажите экран». Ответ. Список откроется назначенной формой списка, а щелчок по строке откроет карточку, построенную платформой: для формы элемента назначения нет.
К упражнению «Ловушка: „форма не работает"». Ответ. Пропущено обновление конфигурации базы данных. Проверять по порядку: обновлена ли конфигурация базы данных, перезапущен ли сеанс, заполнена ли нужная строка основных форм и та ли это строка.
Полное решение. «Не работает» здесь означает «не дошло». Сохранение конфигурации кладёт изменение в описание, а не в базу; пользователь видит базу. Отсюда и порядок проверки — от самого частого к редкому: обновление, сеанс, строка, вид формы. Только в последнюю очередь стоит подозревать саму форму.
К упражнению «Обратный ход». Ответ. Три остальные формы сами не открываются: их зовут явно — из команды, из кода, из другой формы. Либо они остались от прежних решений и не используются вовсе.
К упражнению «На чтение». Ответ. Пользователь снова увидит карточку, построенную платформой. Сама форма никуда не делась: она лежит в дереве, её по-прежнему можно открыть явным вызовом и снова назначить.
§ 2.5. Запуск в Предприятии: видим то, что собрали
К вопросу 1. Ответ. Потому что конструктор собирал форму из того же описания объекта и теми же правилами, что и платформа. Заметное отличие означало бы, что где-то что-то потерялось.
К вопросу 2. Ответ. Источник окна. Раньше его строила платформа, теперь оно берётся из формы, лежащей в дереве.
К вопросу 3. Ответ. Форма не следует за объектом: новый реквизит в ней сам не появится, его придётся вывести руками.
К вопросу 4. Ответ. Нет. Нетронутая форма выглядит как автоформа. Ответ даёт строка основных форм объекта.
К вопросу 5. Ответ. Что форму правил человек: автоформа раскладывает поля в порядке дерева.
К вопросу 6. Ответ. Редактор формы → обновление конфигурации базы данных → Предприятие. Пропущенный средний шаг выглядит как «ничего не изменилось».
К вопросу 7. Ответ. Ничего. Список строится платформой, и правка формы элемента его не касается.
К упражнению «По образцу». Ответ. Порядок тот же: правка в редакторе, обновление конфигурации базы данных, проверка. Если изменение не видно, шаг с обновлением пропущен.
К упражнению «Своё: предскажите последствие». Ответ. В карточке «Веса» не будет: она берётся из заданной формы, а форму никто не менял. В списке появится: его платформа строит заново при следующем открытии.
К упражнению «Ловушка: „форма сломалась"». Ответ. Ничего не сломалось. Форма хранится и не пересобирается; поле нужно вывести в ней руками.
Полное решение. Слово «сломалась» описывает ожидание, а не событие: коллега ждал, что форма догонит объект. Так ведёт себя автоформа, а заданная форма — нет, и это её постоянное свойство, а не сбой. Дальше два пути: вывести реквизит в форме или, если своя форма больше не нужна, снять назначение и вернуться к автоформе.
К упражнению «Обратный ход». Ответ. Из этого не следует ничего: так выглядит и автоформа, и нетронутая своя форма. Проверить можно только в Конфигураторе — по строке основных форм объекта.
К упражнению «На чтение». Ответ. Первую правил человек: поля собраны в группы, а сама собой такая раскладка не получается. О второй сказать нельзя ничего: так выглядит и автоформа, и нетронутая своя форма.
§ 2.6. Чужая форма: разбор по трём областям
К вопросу 1. Ответ. Окно — результат. Пока неизвестно, чья это форма и открывается ли она сама, всё увиденное читается вслепую.
К вопросу 2. Ответ. Чей объект; назначена ли форма и для какого вида; есть ли у объекта другие формы.
К вопросу 3. Ответ. Реквизиты, элементы, команды. В этом порядке элемент читается сразу вместе с источником значения.
К вопросу 4. Ответ. Невыведенный реквизит — чей-то отказ показывать его пользователю, то есть тоже решение.
К вопросу 5. Ответ. Что происходит при нажатии, что при открытии и откуда берутся вычисляемые значения.
К вопросу 6. Ответ. Что форму правил человек: автоформа раскладывает поля в порядке дерева.
К вопросу 7. Ответ. Считать, что всё на форме пришло от объекта; считать любую кнопку командой формы; судить об объекте по одному окну.
К упражнению «По образцу». Ответ. Все семь шагов на своей форме дают известные ответы — упражнение проверяет не знание конфигурации, а порядок разбора.
К упражнению «Своё: разбор соседа». Ответ. Отличия обычно в составе реквизитов объекта и в том, что из них выведено. Если формы не правили, различие будет только в наборе полей.
К упражнению «Ловушка: „это поле из справочника"». Ответ. Искать в реквизитах формы: такое поле живёт в форме, а не в объекте, и в дереве справочника его нет.
К упражнению «Обратный ход». Ответ. Либо реквизит не стали выводить, либо форма старше реквизита: её собрали, когда реквизита ещё не было. Отличить можно по остальным формам объекта — если в других он выведен, дело в возрасте формы.
К упражнению «На чтение». Ответ. Что открывается не она: двойной щелчок приведёт к форме, построенной платформой. Эту форму зовут явно — из команды, из кода или из другой формы.
§ 3.1. Реквизит объекта и реквизит формы: одно слово, два смысла
Слово «реквизит» читатель уже знает: артикул товара, ИНН контрагента — всё это реквизиты, заданные объекту и хранящиеся в базе. А в редакторе формы список с тем же названием — и лежит в нём другое. Совпадение имён здесь не случайность и не небрежность, но пока оно не разобрано, дальше двигаться нельзя: половина вопросов о формах упирается ровно в это различение.
1. Два списка, названных одинаково
Первый список — в дереве объекта. Второй — в редакторе формы. Названы они почти одинаково, а отвечают на разные вопросы.
Справочник «Товары» Форма элемента
└── Реквизиты └── реквизиты
├── Артикул ├── Объект
└── ЕдиницаИзм… └── Показывать…
Строка «Объект» в правом списке — та самая, которой никто не заводил: о ней следующий параграф. Пока достаточно знать, что она там есть.
| что задаём | где | о чём вопрос |
|---|---|---|
| реквизит объекта | дерево объекта, ветка «Реквизиты» | что хранить о каждой записи |
| реквизит формы | редактор формы, реквизиты | чем форме располагать, пока она открыта |
Одно слово, два предмета. Различает их принадлежность: реквизит объекта — у объекта, реквизит формы — у формы.
2. Реквизит объекта: свойство записи
Реквизит объекта задают один раз — в дереве, — а хранится он у каждой записи свой. Артикул есть у бумаги, у ручки и у папки, у каждой свой, и все эти значения лежат в базе, пока записи оттуда не удалят. Задан он для всего справочника сразу, а живёт поштучно.
Об этом подробно рассказывает книга о дереве метаданных; здесь нам нужно одно её следствие, зато важное. Реквизит объекта существует независимо от того, открыта какая-нибудь форма или нет: он часть записи, а не часть разговора о ней. Закройте все окна, погасите экран — артикул бумаги останется на месте, и запрос его найдёт.
3. Реквизит формы: то, чем форма располагает
Реквизит формы задают в самой форме, и живёт он по умолчанию ровно столько, сколько открыто окно: значение лежит в данных этой формы, а не в базе. Закрыли окно — значения больше нет, и в базе после него не остаётся ничего. У формы есть настройка, с которой значение переживает закрытие окна у этого пользователя, — о ней речь впереди; в базу данных оно и тогда не попадает.
Зачем оно тогда нужно, проще показать на примере. Флажок «показывать подробности», который разворачивает часть полей, — не свойство товара. Он вообще не про товар: он про то, как сейчас смотрит один пользователь в одном открытом окне. У соседа, который в эту же минуту открыл тот же товар, флажок может стоять иначе, и оба правы. Хранить такое в базе бессмысленно, а форме без него неудобно — вот для этого реквизиты формы и заводят.
4. Разница в одной таблице
Свести различия вместе стоит один раз и запомнить насовсем.
| вопрос | реквизит объекта | реквизит формы |
|---|---|---|
| задан где | в дереве объекта | в форме |
| где значение | в базе | в данных открытой формы |
| живёт | пока есть запись | пока открыто окно |
| попадает в базу | да | нет |
| виден запросу к базе | да | нет |
Строка про базу означает ровно то, что написано: сама собой форма таких значений не сохраняет. Каким действием данные вообще попадают в базу, разберём в этой же главе.
Последняя строка — быстрый способ проверить себя, и работает он потому, что запрос читает хранимые данные — таблицы базы. Реквизита формы среди них нет, оттого запрос его и не находит — дело не в секретности, а в адресе.
5. Почему их всё-таки назвали одинаково
Потому что устроены они похоже: именованное значение определённого типа, принадлежащее чему-то. Разница не в природе, а в хозяине — и, как следствие, в сроке жизни.
имя + тип + хозяин
хозяин объект → хранится в базе
хозяин форма → живёт, пока открыта
Такая экономия имён в 1С встречается часто, и правило чтения всегда одно: сначала спросить, чей это реквизит. Без ответа на этот вопрос спор «есть такое поле или нет» может длиться долго — собеседники будут смотреть в разные списки.
Прежде чем искать реквизит, спросите, чей он. Половина недоразумений о формах живёт именно здесь.
6. Где это всплывает в работе
Три случая, в которых различение окупается сразу.
| что слышим | что это значит |
|---|---|
| «добавь поле на форму» | может быть и то и другое — уточните |
| «этого поля нет в базе» | реквизит формы, искать в форме |
| «поле есть, а в отчёт не попадает» | реквизит формы: в базе его нет |
Третья строка — самая частая, и она обычно значит больше, чем кажется. Если значение понадобилось в отчёте, его место, скорее всего, в реквизитах объекта: кто-то завёл реквизитом формы то, что должно храниться. Иногда это осознанный выбор, но чаще недосмотр, и обнаруживается он именно так.
7. В Конфигураторе
Выпишем оба списка и сравним их глазами.
-
Откройте в дереве справочник «Товары» и выпишите его реквизиты.
-
Откройте форму элемента этого же справочника — ту, что мы собрали, — и выпишите реквизиты формы.
-
Сравните списки. Они не совпадают, и это нормально: списки отвечают на разные вопросы.
-
В списке реквизитов формы найдите строку, которой вы не заводили. Имя её запомните — следующий параграф будет о ней.
Главное в одном абзаце
Слово «реквизит» в 1С означает две разные вещи, и различает их хозяин. Реквизит объекта задан в дереве объекта, хранится в базе у каждой записи, живёт, пока существует запись, и виден запросам к базе. Реквизит формы задан в самой форме, значение его лежит в данных открытого окна, а не в базе, и запрос к базе его не найдёт — он нужен форме для разговора, а не базе для хранения. Названы они одинаково потому, что устроены похоже: имя, тип и хозяин; разница в хозяине и в сроке жизни. Отсюда правило чтения: прежде чем искать реквизит, спросить, чей он, — иначе двое будут смотреть в разные списки и спорить о том, есть ли такое поле.
В списке реквизитов формы нашлась строка, которую никто не заводил, и она там не случайно: через неё форма и говорит о товаре. Что это за реквизит и почему он главный?
Контрольные вопросы
- Чем отличается реквизит объекта от реквизита формы — назовите хозяина каждого.
- Сколько живёт реквизит формы и что от него остаётся после закрытия окна?
- Почему запрос к базе не находит реквизит формы?
- Как быстро проверить, какого рода реквизит перед вами?
- Почему два разных предмета назвали одним словом?
- Пользователь говорит: «поле на форме есть, а в отчёт не попадает». Что это значит?
- Где искать флажок «показывать подробности» — в дереве справочника или в форме?
Упражнения
По образцу. Выпишите два списка для справочника «Товары» — реквизиты объекта и реквизиты формы — и отметьте, что есть только в одном из них.
Своё: придумайте реквизит. Назовите два значения, которые нужны форме товара, но не нужны базе. Объясните, почему их незачем хранить.
Ловушка: «добавь поле в справочник». Заказчик просит добавить в карточку товара галочку «показывать закупочные цены», чтобы каждый пользователь включал её себе. Какой это реквизит и почему не тот, о котором просят?
Обратный ход. В форме есть поле, значения которого нет ни в одном отчёте. Какие объяснения этому возможны?
На чтение. В списке реквизитов формы вы видите строку «Итого» типа Число. Что о ней можно сказать, не открывая ничего больше?
Ответы — в конце части.
§ 3.2. Основной реквизит: главный предмет разговора
Раз реквизиты формы и объекта разведены, вернёмся к списку формы: одна строка в нём выделена полужирным. Выделение не украшение — так редактор отмечает основной реквизит, тот, ради которого форма вообще существует. Его завёл конструктор, и от него зависит, как форма ведёт себя при открытии, при правке и при закрытии.
1. Строка, которую завёл конструктор
Конструктор, собирая форму по объекту, создаёт реквизит под предмет разговора и отмечает его как основной. У формы элемента товара он называется «Объект». У произвольной формы такого реквизита не будет — о ней в конце параграфа.
реквизиты формы
├── Объект ← основной, полужирным
└── (остальные, если заведут)
Документация платформы говорит об этом прямо: основной реквизит определяет поведение формы при открытии, редактировании и закрытии, а его тип задаётся типом объекта и видом формы. Проще говоря, по основному реквизиту форма знает, про что она — и потому умеет сама то, чему её никто не учил. Открыли карточку товара — в полях уже данные этого товара. Поменяли артикул и закрываете окно, не записав, — форма спросит, сохранить ли изменения. Ни строчки кода за этим нет: так работает форма, у которой есть предмет. Подробно эту жизнь данных разберём в этой же главе.
Основной реквизит — это предмет разговора, записанный в форму. Всё остальное в форме говорит о нём или вокруг него.
2. Имя и тип зависят от вида формы
Конструктор подбирает основному реквизиту тип под разговор. Форма одной записи получает саму запись, форма списка — список.
| форма | имя основного реквизита | тип |
|---|---|---|
| элемента товара | Объект | СправочникОбъект.Товары |
| документа поступления | Объект | ДокументОбъект.ПоступлениеТоваров |
| списка товаров | Список | динамический список |
Слово «Объект» в имени не случайно и не обязательно: это просто имя, которое конструктор даёт по умолчанию. Важен не текст, а отметка «основной» и тип. Но переименовывать без причины не стоит. Окно от этого не сломается, а вот всё, что обращается к реквизиту по имени, — код формы, если он есть, и привычки тех, кто этот код читает, — рассчитывает найти именно «Объект».
3. Почему форма «знает», кем ей быть
Тип основного реквизита — не просто подпись к данным: именно он делает форму пригодной для роли. Когда мы назначали формы объекту, осталась недосказанность: пригодность, говорили мы, видна по устройству формы. Вот это устройство.
| основной реквизит | годится как |
|---|---|
| СправочникОбъект.Товары | форма элемента товара |
| динамический список товаров | форма списка или выбора |
| нет основного реквизита | окно без предмета: ставить основной бессмысленно |
Отсюда и порядок решений, который мы уже видели, только теперь с объяснением. Конструктор создаёт основной реквизит нужного типа — форма становится пригодной для роли. В свойствах объекта указывают, какую из пригодных открывать по умолчанию, — и роль назначена.
4. Основной реквизит — реквизит формы
Легко запутаться ровно в том месте, которое разбирали в прошлом параграфе. «Объект» — реквизит формы. Он лежит в списке формы, живёт, пока открыто окно, и принадлежит форме. Но тип у него — объект справочника, и потому внутри него оказываются реквизиты объекта: артикул, единица, наименование.
реквизит формы «Объект»
тип: СправочникОбъект.Товары
внутри: Артикул, ЕдиницаИзмерения, …
↑ реквизиты объекта
Это не противоречие, а вложенность: реквизит формы, внутри которого сидят реквизиты объекта. Как именно они туда попадают и что с ними происходит, пока окно открыто, разберём в этой главе по шагам.
5. Почему основной только один
Потому что разговор ведётся об одном предмете — с этого образа книга начиналась. Форма может держать у себя сколько угодно вспомогательных данных, но предмет у разговора один, и форма должна знать, какой.
образ предмет разговора
строго основной реквизит формы
адрес список реквизитов формы,
строка с отметкой основного
6. Форма без основного реквизита
Мы уже встречали такую: произвольная форма, которую предлагал конструктор. Основного реквизита у неё нет, и документация прямо говорит, что при выборе произвольной формы он не создаётся.
| основной реквизит есть | основного реквизита нет |
|---|---|
| форма знает свой предмет | предмета нет |
| годится в основные формы объекта | основной ставить бессмысленно |
| данные предмета приходят сами | данные приходят только явно |
Такие формы нужны там, где разговор не о записи: помощник, настройки, служебный диалог. Мы видели их место — общие формы. Теперь понятно, почему они там чувствуют себя дома: предмета у них и не было.
7. В Конфигураторе
- Откройте форму элемента справочника «Товары» и найдите в списке реквизитов основной. Запишите его имя и тип.
-
Добавьте справочнику «Товары» ещё одну форму — произвольную — и откройте её реквизиты. Основного реквизита там нет.
-
Сравните два списка и назовите разницу одним предложением.
-
Удалите произвольную форму: она была нужна только для сравнения.
Главное в одном абзаце
Основной реквизит — строка в списке реквизитов формы, которую завёл конструктор и отметил как главную: по нему форма знает, про что она, и от него зависит, как она ведёт себя при открытии, правке и закрытии. Имя по умолчанию — «Объект» у формы элемента или документа и «Список» у формы списка, а тип подбирается под разговор: сама запись для формы одной записи, список для формы списка. Этим же типом объясняется, почему форма пригодна для той или иной роли: объект выбирает в основные формы только из годных. Основной реквизит — реквизит формы, но внутри него сидят реквизиты объекта, и это не путаница, а вложенность. Основной он один, потому что предмет у разговора один; у произвольной формы основного реквизита нет вовсе, и потому ей место там, где разговор не о записи.
Внутри «Объекта» лежат реквизиты товара — те самые, из дерева. Но как они туда попадают и что видно, если этот реквизит развернуть?
Контрольные вопросы
- Как отличить основной реквизит в списке реквизитов формы?
- Кто создаёт основной реквизит и в каком случае его не будет?
- От чего зависят имя и тип основного реквизита?
- Как основной реквизит связан с тем, в какие основные формы объекта годится форма?
- «Объект» — реквизит формы или реквизит объекта? Объясните, что внутри него.
- Почему основной реквизит у формы только один?
- Для чего нужны формы без основного реквизита?
Упражнения
По образцу. Найдите основной реквизит в форме элемента «Контрагентов» и назовите его имя и тип.
Своё: предскажите тип. Для формы документа «ПоступлениеТоваров» и для формы списка контрагентов назовите, каким будет основной реквизит, прежде чем открывать редактор. Потом сверьте.
Ловушка: «переименую — станет понятнее». Разработчик переименовал «Объект» в «Товар» и доволен. Что от этого изменилось, а что нет, и почему коллеги попросят вернуть?
Обратный ход. В чужой форме в списке реквизитов нет ни одной строки, выделенной как основная. Что можно сказать о форме и где она, скорее всего, лежит?
На чтение. В списке реквизитов формы: «Объект» типа ДокументОбъект.Заказ и «ПоказыватьОплаты» типа Булево. Что из этого предмет разговора, а что — данные вокруг него?
Ответы — в конце части.
§ 3.3. Разворачиваем «Объект»: откуда в форме реквизиты товара
Основной реквизит нашей формы — «Объект», и рядом с ним в списке реквизитов стоит значок раскрытия. Нажмите — и под одной строкой окажется целый список: артикул, единица измерения, код, наименование. Ни одну из этих строк в форму никто не добавлял. Разберёмся, откуда они там и почему это важнее, чем кажется.
1. Что внутри
Развёрнутый основной реквизит показывает всё, из чего состоит запись справочника.
Объект (СправочникОбъект.Товары)
├── Ссылка
├── Код
├── Наименование
├── Родитель
├── ПометкаУдаления
├── Артикул
└── ЕдиницаИзмерения
Верхняя часть — стандартные реквизиты: их платформа даёт справочнику сама, а точный набор зависит от его настроек — родитель, например, есть только у иерархического. Нижняя часть — то, что завёл разработчик в дереве. Внутри «Объекта» они стоят вместе, потому что для записи они одинаково свои: и код, и артикул — свойства одного товара.
2. Откуда: из типа, а не из копирования
Реквизиты товара форма к себе по одному не копировала. В её описании хранится одна строка — реквизит «Объект» с типом объекта справочника «Товары», — а состав этого типа платформа берёт из описания справочника. Развернуть «Объект» — значит заглянуть в этот тип.
образ опись состава, а не склад
значений
строго реквизит формы типа
СправочникОбъект.Товары
адрес реквизиты формы, «Объект»,
значок раскрытия
Отсюда следствие, которое проверяется за минуту. Добавьте справочнику реквизит, откройте форму заново — и внутри «Объекта» он уже есть, хотя в самой форме никто ничего не менял: список реквизитов товара форма не хранит, его приносит тип. На экране при этом нового поля не появится — почему, сейчас разберём.
Реквизиты объекта в форме не лежат, а видны: форма смотрит на них через тип основного реквизита.
3. Данные идут за объектом, раскладка — нет
Здесь закрывается вопрос, оставленный в параграфе о запуске формы. Там мы видели: добавили реквизит — в нашей форме поле не появилось. А здесь только что сказали: добавили — и он появился внутри «Объекта». Противоречия нет, это две разные части формы.
| что | идёт ли за объектом | почему |
|---|---|---|
| реквизиты внутри «Объекта» | да | читаются из типа |
| элементы — поля на экране | нет | хранятся в форме |
Новый реквизит у формы есть — данными. Пользователю его не видно, потому что поля для него никто не положил. Вывести его — дело одного перетаскивания из реквизитов в элементы, того самого жеста, о котором шла речь в разговоре о редакторе формы.
Своя форма отстаёт от объекта не данными, а раскладкой. Состав данных у неё всегда свежий, а поля — те, что положили.
4. Путь через точку
У каждой строки внутри «Объекта» есть полный адрес: имя основного реквизита, точка, имя реквизита объекта. Артикул товара в форме — это Объект.Артикул, единица — Объект.ЕдиницаИзмерения, наименование — Объект.Наименование.
Встретятся такие пути в свойствах полей: у каждого поля есть свойство, где записано, откуда оно берёт значение, — например, «Объект.Артикул». Подробно — когда дойдём до связи элемента с данными.
Читать же их можно уже сейчас. Путь всегда начинается с имени реквизита формы. Начинается с «Объект.» — значит, это данные той записи, о которой форма разговаривает. Начинается с другого имени — значит, форма держит это значение у себя; бывает, что и там лежит ссылка на запись, но уже не на свою.
5. У документа внутри есть и таблица
То же правило работает у документов, и там в «Объекте» видна ещё одна вещь. У справочника «Товары» табличных частей нет, у документа поступления есть, и развёрнутый «Объект» покажет её вместе с колонками.
Объект (ДокументОбъект.ПоступлениеТоваров)
├── Номер, Дата
├── Контрагент, Склад, СуммаДокумента
└── Товары ← табличная часть
├── Товар
├── Количество
├── Цена
└── Сумма
Путь к колонке длиннее на одно звено: Объект.Товары.Количество. Табличная часть — тоже данные записи, и приходит она тем же путём: из типа.
6. Как этим пользоваться при чтении чужой формы
В списке реквизитов чужой формы реквизиты объекта перечислены не будут — там одна строка «Объект». Отсюда два правила чтения.
| видим | делаем |
|---|---|
| нужен реквизит объекта | разворачиваем основной реквизит |
| строка вне «Объекта» | реквизит формы: сам он в дереве объекта не найдётся |
Второе правило избавляет от целого класса поисков вслепую. Если поле на форме связано не с «Объект.…», его значение не хранится в этой записи, как бы похоже на реквизит товара оно ни выглядело. Проверим оба правила в редакторе.
7. В Конфигураторе
-
Откройте форму элемента «Товаров», разверните «Объект» и сравните состав с деревом справочника.
-
Добавьте справочнику «Товары» реквизит «Вес» с типом Число.
-
Вернитесь в форму и снова разверните «Объект»: «Вес» уже там.
-
Посмотрите на предпросмотр внизу: поля «Вес» на нём нет — раскладку никто не менял.
-
Удалите реквизит «Вес» из справочника: он был нужен для опыта, а база серии должна остаться такой, какой её знают другие книги.
Главное в одном абзаце
Развёрнутый основной реквизит показывает всё, из чего состоит запись: стандартные реквизиты вроде кода и наименования, реквизиты, заведённые в дереве, а у документа — ещё и табличные части с колонками. По одному форма их не копировала: в ней хранится один реквизит «Объект» с типом объекта, а состав типа платформа берёт из описания, так что новый реквизит объекта появляется внутри «Объекта» сам. Этим закрывается загадка отстающей формы: данные у неё идут за объектом всегда, а раскладка — нет, потому что поля хранятся в форме и новое поле кто-то должен положить. У каждой строки есть путь через точку — Объект.Артикул, Объект.Товары.Количество, — и отсюда правило чтения чужой формы: начинается с «Объект.» — данные записи, о которой разговор, с другого имени — значение, которое форма держит у себя.
Всё, что внутри «Объекта», пришло из записи. Но форме нужны и такие данные, которых в записи нет и быть не должно. Где их держать?
Контрольные вопросы
- Что видно, если развернуть основной реквизит формы элемента?
- Откуда в «Объекте» берутся реквизиты товара, если форма их не копирует?
- Добавили справочнику реквизит. Что изменилось внутри «Объекта» и что — на экране формы?
- Почему своя форма отстаёт от объекта раскладкой, но не данными?
- Что означает путь «Объект.Артикул» и чем он отличается от пути без «Объект.»?
- Как выглядит путь к колонке табличной части документа?
- Где искать реквизит объекта в списке реквизитов чужой формы?
Упражнения
По образцу. Разверните «Объект» у формы элемента «Контрагентов» и выпишите, какие строки пришли из дерева справочника, а какие стандартные.
Своё: предскажите путь. Не открывая редактор, запишите полные пути к ИНН контрагента и к цене в строке поступления. Потом сверьте.
Ловушка: «реквизит добавил, а форма не видит». Разработчик добавил товару реквизит «Вес», открыл форму и говорит: «форма его не видит, придётся пересоздавать». Что он перепутал и что сделать вместо пересоздания?
Обратный ход. В чужой форме поле связано с путём «Объект.Комментарий». Что можно сказать о «Комментарии», не открывая дерево объекта?
На чтение. В списке реквизитов формы поступления две строки: «Объект» типа ДокументОбъект.ПоступлениеТоваров и «ИтогоВес» типа Число. Что из этого хранится в базе, а что форма держит у себя?
Ответы — в конце части.
§ 3.4. Дополнительные реквизиты формы: данные помимо записи
С основным реквизитом разобрались: в нём данные записи. Данные, которых в записи нет и быть не должно, держат в самой форме — рядом с «Объектом», отдельными строками в списке её реквизитов. «Объект» форма получила от конструктора, а эти строки заводит разработчик, и принадлежат они только форме. Разберём, когда они нужны, как их добавить и почему заведённый реквизит ещё ничего не меняет на экране.
1. Рядом с «Объектом», а не внутри
Список реквизитов формы делится на две части: основной реквизит с данными записи и всё остальное.
реквизиты формы
├── Объект ← запись
│ ├── Артикул
│ └── …
└── ПоказыватьПодробности ← форма
Граница здесь та же, что между реквизитом объекта и реквизитом формы: всё внутри «Объекта» — данные записи, они приходят из базы и уходят в неё при записи; всё рядом с ним — данные самой формы, места в записи у них нет. Путь к дополнительному реквизиту короткий — одно имя, без «Объект.».
2. Три повода завести реквизит формы
Поводов немного, и почти все сводятся к трём.
| повод | пример на форме товара |
|---|---|
| вспомогательное значение для расчёта | остаток на складах, посчитанный при открытии |
| временное значение ввода | строка, по которой ищут в табличной части |
| переключатель режима | флажок «показывать подробности» |
Проверить себя помогает один вопрос: понадобится ли это значение завтра другому человеку или отчёту? Если да — место ему в записи, то есть в реквизитах объекта. Если нет — оно принадлежит этому окну и этому разговору, и завести его нужно в форме.
Реквизит формы — для того, что нужно разговору, а не записи. Завтрашнему собеседнику оно не достанется.
3. Как заводят
Реквизит формы добавляют в редакторе реквизитов: новая строка, у неё имя, заголовок и тип.
| свойство | что задаёт | для флажка |
|---|---|---|
| имя | как к реквизиту обращаются | ПоказыватьПодробности |
| заголовок | подпись, которую увидит пользователь | Показывать подробности |
| тип | какие значения можно положить | Булево |
Тип здесь выбирают так же, как у реквизита объекта: строка, число, дата, булево, ссылка на справочник. Какие ещё типы бывают у реквизитов формы и зачем, разберём в следующем параграфе.
4. Завели — а на экране ничего
Здесь снова работает правило, с которого начиналась эта глава: данные и раскладка — разные части формы. Реквизит формы — данные. Чтобы пользователь его увидел, нужен элемент.
реквизит элемент экран
Показывать… ──► флажок ──► [✓] Показывать
(данные) (раскладка) подробности
Жест тот же, что и для реквизитов объекта: перетащить строку из реквизитов в элементы. Редактор сам подберёт вид элемента по типу: для булева это поле, показанное флажком. В структуре элементов оно так и будет называться полем — искать в чужой форме элемент с названием «флажок» бесполезно.
5. Флажок сам ничего не прячет
Честная оговорка. Флажок «показывать подробности» появится на форме, его можно ставить и снимать — и ничего не будет происходить. Реквизит хранит значение, но не знает, что с ним делать: чтобы флажок прятал и показывал поля, нужен обработчик, который на изменение отзовётся.
| что даёт реквизит формы | чего не даёт |
|---|---|
| место для значения | реакции на изменение |
| поле или флажок на экране | поведения, завязанного на значение |
Обработчики в этой книге мы не пишем. Для нас важно, что значению есть где жить: без реквизита формы обработчику нечего было бы проверять.
6. Два свойства со схожими названиями
Здесь легко перепутать, потому что оба свойства говорят о сохранении. Ключ к ним короткий: одно — про вопрос при закрытии, другое — про память между открытиями.
У реквизита формы есть свойство «Сохраняемые данные», и название сбивает с толку. Оно не про память. Документация называет такой реквизит «сохраняемым при записи»: его изменение считается изменением данных формы — форма помечает себя изменённой и при закрытии спросит, сохранить ли. У формы же есть своё свойство — сохранение данных в настройках: с ним значение переживёт закрытие окна у этого пользователя.
| свойство | о чём |
|---|---|
| у реквизита: «Сохраняемые данные» | вопрос при закрытии: изменение считается правкой |
| у формы: сохранение данных в настройках | память между открытиями у этого пользователя |
Для флажка просмотра первое свойство вредно: переключил режим — и форма спрашивает, сохранить ли изменения, хотя в записи ничего не менялось. А если хочется, чтобы флажок помнил выбор пользователя, нужно второе.
7. В Конфигураторе и в Предприятии
-
Откройте форму элемента «Товаров» и добавьте реквизит формы «ПоказыватьПодробности» с типом Булево.
-
Убедитесь, что он появился рядом с «Объектом», а не внутри.
-
Перетащите его в элементы и посмотрите на предпросмотр: там появился флажок.
-
Обновите конфигурацию базы данных, откройте в Предприятии карточку товара, поставьте флажок и закройте карточку.
-
Откройте её снова: флажок снят. Значение жило, пока было открыто окно.
-
Вернитесь в Конфигуратор и включите у формы сохранение данных в настройках, отметив «ПоказыватьПодробности» как сохраняемый в них. Повторите шаги 4 и 5: теперь флажок остаётся таким, каким вы его оставили.
Главное в одном абзаце
Данные, которых в записи нет и быть не должно, держат в самой форме — отдельными реквизитами рядом с «Объектом», не внутри него; путь к ним короткий, одно имя. Поводов три: вспомогательное значение для расчёта, временное значение ввода и переключатель режима, а проверяется выбор одним вопросом — понадобится ли значение завтра другому человеку, открывшему ту же запись. Заводят реквизит в редакторе реквизитов — имя, заголовок, тип, — но на экране он появится только тогда, когда из него сделают элемент: данные и раскладка по-прежнему живут врозь. Сам реквизит лишь хранит значение: чтобы флажок что-то прятал, нужен обработчик. И не спутать два свойства: «Сохраняемые данные» у реквизита превращают изменение в правку, о которой спросят при закрытии, а сохранение данных в настройках у формы даёт значению пережить закрытие окна.
Флажок получил тип Булево, и выбор был очевиден. Но реквизиту формы можно дать и такой тип, какого у реквизита объекта не бывает. Что это за типы и зачем форме таблица, которой нет в базе?
Контрольные вопросы
- Где в списке реквизитов формы находятся дополнительные реквизиты и чем их путь отличается от пути к реквизиту объекта?
- Назовите три повода завести реквизит формы.
- По какому вопросу решают, куда поместить значение — в запись или в форму?
- Почему только что заведённый реквизит формы не виден на экране?
- Что даёт флажку реквизит формы и чего не даёт?
- Чем «Сохраняемые данные» у реквизита отличаются от сохранения данных в настройках у формы?
- Почему флажок в Предприятии оказался снят после повторного открытия?
Упражнения
По образцу. Добавьте форме элемента «Контрагентов» реквизит «ПоказыватьКонтакты» типа Булево и выведите его флажком.
Своё: запись или форма. Для каждого значения решите, где его место: «дата последней сверки с контрагентом», «строка поиска в списке товаров», «количество строк в поступлении», «примечание к поступлению». Объясните каждое решение одним предложением.
Ловушка: «сделай, чтобы флажок работал». Заказчик увидел флажок «показывать подробности» и говорит: «вы его добавили, а он ничего не делает — это ошибка». Что на самом деле сделано, чего не сделано и почему это не ошибка?
Обратный ход. Пользователь жалуется: переключает в карточке режим просмотра — и при закрытии каждый раз вопрос о сохранении, хотя он ничего не менял. Какое свойство и у какого реквизита стоит проверить?
На чтение. В форме поступления рядом с «Объектом» лежат «Отбор» типа Строка и «ИтогоВес» типа Число. Что каждый из них, скорее всего, делает и понадобится ли их значение завтра другому пользователю?
Ответы — в конце части.
§ 3.5. Типы реквизитов формы: простые, ссылочные, особые
Окно выбора типа у реквизита формы длиннее, чем у реквизита объекта. Первые строки в нём знакомы — строка, число, дата, булево, ссылки на справочники и документы. А дальше идут типы, которых у реквизита объекта не бывает вовсе: таблица значений, список значений, дерево значений, динамический список. Они и есть ответ на вопрос, зачем форме таблица, которой нет в базе.
1. Три семьи
Типы реквизитов формы удобно делить на три семьи — по тому, что лежит в значении.
| семья | что в значении | примеры |
|---|---|---|
| простые | одно значение | Строка, Число, Дата, Булево |
| ссылочные | указатель на запись | ссылка на «Товары», на «Склады» |
| особые | целая структура | таблица, список и дерево значений, динамический список |
Первые две семьи у реквизита объекта тоже есть. Третья — только у формы. Реквизит объекта хранится в базе, и тип ему можно дать лишь такой, какой база умеет хранить в записи; таблицу значений в одну клетку записи не положишь — для строк у объекта есть табличная часть. А форме хранить ничего не надо: её данные живут, пока открыто окно, и тип им можно дать любой.
2. Простые: одно значение
С ними всё знакомо по реквизитам объекта. Флажок «показывать подробности» — булево, строка поиска — строка, итог по весу — число. Разница не в типе, а в хозяине: значение живёт в форме и по умолчанию пропадает с закрытием окна — если не включить сохранение данных в настройках, о котором шла речь в прошлом параграфе.
3. Ссылочные: указатель на запись
Реквизит формы может хранить ссылку на запись — например, на склад, по которому пользователь хочет посмотреть остаток товара.
реквизит формы ВыбранныйСклад
тип ссылка на «Склады»
значение → «Основной»
(сама запись — в базе)
Здесь легко спутать два утверждения. Реквизит формы временный — любой, и ссылочный в том числе: закрыли окно, и выбор пропал. Но запись, на которую он указывает, — постоянная: склад «Основной» как лежал в базе, так и лежит. Форма хранит не склад, а палец, которым на него показывают. Кстати, временно в форме живут не только её собственные реквизиты: данные записи внутри «Объекта» тоже, пока их не записали, — к этому вернёмся в следующем параграфе.
Реквизит формы временный, а запись, на которую он указывает, — нет. Забыть можно выбор, но не сам склад.
4. Особые: таблица, которой нет в базе
Самый полезный из особых типов — таблица значений. У неё свои колонки, и задают их прямо в форме, как вложенные строки реквизита.
ОстаткиПоСкладам таблица значений
├── Склад ссылка на «Склады»
└── Количество Число(15,3)
Похожа она на табличную часть, но устроена по-другому — и разница та же, что между реквизитом формы и реквизитом объекта.
| табличная часть объекта | таблица значений в форме | |
|---|---|---|
| где задана | в дереве объекта | в форме |
| где строки | в базе, у записи | в данных открытой формы |
| кто видит | любая форма и запрос | только эта форма |
| путь | Объект.Товары | ОстаткиПоСкладам |
Отсюда её работа: показать то, что посчитано, а не записано. Остаток товара по складам в записи товара не хранится — он в регистре, — но показать его в карточке таблицей удобно. Таблица значений даёт место, где такому результату жить, пока открыто окно. Сама она из базы ничего не читает: строки кладёт обработчик — или пользователь, если у таблицы на форме разрешено добавление строк.
5. Остальные особые типы — кратко
Остальные особые типы встретятся дальше в книге, здесь достаточно узнать их в лицо.
| тип | для чего | где встретится |
|---|---|---|
| список значений | набор вариантов на выбор | в главе о связи полей с данными |
| дерево значений | строки с вложенностью, когда таблице тесно в один уровень | дальше в книге не понадобится |
| динамический список | живой список записей из базы | в главе о списках |
Последней строке стоит удивиться. «Список» — основной реквизит формы списка, о котором говорилось, когда разбирали основной реквизит, — и есть реквизит особого типа. Он особый даже среди особых: у него свои свойства, а записи для него платформа получает из базы запросом, который строит по этим свойствам. Форме списка он достаётся от конструктора так же, как «Объект» форме элемента. Подробный разговор о нём — в главе о списках.
6. Тип решает, каким будет элемент
Как и у реквизита объекта, вид элемента на экране следует из типа. Перетащили реквизит в элементы — редактор предложит подходящий.
| тип реквизита | элемент по умолчанию |
|---|---|
| строка, число, дата | поле ввода |
| булево | поле, показанное флажком |
| ссылка на запись | поле с кнопкой выбора |
| таблица значений | таблица |
Правило то же, что у автоформы: «вид поля — по типу реквизита». Только теперь это правило работает и для данных, которых в записи нет. Это короткий взгляд вперёд: как элемент связан с реквизитом — разговор следующей главы.
7. В Конфигураторе и в Предприятии
-
Откройте форму элемента «Товаров» и добавьте реквизит формы «ОстаткиПоСкладам» с типом «Таблица значений».
-
Добавьте ему две колонки: «Склад» — ссылка на «Склады», «Количество» — Число.
-
Перетащите реквизит в элементы: на форме появится таблица с двумя колонками.
-
Обновите конфигурацию базы данных и откройте карточку товара в Предприятии. Таблица есть — и пустая.
Пустота здесь честная. Таблице есть где жить, но заполнить её остатками из регистра может только обработчик, который при открытии формы спросит базу. Мы его не пишем: для этого параграфа важно, что у результата появилось место.
Главное в одном абзаце
Типы реквизитов формы делятся на три семьи: простые — одно значение, как у реквизитов объекта; ссылочные — указатель на запись; особые — целая структура, которой у реквизита объекта не бывает. Ссылочный реквизит формы временный, а запись, на которую он показывает, остаётся в базе: забыть можно выбор, но не сам склад. Главный из особых типов — таблица значений, рядом с ней список и дерево значений: колонки у неё задают прямо в форме, строки живут в данных открытого окна, и видит её только эта форма — этим она и отличается от табличной части, хотя похожа на неё. Такая таблица — место для того, что посчитано, а не записано, например для остатков по складам. Динамический список, основной реквизит формы списка, — тоже особый тип, со своими свойствами. Вид элемента по-прежнему следует из типа: поле ввода, поле-флажок, поле с кнопкой выбора, таблица.
У формы теперь есть свои данные — простые, ссылочные, целые таблицы, — и все они живут, пока открыто окно. Но и данные записи внутри «Объекта» тоже живут в форме. Что будет с изменённым артикулом, если окно закрыть, не записав?
Контрольные вопросы
- На какие три семьи делятся типы реквизитов формы?
- Какая семья есть только у реквизитов формы и почему?
- Реквизит формы хранит ссылку на склад. Что пропадёт, если закрыть окно, а что останется?
- Чем таблица значений в форме отличается от табличной части объекта?
- Для чего форме таблица, которой нет в базе? Приведите пример.
- К какой семье относится основной реквизит формы списка?
- Как тип реквизита формы связан с элементом на экране?
Упражнения
По образцу. Добавьте форме элемента «Контрагентов» реквизит «ПоследниеПоступления» типа «Таблица значений» с колонками «Документ» и «Сумма». Выведите его таблицей.
Своё: подберите тип. Какой тип вы дадите реквизиту формы для каждого значения: «склад, выбранный для просмотра остатка», «варианты сортировки на выбор», «строки с итогами по месяцам», «признак, что форма открыта только для просмотра»?
Ловушка: «удалил выбор — удалился склад». Пользователь боится очищать поле «Выбранный склад» в карточке товара: «вдруг склад пропадёт из базы». Что вы ему объясните?
Обратный ход. В чужой форме видна таблица, но в дереве объекта нет табличной части с такими колонками. Где искать её данные и что это говорит о том, откуда берутся строки?
На чтение. В списке реквизитов формы: «Объект», «Список» и «ИтогиПоМесяцам» типа «Таблица значений». Что здесь не так?
Ответы — в конце части.
§ 3.6. Форма и запись: две жизни одних данных
С изменённым артикулом не будет ничего: закроете окно, не записав, — в базе останется прежний. И это не милосердие платформы, а устройство. Форма работает не с записью, а с её копией, и копия живёт ровно столько, сколько открыто окно.
1. Два срока жизни
Запись и форма живут по-разному, и это главное различие главы.
| запись | форма | |
|---|---|---|
| когда появляется | когда её создали и записали | когда открыли окно |
| когда исчезает | когда её удалили | когда окно закрыли |
| где находится | в базе данных | в памяти, у пользователя |
| сколько их | одна запись в базе | по одной у каждого, кто открыл |
Последняя строка объясняет многое. Один и тот же товар могут открыть трое — и у каждого будет своя форма со своей копией данных.
Запись одна, а форм у неё столько, сколько людей её открыли. Форма — не запись, а разговор о ней.
2. Что происходит при открытии
Открытие формы — это не «показать запись», а цепочка из трёх шагов, и в ней снова видно разделение на клиента и сервер.
1. сервер читает запись из базы
2. копия попадает в данные формы
3. клиент строит окно по описанию
формы и показывает копию
Дальше копия живёт на клиенте, у пользователя. Когда форме нужен сервер, платформа отправляет её данные туда и получает обратно — но сам сервер за каждым нажатием клавиши не следит: он не пересчитывает копию и не сохраняет её. Но форма ему не чужая — когда дело дойдёт до записи, именно сервер возьмёт данные формы и перенесёт их в запись.
3. Правка меняет копию
Стерли артикул, набрали новый — изменилась копия в форме. В базе по-прежнему старое значение, и любой, кто откроет товар рядом, увидит его.
Форма при этом не молчит. С первой же правки платформа помечает её изменённой — и с этого момента при закрытии спросит, сохранять ли. Документация говорит и о втором действии: при интерактивном изменении данных система «устанавливает модифицированность и выполняет блокировку».
Блокировка означает не то, чего обычно пугаются. Сосед по-прежнему откроет тот же товар и всё в нём увидит. А вот изменить не сможет: платформа скажет, что данные заняты. Держится это до тех пор, пока первый не запишет или не закроет форму.
| что делает платформа | зачем |
|---|---|
| помечает форму изменённой | чтобы спросить при закрытии |
| запирает запись для правки | чтобы двое не меняли её одновременно; смотреть можно |
4. В базу — только явным действием
Копия уходит в базу не сама. Для этого есть действия, и все они видны пользователю кнопками.
| действие | что происходит |
|---|---|
| «Записать» | копия уходит в базу, окно остаётся открытым |
| «Записать и закрыть» | то же, и окно закрывается |
| «Провести» (у документа) | запись, а за ней движения по регистрам, если документ их делает |
Кнопки эти пришли к форме сами — стандартными командами от объекта, о чём говорилось в главе об автоформах. Но сути это не меняет: пока одна из них не нажата, база не знает о правках ничего.
Данные попадают в базу только явным действием. Ни закрытие окна, ни переход в другое поле записью не являются.
5. Закрыли без записи — копии нет
Здесь и кроется ответ на вопрос из прошлого параграфа. Закрытие окна завершает жизнь формы: вместе с ней исчезают и её собственные реквизиты, и копия записи.
открыли → копия в форме
правили → копия изменилась
закрыли → копии нет
в базе — прежнее
Пользователю платформа даёт последний шанс: при закрытии изменённой формы спрашивает, сохранять ли. Ответ «нет» означает ровно то, что написано, — копия исчезает вместе с правками.
Слово на будущее: окно может открываться так, что пользователь обязан сначала закончить с ним, — это называется модальным открытием, — или параллельно с другими, немодально. Разрешены ли модальные окна вообще, задаёт свойство конфигурации: режим использования модальности. В новых конфигурациях он выключен, и окна открываются немодально.
6. В режиме Предприятия
Опыт на две минуты, и он стоит того, чтобы проделать его руками.
-
Откройте карточку товара «Ручка шариковая» и запомните артикул.
-
Измените артикул, ничего не нажимая.
-
Откройте список товаров: в колонке артикула — прежнее значение. База правок не видела.
-
Вернитесь в карточку и закройте её. На вопрос о сохранении ответьте «нет».
-
Откройте карточку снова: артикул прежний. Копия ушла вместе с окном.
-
Повторите опыт, но нажмите «Записать и закрыть». Теперь и в списке новое значение. Верните прежний артикул: база серии должна остаться прежней.
Главное в одном абзаце
Запись и форма — два разных существа с разными сроками жизни: запись лежит в базе, пока её не удалили, а форма живёт от открытия окна до закрытия, и у одной записи их столько, сколько людей её открыли. При открытии сервер читает запись и отдаёт копию на клиента, в данные формы; дальше пользователь правит копию, а в базе остаётся прежнее. С первой правки платформа помечает форму изменённой и запирает запись для правки — смотреть её сосед сможет, менять нет, — а при закрытии спрашивает, сохранять ли. В базу данные попадают только явным действием — «Записать», «Записать и закрыть», «Провести»; закрытие окна записью не является, и вместе с окном исчезают и копия записи, и собственные реквизиты формы.
Свои формы мы разбирали, зная о них всё заранее. А если форма чужая — можно ли объяснить в ней каждый реквизит: и основной, и все остальные?
Контрольные вопросы
- Сколько живёт форма и сколько — запись?
- Сколько форм может быть открыто у одной записи и что у каждой внутри?
- Что происходит, когда пользователь открывает карточку товара?
- Пользователь изменил артикул и не нажал ничего. Что увидит его сосед, открывший тот же товар?
- Какими действиями данные попадают в базу?
- Что теряется при закрытии формы без записи?
- Сосед открыл тот же товар, пока вы его правите. Что он увидит и что ему не удастся сделать?
Упражнения
По образцу. Проделайте опыт из параграфа на контрагенте: измените телефон, проверьте список, закройте без сохранения, откройте снова.
Своё: предскажите результат. Пользователь открыл товар, изменил наименование и, не записывая, нажал в карточке кнопку печати ценника (если бы она была). Какое наименование попало бы в ценник, если печать берёт данные из базы, и какое — если из формы?
Ловушка: «я же всё исправил». Кладовщик жалуется: «я поправил артикулы у десяти товаров, а в отчёте старые». Что он, скорее всего, делал и что ему объяснить?
Обратный ход. Пользователь говорит: «открываю товар на изменение, а система не даёт». Какие объяснения возможны и с чего начать проверку?
На чтение. В форме есть реквизит формы «ИтогоВес» и реквизит объекта «Вес» внутри «Объекта». Пользователь меняет вес в строке и закрывает форму без записи. Что стало с каждым из двух значений?
Ответы — в конце части.
§ 3.7. Чужая форма: основной реквизит и всё остальное
Объяснить можно, и порядок тот же, что в любом разборе: сначала предмет разговора, потом всё, что вокруг него. Список реквизитов читается за минуту и рассказывает о форме не меньше, чем её экран: по нему видно, о чём она и что считает сама, ещё до того, как вы посмотрите на поля.
1. Сначала основной
Первый вопрос к списку реквизитов — какой из них основной. Найти его просто: он выделен полужирным, а что он значит, говорит его тип.
| тип основного реквизита | форма о чём |
|---|---|
| объект справочника или документа | об одной записи |
| динамический список | о множестве записей |
| основного нет | не о записи: помощник, настройки, служебный диалог |
В таблице три частых случая, а не весь список: основным реквизитом бывает и набор записей регистра — такие формы встретятся в разговоре об особых формах.
Предмет разговора — первое, что стоит записать при разборе. Дальше каждый следующий реквизит читается уже относительно него — «вокруг чего это».
2. Потом всё остальное — по трём вопросам
К каждому дополнительному реквизиту задают три вопроса. Ответы на первые два приходится искать, третий известен заранее.
| вопрос | обычный ответ |
|---|---|
| откуда берётся значение | пусто при открытии или заполняет обработчик |
| кто и когда его меняет | пользователь в поле или команда формы |
| что с ним станет при закрытии | исчезнет вместе с формой |
Первые два ответа ищут в двух местах: в структуре элементов — есть ли поле, связанное с этим реквизитом, — и в командах формы. Третий искать не нужно: данные формы живут, пока открыто окно.
Отсюда рабочий приём. Если значение должно пережить закрытие окна, где-то рядом обязана быть запись — и стоит найти, куда это значение переносят.
Реквизит формы, значение которого должно пережить окно, — повод искать место, где его записывают. Нет такого места — перед вами ошибка проектирования.
3. Что говорит тип
Тип дополнительного реквизита почти всегда подсказывает назначение.
| что видим | что это, скорее всего |
|---|---|
| Булево | переключатель режима: показывать, разворачивать, печатать |
| Строка | строка поиска, отбора или комментарий на время |
| Число, Дата | параметр расчёта или итог, посчитанный формой |
| ссылка на справочник | выбор, по которому форма что-то отбирает или считает |
| таблица значений | результат, собранный из базы: остатки, история, подбор |
Строка про таблицу значений — самая говорящая: из базы такая таблица сама ничего не читает, строки в неё кладёт обработчик — или пользователь, если у таблицы на форме разрешено добавление строк.
Читать эту таблицу нужно как гипотезу, а не как ответ. Тип подсказывает назначение, а проверяют его по имени реквизита и по тому, где он используется: булево может оказаться не переключателем режима, а значением, которое потом запишут. И не всякий реквизит вообще выводится на экран — об этом прямо сейчас.
4. Реквизит есть, а элемента нет
Частая находка: реквизит в списке есть, а на форме его не видно. Ошибки тут обычно нет — это рабочий приём.
| зачем так делают | пример |
|---|---|
| хранить служебное значение | признак, что форма открыта для просмотра |
| держать результат до нужного момента | подобранные строки, которые перенесут в документ |
| связывать части формы между собой | значение, которое кладёт одна команда, а читает другая |
| оставить след от прежнего решения | реквизит, которым перестали пользоваться |
Последнюю строку отличают от первых трёх поиском: если реквизит не встречается нигде — ни у элемента, ни в командах, ни в модуле формы, — скорее всего, он остался от прошлой жизни формы. Такие находки стоит записывать: они объясняют, почему форма выглядит сложнее, чем работает.
5. Три ловушки списка реквизитов
Первая: искать реквизит формы в дереве объекта. Его там нет и не будет. Признак виден в свойствах поля, там, где записан путь к данным: путь без «Объект.» — значит, значение форма держит у себя.
Вторая: принять развёрнутый «Объект» за список реквизитов формы. Строки внутри основного реквизита — это реквизиты объекта, они хранятся в базе и видны запросу.
Третья: считать, что дополнительный реквизит где-то хранится. Само значение живёт, пока открыто окно, и никакой отчёт его не увидит. А вот запись, на которую он, может быть, указывает, никуда не денется: склад из базы не исчезнет оттого, что закрыли карточку товара.
6. Разбор по шагам
Чужую форму мы читали по трём областям — реквизиты, элементы, команды. Эти пять шагов — то же чтение внутри первой области. Форму возьмите из набора чужих форм, а если его под рукой нет — любую, которую собрали не вы.
-
Найдите основной реквизит и запишите его тип. Назовите предмет разговора одной фразой.
-
Разверните основной реквизит и сверьте состав с деревом объекта: всё ли на месте, нет ли неожиданного.
-
Выпишите дополнительные реквизиты с типами.
-
Для каждого ответьте на два вопроса: откуда берётся значение и кто его меняет. Что будет при закрытии, вы уже знаете.
-
Отметьте те, у которых нет элемента на форме, и найдите, где они используются.
Разбор считается сделанным, когда каждый реквизит объяснён одной фразой про работу пользователя. Строка, которую объяснить не вышло, — не провал, а вопрос к автору формы; таких строк в чужих формах всегда находится одна-две.
Главное в одном абзаце
Читать список реквизитов начинают с основного — он выделен полужирным, — и его тип говорит, о чём форма: об одной записи, о множестве записей или вообще не о записи. Дальше каждый дополнительный реквизит разбирают тремя вопросами: откуда берётся значение, кто его меняет и что с ним станет при закрытии, — и третий ответ известен заранее, потому что данные формы исчезают вместе с окном. Тип даёт гипотезу о назначении: булево — переключатель, строка — поиск или отбор, число — итог, ссылка — выбор для отбора, таблица значений — результат, который кто-то собрал; проверяют гипотезу по имени реквизита и по тому, где он используется. Реквизит без элемента на форме — обычное дело: служебное значение, придержанный результат, связка между командами или след прежнего решения. А ловушек три: искать реквизит формы в дереве объекта, принимать развёрнутый «Объект» за реквизиты формы и думать, что дополнительный реквизит где-то хранится.
Реквизиты мы читать научились, но между ними и полями на экране осталась недосказанность. Поле показывает значение реквизита — а кто и где решил, какое поле какой реквизит показывает?
Контрольные вопросы
- С какого реквизита начинают разбор формы и почему?
- Что говорит о форме тип основного реквизита?
- Какие три вопроса задают к дополнительному реквизиту?
- Почему ответ на третий вопрос известен заранее?
- О чём говорит реквизит формы с типом «таблица значений»?
- Что может означать реквизит, для которого на форме нет элемента?
- Назовите три ловушки при чтении списка реквизитов.
Упражнения
По образцу. Разберите по пяти шагам форму элемента «Товаров», которую вы собрали сами. Ответы известны заранее — проверяется порядок разбора.
Своё: объясните каждый. Возьмите форму, где есть и флажок, и таблица значений, и объясните каждый реквизит одной фразой про работу пользователя.
Ловушка: «этого поля нет в базе». Коллега разбирает чужую форму и говорит: «тут поле «Остаток», но в справочнике такого реквизита нет — форма сломана». Что вы ему ответите и куда предложите посмотреть?
Обратный ход. В форме есть реквизит «ВыбранныйСклад» типа ссылки на «Склады», но ни одного элемента для него нет. Какие объяснения возможны?
На чтение. Основной реквизит формы — динамический список, а рядом с ним реквизит «ТекущийТовар» типа ссылки на «Товары». О чём эта форма и зачем ей, скорее всего, второй реквизит?
Ответы — в конце части.
Ответы к части 3
Ответы собраны здесь, а не под вопросами: подсказка, увиденная сразу после вопроса, отменяет попытку вспомнить. У каждого ответа до трёх ступеней: сам ответ, указание — если ответ не дался сразу — и полное решение там, где рассуждение важнее вывода.
§ 3.1. Реквизит объекта и реквизит формы: одно слово, два смысла
К вопросу 1. Ответ. У реквизита объекта хозяин — объект, и значение лежит в базе у каждой записи. У реквизита формы хозяин — форма, и значение живёт в данных открытого окна.
К вопросу 2. Ответ. По умолчанию — пока открыто окно, и после закрытия не остаётся ничего. Исключение одно: если у формы включено сохранение данных в настройках, значение вернётся к этому пользователю при следующем открытии. В базу оно не попадает и тогда.
К вопросу 3. Указание. Куда смотрит запрос?
Полное решение. Запрос к базе видит то, что в базе хранится, и больше ничего. Реквизита формы там нет — он живёт в данных открытой формы. Дело не в запретах, а в адресе: запрос ищет не там, где лежит значение. Отсюда и практическое следствие: если значение понадобилось в отчёте, скорее всего, оно должно храниться, то есть быть реквизитом объекта.
К вопросу 4. Ответ. Спросить, можно ли получить значение запросом. Можно — реквизит объекта; нельзя — реквизит формы.
К вопросу 5. Ответ. Потому что устроены они похоже: имя, тип и хозяин. Различает их хозяин, а с ним и срок жизни.
К вопросу 6. Ответ. Значение на экране есть, а в базе его нет: это реквизит формы. Обычно это сигнал, что значение завели не там, где ему место.
К вопросу 7. Ответ. В форме, среди её реквизитов. В дереве справочника его нет и быть не должно: это не свойство товара.
К упражнению «По образцу». Ответ. В списке объекта — наименование, артикул, единица и стандартные реквизиты; в списке формы — строка «Объект», а всё остальное появляется там, только если его завели. Совпадений между списками может не быть вовсе.
К упражнению «Своё: придумайте реквизит». Ответ. Например, флажок «показывать подробности» и строка поиска внутри формы. Оба нужны, пока окно открыто, и не описывают товар: хранить их в базе значило бы записывать привычки одного пользователя в свойства вещи.
К упражнению «Ловушка: „добавь поле в справочник"». Ответ. Просят реквизит объекта, а нужен реквизит формы — или даже настройка пользователя.
Полное решение. Формулировка «добавить в карточку галочку» описывает результат на экране, а не место хранения. Ключ в словах «каждый пользователь включал её себе»: значение зависит не от товара, а от того, кто смотрит. Если завести такое реквизитом объекта, галочка станет общей для всех, потому что запишется в товар. Место такому значению в форме, а если оно должно пережить закрытие окна — в настройках пользователя, о которых книга скажет позже.
К упражнению «Обратный ход». Ответ. Либо это реквизит формы, которого в базе нет; либо реквизит объекта, который в отчёт просто не вывели. Различить можно по списку реквизитов объекта.
К упражнению «На чтение». Ответ. «Итого» — реквизит формы: он живёт, пока открыто окно, в базе его нет и запрос его не найдёт. Скорее всего, значение считают при открытии или при изменении строк, а храниться ему незачем.
§ 3.2. Основной реквизит: главный предмет разговора
К вопросу 1. Ответ. Он выделен в списке реквизитов формы — отмечен как основной.
К вопросу 2. Ответ. Создаёт конструктор, собирая форму по объекту. Не будет его у произвольной формы.
К вопросу 3. Ответ. От типа объекта и вида формы: у формы одной записи это сама запись, у формы списка — список.
К вопросу 4. Указание. Что отличает форму, пригодную для карточки товара, от формы, пригодной для списка?
Полное решение. Пригодность формы на роль определяется типом её основного реквизита. Форма с основным реквизитом типа «объект справочника» говорит об одной записи — она годится как форма элемента. Форма со списком — как форма списка или выбора. В свойствах объекта из пригодных выбирают основную. Так замыкается линия, начатая в параграфе о назначении: устройство формы решает, на что она годится, а объект — какую из годных открывать.
К вопросу 5. Ответ. Реквизит формы. Но тип у него — объект справочника, поэтому внутри него лежат реквизиты объекта: артикул, единица, наименование.
К вопросу 6. Ответ. Потому что разговор ведётся об одном предмете, и форма должна знать, о каком.
К вопросу 7. Ответ. Для разговоров не о записи: помощники, настройки, служебные диалоги. Обычно такие формы лежат в общих формах.
К упражнению «По образцу». Ответ. «Объект» типа СправочникОбъект.Контрагенты.
К упражнению «Своё: предскажите тип». Ответ. У формы документа — «Объект» типа ДокументОбъект.ПоступлениеТоваров; у формы списка контрагентов — «Список», динамический список.
К упражнению «Ловушка: „переименую — станет понятнее"». Ответ. Окно не изменилось: отметка «основной» и тип остались прежними. Изменилось имя, по которому к реквизиту обращаются.
Полное решение. Переименование касается только адреса. Всё, что держится на отметке и типе, — данные записи в полях, вопрос о сохранении при закрытии, пригодность формы на роль — работает как раньше. Но код формы, если он есть, обращается к реквизиту по имени и перестанет его находить, а коллеги, открыв форму, будут искать привычное «Объект». Ясности прибавилось только самому разработчику, и то до первого чужого взгляда.
К упражнению «Обратный ход». Ответ. У формы нет предмета разговора: это произвольная форма. Скорее всего, она лежит в общих формах или открывается явно, а в основные формы объекта её не ставят.
К упражнению «На чтение». Ответ. Предмет разговора — «Объект» типа ДокументОбъект.Заказ, основной реквизит. «ПоказыватьОплаты» — вспомогательный реквизит формы: флажок, который живёт, пока открыто окно.
§ 3.3. Разворачиваем «Объект»: откуда в форме реквизиты товара
К вопросу 1. Ответ. Всё, из чего состоит запись: стандартные реквизиты вроде кода и наименования и реквизиты, заведённые в дереве справочника.
К вопросу 2. Ответ. Из типа основного реквизита. В форме хранится одна строка «Объект» с типом объекта справочника, а состав типа платформа берёт из описания справочника.
К вопросу 3. Ответ. Внутри «Объекта» новый реквизит появился сам. На экране ничего не изменилось: поля для него никто не положил.
К вопросу 4. Указание. Какие части формы хранятся в ней самой, а какие приносит тип?
Полное решение. У формы две разные части. Данные записи видны через тип основного реквизита, и этот тип всегда описывает объект таким, какой он сейчас, — поэтому новый реквизит внутри «Объекта» появляется сам. Раскладка — элементы, поля на экране — хранится в самой форме: это решение, принятое когда-то и записанное. Новое поле само себя не положит. Отсюда «отставание» своей формы: отстаёт не то, что форма знает, а то, что она показывает.
К вопросу 5. Ответ. Реквизит «Артикул» у записи, о которой разговаривает форма. Путь с другого начала ведёт к значению, которое форма держит у себя.
К вопросу 6. Ответ. На звено длиннее: Объект.Товары.Количество.
К вопросу 7. Ответ. Развернув основной реквизит: отдельными строками реквизиты объекта в списке формы не перечисляются.
К упражнению «По образцу». Ответ. Из дерева справочника — ИНН, Телефон и КонтактноеЛицо; стандартные — ссылка, код, наименование, пометка удаления. Родителя нет: справочник контрагентов не иерархический.
К упражнению «Своё: предскажите путь». Ответ. В форме контрагента — Объект.ИНН; в форме поступления — Объект.Товары.Цена.
К упражнению «Ловушка: „реквизит добавил, а форма не видит"». Ответ. Форма видит новый реквизит — данными, внутри «Объекта». Не видно поля. Нужно не пересоздавать форму, а положить поле, перетащив реквизит в элементы.
Полное решение. Пересоздание решило бы задачу грубо: конструктор снял бы свежий снимок, и поле появилось бы — но вместе с этим пропала бы вся раскладка, которую разработчик успел сделать. Путаница в том, что «форма не видит» смешивает две части формы. Данные у неё свежие, отстала раскладка — и лечится именно она, одним перетаскиванием.
К упражнению «Обратный ход». Ответ. «Комментарий» — реквизит объекта: он хранится в записи, о которой разговаривает форма, и в дереве объекта найдётся.
К упражнению «На чтение». Ответ. «Объект» — данные документа поступления, хранятся в базе. «ИтогоВес» — реквизит формы: живёт, пока открыто окно, и считается формой, в базе его нет.
§ 3.4. Дополнительные реквизиты формы: данные помимо записи
К вопросу 1. Ответ. Рядом с «Объектом», а не внутри него. Путь к ним — одно имя, без «Объект.».
К вопросу 2. Ответ. Вспомогательное значение для расчёта, временное значение ввода, переключатель режима.
К вопросу 3. Ответ. Понадобится ли это значение завтра другому человеку, открывшему ту же запись. Да — в запись; нет — в форму.
К вопросу 4. Ответ. Реквизит — это данные; на экране появляется элемент. Пока из реквизита не сделали элемент, пользователю показывать нечего.
К вопросу 5. Ответ. Даёт место для значения и возможность вывести его флажком. Не даёт реакции на изменение: чтобы флажок что-то прятал, нужен обработчик.
К вопросу 6. Указание. Одно из свойств — про вопрос при закрытии, другое — про память между открытиями. Какое у кого?
Полное решение. «Сохраняемые данные» — свойство реквизита. Оно делает изменение этого реквизита правкой данных формы: форма помечает себя изменённой и при закрытии спрашивает, сохранить ли. Сохранение данных в настройках — свойство формы, и оно про другое: значение отмеченного реквизита запоминается для пользователя и возвращается при следующем открытии. Первое отвечает на вопрос «было ли что сохранять», второе — «помнить ли выбор».
К вопросу 7. Ответ. Значение реквизита формы живёт, пока открыто окно: закрыли — оно пропало. Сохранение в настройках у формы включено не было.
К упражнению «По образцу». Ответ. В списке реквизитов формы контрагента рядом с «Объектом» появляется «ПоказыватьКонтакты», а после перетаскивания в элементы — поле, показанное флажком.
К упражнению «Своё: запись или форма». Ответ. Дата последней сверки — в запись: её спросит и другой человек. Строка поиска — в форму: она нужна одному окну. Количество строк — в форму: его можно посчитать в любой момент. Примечание к поступлению — в запись: оно часть документа.
К упражнению «Ловушка: „сделай, чтобы флажок работал"». Ответ. Сделано место для значения и флажок на экране. Не сделан обработчик, который на изменение флажка прячет и показывает поля. Это не ошибка, а половина задачи.
Полное решение. Заказчик видит результат на экране и ждёт поведения. Но поведение и данные — разные слои: реквизит формы хранит значение, а реакцию на его изменение задаёт обработчик. Сделанное не лишнее: без реквизита обработчику нечего было бы проверять. Честный ответ заказчику — «значение заведено, поведение будет добавлено», а не «сейчас починим».
К упражнению «Обратный ход». Ответ. Свойство «Сохраняемые данные» у реквизита формы, в котором хранится режим просмотра. Скорее всего, оно включено, и форма считает переключение режима правкой данных.
К упражнению «На чтение». Ответ. «Отбор» — строка, по которой, скорее всего, ищут в табличной части; «ИтогоВес» — посчитанный при открытии или при изменении строк итог. Оба нужны одному окну, завтра другому пользователю не понадобятся.
§ 3.5. Типы реквизитов формы: простые, ссылочные, особые
К вопросу 1. Ответ. Простые — одно значение; ссылочные — указатель на запись; особые — целая структура: таблица, список и дерево значений, динамический список.
К вопросу 2. Ответ. Особые. Реквизит объекта хранится в базе, и тип ему можно дать лишь такой, какой база умеет хранить в записи; данные формы живут в открытом окне, и ограничения хранения на них не действуют.
К вопросу 3. Ответ. Пропадёт выбор — сама ссылка в реквизите формы. Останется склад: запись лежит в базе и от закрытия окна не зависит.
К вопросу 4. Указание. Сравните по четырём признакам: где задана, где строки, кто видит, какой путь.
Полное решение. Табличная часть задана в дереве объекта, её строки хранятся в базе у записи, видны любой форме объекта и запросу, путь к ней — Объект.Товары. Таблица значений задана в форме, строки живут в данных открытого окна, видит их только эта форма, путь — просто имя реквизита. Похожи они внешне — строки и колонки, — но первая часть записи, а вторая часть разговора.
К вопросу 5. Ответ. Чтобы показать то, что посчитано, а не записано. Например, остатки товара по складам: они хранятся в регистре, а в карточке товара их удобно показать таблицей.
К вопросу 6. Ответ. К особым: «Список» формы списка — динамический список, со своими свойствами.
К вопросу 7. Ответ. Вид элемента следует из типа: строка, число и дата — поле ввода, булево — поле-флажок, ссылка — поле с кнопкой выбора, таблица значений — таблица.
К упражнению «По образцу». Ответ. Рядом с «Объектом» появляется «ПоследниеПоступления» с колонками «Документ» и «Сумма», а в элементах — таблица. В Предприятии она пустая: заполнить её может только обработчик.
К упражнению «Своё: подберите тип». Ответ. Склад для просмотра — ссылка на «Склады»; варианты сортировки — список значений; итоги по месяцам — таблица значений; признак «только просмотр» — булево.
К упражнению «Ловушка: „удалил выбор — удалился склад"». Ответ. Поле хранит ссылку на склад, а не сам склад. Очистить поле — значит убрать ссылку; запись склада в базе останется.
Полное решение. Страх понятен: в поле видно наименование склада, и кажется, что это и есть склад. Но реквизит формы — временный и хранит только указатель на запись. Очистка поля меняет указатель, а не то, на что он указывал. Чтобы склад действительно исчез, его нужно пометить на удаление в самом справочнике — совсем другое действие в другом месте.
К упражнению «Обратный ход». Ответ. В реквизитах формы: таблица, которой нет среди табличных частей объекта, — реквизит формы, скорее всего таблица значений. Её строки не хранятся в записи: их при открытии или по действию кладёт обработчик.
К упражнению «На чтение». Ответ. «Объект» и «Список» — основные реквизиты разных видов форм, и вместе в одной форме они не встречаются: основной реквизит один. «ИтогиПоМесяцам» — обычный дополнительный реквизит.
§ 3.6. Форма и запись: две жизни одних данных
К вопросу 1. Ответ. Форма живёт от открытия окна до закрытия. Запись лежит в базе, пока её не удалили.
К вопросу 2. Ответ. Столько, сколько людей открыли запись. У каждой формы внутри своя копия данных этой записи.
К вопросу 3. Ответ. Сервер читает запись из базы, копия попадает в данные формы, клиент строит по описанию формы окно и показывает копию.
К вопросу 4. Ответ. Прежний артикул: правка изменила копию в форме, а не запись в базе.
К вопросу 5. Ответ. «Записать», «Записать и закрыть», а у документа ещё и «Провести». Закрытие окна записью не является.
К вопросу 6. Указание. Что вообще живёт в форме?
Полное решение. Теряется всё, что жило в форме: и собственные её реквизиты — флажки, отборы, посчитанные таблицы, — и копия записи с несохранёнными правками. В базе остаётся то, что там было до открытия окна. Именно поэтому платформа перед закрытием измененной формы спрашивает о сохранении: другого шанса не будет.
К вопросу 7. Ответ. Увидит товар и все его данные — открыть на просмотр никто не мешает. Не удастся изменить: запись заперта для правки, пока вы не запишете или не закроете форму.
К упражнению «По образцу». Ответ. В списке контрагентов телефон прежний, пока не нажата запись; после закрытия без сохранения карточка открывается с прежним телефоном.
К упражнению «Своё: предскажите результат». Ответ. Из базы напечаталось бы прежнее наименование, из формы — новое. Разница и есть та самая граница между записью и копией.
К упражнению «Ловушка: „я же всё исправил"». Ответ. Скорее всего, он правил карточки и закрывал их, не записывая, — отвечая «нет» на вопрос о сохранении или закрывая крестиком. В базу правки не попали.
Полное решение. Ощущение «я всё исправил» опирается на то, что человек видел новые значения на экране. Видел он копию. Объяснять стоит не через устройство платформы, а через действие: правка считается сделанной, когда нажата запись; до этого она живёт только в открытом окне. Проверить легко — открыть список рядом: он показывает базу, а не чужую форму.
К упражнению «Обратный ход». Ответ. Скорее всего, ту же запись правит сейчас другой сеанс и она заперта для изменения. Начать стоит с вопроса, кто ещё держит эту карточку открытой; вторая возможность — не хватает прав на изменение.
К упражнению «На чтение». Ответ. Оба значения исчезли вместе с формой: «ИтогоВес» жил в форме, изменённый «Вес» лежал в копии записи. В базе — прежний вес.
§ 3.7. Чужая форма: основной реквизит и всё остальное
К вопросу 1. Ответ. С основного: он выделен полужирным и называет предмет разговора. Пока не назван предмет, остальные реквизиты не к чему отнести.
К вопросу 2. Ответ. Объект справочника или документа — форма об одной записи; динамический список — о множестве записей; основного нет — форма не о записи: помощник, настройки, служебный диалог.
К вопросу 3. Ответ. Откуда берётся значение, кто и когда его меняет и что с ним станет при закрытии формы.
К вопросу 4. Ответ. Потому что данные формы живут, пока открыто окно: при закрытии значение исчезнет вместе с формой.
К вопросу 5. Указание. Кто кладёт в такую таблицу строки?
Полное решение. Таблица значений — место для того, что посчитано, а не записано. Из базы она сама ничего не читает, поэтому её появление означает, что строки кто-то кладёт: обработчик при открытии или по команде, а иногда сам пользователь, если таблице разрешено добавлять строки. Отсюда следующий шаг разбора — найти, где эта таблица наполняется: там и будет видно, зачем форме такой реквизит.
К вопросу 6. Ответ. Служебное значение, придержанный до нужного момента результат, связку между командами формы — или след прежнего решения, если реквизит нигде не используется.
К вопросу 7. Ответ. Искать реквизит формы в дереве объекта; принимать развёрнутый «Объект» за список реквизитов формы; считать, что дополнительный реквизит где-то хранится.
К упражнению «По образцу». Ответ. Основной реквизит «Объект» типа СправочникОбъект.Товары — форма об одной записи справочника; внутри него состав товара из дерева; дополнительных реквизитов столько, сколько вы завели сами, и у каждого известно, откуда он взялся.
К упражнению «Своё: объясните каждый». Ответ. Каждая фраза должна быть о работе пользователя, а не об устройстве: «флажок решает, показывать ли подробности», «в таблице — остатки по складам, чтобы не открывать отчёт». Фраза вида «булево, потому что булево» объяснением не считается.
К упражнению «Ловушка: „этого поля нет в базе"». Указание. С какого имени начинается путь у этого поля?
Полное решение. Форма не сломана: поле связано не с реквизитом объекта, а с реквизитом формы, и в дереве справочника такого искать бессмысленно. Смотреть нужно в список реквизитов формы: там «Остаток» найдётся рядом с «Объектом», а не внутри него, и путь у поля будет без «Объект.». Значение в базе не хранится — его при открытии формы кто-то считает, чаще всего по регистру.
К упражнению «Обратный ход». Ответ. Возможны три объяснения: реквизит держит служебное значение и на экран не выводится; его кладёт одна команда, а читает другая; он остался от прежнего решения. Различают поиском: где «ВыбранныйСклад» используется — у элемента, в команде, в модуле формы.
К упражнению «На чтение». Ответ. Форма о множестве записей — список товаров. «ТекущийТовар», скорее всего, держит товар, на котором стоит курсор, чтобы форма могла что-то о нём показать или сделать; в базе это значение не хранится и исчезнет вместе с окном.
§ 4.1. Элемент формы: то, что пользователь видит и трогает
Решение записано у самого поля — в свойстве, где сказано, откуда оно берёт значение. Читать эту запись мы будем в следующем параграфе, а сначала договоримся, что считать полем и чем оно отличается от всего остального, что стоит в окне. Слово для этого в 1С есть: элемент формы.
1. Элемент — это то, что видно
Всё, что пользователь видит в окне и на что может нажать, — элементы формы. Поле ввода, флажок, таблица, кнопка, подпись над группой полей: каждый из них — отдельный элемент со своим именем и своими свойствами.
| что видит пользователь | как это называется в редакторе |
|---|---|
| строка ввода с подписью | поле |
| таблица со строками | таблица |
| кнопка «Записать и закрыть» | кнопка |
| рамка с заголовком вокруг полей | группа |
| надпись-пояснение | декорация |
Список короткий, и это не случайность: из этих пяти видов элементов собирается любая форма, какой бы сложной она ни выглядела. Разнообразие даёт не их число, а настройки каждого — у поля, у группы и у декорации есть ещё и собственное свойство «Вид» со своим списком значений: им задают, каким именно полем или какой группой элемент будет. Слово одно, уровня два: вид элемента и вид поля. Виды поля разберём дальше в этой главе, а виды группы и декорации — в главе о композиции.
Элемент формы — единица того, что видно. Данные отвечают на вопрос «о чём форма», элементы — на вопрос «что у неё на экране».
2. Живут элементы деревом
Эти пять видов не лежат россыпью: они выстроены в дерево, и корень у него один — элемент «Форма», сама форма как целое.
Форма ← корень
├── Наименование ← поле
├── Артикул ← поле
├── ПоказыватьПодробности ← поле-флажок
├── ОстаткиПоСкладам ← таблица
└── ЕдиницаИзмерения ← поле
Вложенность в этом дереве — не украшение, а порядок показа: что вложено в группу, то внутри её рамки и окажется, а порядок строк задаёт порядок показа. Развернётся он сверху вниз или слева направо — решают настройки группы; об этом разговор в главе о композиции, здесь достаточно увидеть, что структура есть и что читают её сверху вниз.
3. У каждого элемента своё имя
Чтобы к узлу дерева можно было обратиться и настроить его, у каждого элемента есть имя. Имя — не подпись на экране: подпись задаётся другим свойством, и о нём речь в разговоре о свойствах. Имя же — то, как элемент зовут внутри формы; стоит оно первой строкой в свойствах и в структуре элементов.
| реквизит формы | элемент формы | |
|---|---|---|
| что это | данные | то, чем их показывают |
| где в редакторе | реквизиты | элементы |
| имя по умолчанию | задаёт разработчик | по имени реквизита, если элемент создан перетаскиванием |
Последняя строка объясняет добрую половину путаницы. Перетащили реквизит «Артикул» в элементы — редактор создал поле и назвал его тоже «Артикул». Одинаковые имена в двух списках выглядят как одна вещь, а вещей две: строка в реквизитах — данные, строка в элементах — способ их показать.
Совпадение имён — привычка редактора, а не свойство платформы. Имя элемента можно сменить, и от этого не изменится ни одно значение в базе.
4. Элемент живёт только в форме
Реквизит объекта задан в дереве, и любая форма этого объекта видит его через свой основной реквизит — так же, как мы разбирали в прошлой главе. С элементом не так: он существует внутри одной формы и больше нигде.
Справочник «Товары»
├── Реквизиты ──────── общие для всех
└── Формы
├── ФормаЭлемента ─ свои элементы
└── ФормаСписка ─── свои элементы
Отсюда следствие, которое пригодится при разборе. Одно и то же значение в двух формах показывают два разных элемента, и настроены они могут быть по-разному: в карточке артикул — поле ввода, в списке — колонка. Спорить, «как выглядит артикул», бессмысленно, не назвав форму.
5. Свойства: чем элементом управляют
У элемента есть палитра свойств, и почти всё, что он умеет, задано там. Свойств много, и в палитре они разложены по своим группам; нам для чтения удобно держать в голове три: про данные, про внешний вид, про поведение. Деление это наше, а не платформенное: иное свойство попадает сразу в две группы — заголовок, например, и про вид, и про данные, если оставить его пустым.
| о чём свойство | что задаёт | пример |
|---|---|---|
| данные | откуда элемент берёт значение | путь к данным |
| внешний вид | как он выглядит | ширина, заголовок |
| поведение | что с ним можно делать | доступность, только просмотр |
Первая строка — ось всей главы, и есть она не у всех. Путь к данным задают там, где есть что показывать: у поля и у таблицы. Остальным трём показывать нечего.
| элемент | путь к данным | чем занят |
|---|---|---|
| поле | есть | показывает одно значение |
| таблица | есть | показывает строки |
| группа | нет | собирает другие элементы |
| кнопка | нет | запускает команду |
| декорация | нет | поясняет: надпись или картинка |
Документация о декорации говорит прямо: это элемент, предназначенный для оформления, в отличие от поля. Она на экране видна, а к разговору о товаре отношения не имеет.
Внешний вид и поведение развернём в конце главы; здесь довольно того, что по смыслу свойства делятся на эти три группы.
6. Что из этого следует для чтения
Разбирая чужую форму, элементы читают отдельно от данных — и вопросы к ним задают свои.
| вопрос | о чём он |
|---|---|
| какого вида элемент | поле, таблица, кнопка, группа, декорация |
| как он называется | имя в структуре |
| откуда берёт значение | путь к данным, если он есть |
| что с ним можно делать | свойства поведения |
Первые два вопроса закрываются взглядом на структуру элементов, вторые два — палитрой свойств. Порядок именно такой: сначала опознать элемент, потом спрашивать, чем он занят.
7. В Конфигураторе
Посмотрим на элементы формы, которую собрали сами, — глазами разбора. Путь к данным мы здесь только найдём глазами; читать его будем в следующем параграфе.
-
Откройте форму элемента «Товаров» и перейдите к структуре элементов.
-
Выпишите все элементы сверху вниз и против каждого — его вид: поле, таблица, группа, кнопка, декорация.
-
Найдите корневой элемент «Форма» и убедитесь, что остальные вложены в него.
-
Щёлкните по полю «Артикул» и посмотрите палитру свойств: имя, свойства внешнего вида, свойство с путём к данным.
-
Сравните два списка — реквизиты и элементы. Найдите строку, которая есть в обоих; строку, которая есть только в реквизитах; и элемент, которому в реквизитах пары нет вовсе, — кнопку или группу.
Пятый шаг — главный. Реквизит без элемента и элемент без реквизита — доказательство с двух сторон: данные и элементы разные списки, и один другому не равен.
Главное в одном абзаце
Элемент формы — единица того, что видно: поле, таблица, кнопка, группа, декорация; из этих пяти видов собирается любое окно, а разнообразие даёт не их число, а настройки каждого. Элементы выстроены деревом с корнем «Форма», и порядок в дереве задаёт порядок показа. У каждого элемента своё имя, и то, что оно часто совпадает с именем реквизита, — привычка редактора, а не тождество: строка в реквизитах это данные, строка в элементах — способ их показать. Живёт элемент только в своей форме, поэтому одно значение в карточке и в списке показывают разные элементы, настроенные по-разному. Управляют элементом свойства, и по смыслу их удобно делить на три группы: данные, внешний вид, поведение. Путь к данным есть только у тех, кому есть что показывать, — у поля и у таблицы; группа собирает, кнопка действует, декорация поясняет.
Имена совпадают, списки разные, а на экране всё выглядит одним целым. Если элемент — не данные, то что именно изменится, если его убрать? И что останется от формы, если убрать реквизит?
Контрольные вопросы
- Что такое элемент формы и какие пять видов элементов бывают?
- Как устроена структура элементов и что означает порядок в ней?
- Почему имя элемента часто совпадает с именем реквизита и что это означает?
- Где живёт элемент и почему его нет в дереве объекта?
- Одно значение показано в карточке и в списке. Сколько тут элементов?
- На какие три группы делятся свойства элемента?
- У каких элементов нет пути к данным и почему?
Упражнения
По образцу. Выпишите структуру элементов формы элемента «Контрагентов» и проставьте против каждой строки вид элемента.
Своё: назовите вид. Для каждого из описаний назовите вид элемента: рамка «Контактные данные» вокруг двух полей; надпись «Заполняется автоматически»; строка с телефоном; кнопка «Провести»; список поступлений внизу карточки.
Ловушка: «переименовал поле — потерял данные». Разработчик переименовал в форме элемент «Артикул» в «ПолеАртикула» и боится, что в базе что-то испортится. Что на самом деле изменилось и что нет?
Обратный ход. В структуре элементов есть строка, для которой в реквизитах формы нет пары, а в дереве объекта — тоже нет. Что это может быть?
На чтение. В форме два элемента с именами «Наименование» и «НаименованиеПодпись». Что можно предположить о каждом, не открывая свойства?
Ответы — в конце части.
§ 4.2. Почему элементы не равны данным
Откройте карточку товара и уберите из структуры поле «Артикул», не трогая реквизиты. В списке товаров артикул никуда не денется — его просто перестанут показывать в одной карточке. А теперь наоборот: представьте, что исчез реквизит формы, а поле осталось. Адрес у поля есть, вести ему некуда. Два удаления, два разных исхода, и вся суть параграфа — в этой разнице: то, что хранят, и то, чем показывают, живут врозь.
1. Два удаления
Проще всего увидеть разницу, сравнив два действия, которые на экране дают похожий результат.
| что сделали | что с данными | что на экране |
|---|---|---|
| убрали элемент | значение на месте | поля нет |
| убрали реквизит формы | в форме значения нет | поле осталось, а путь ведёт в пустоту |
Речь именно о реквизите формы. Реквизит объекта убирают в дереве, и это разговор о хранении, а не о показе: значение исчезает у всех записей сразу.
Первая строка — обычное дело: так прячут от пользователя то, что ему не нужно. Вторая — почти всегда ошибка, и заметна она не сразу. Элементы, у которых пути к данным нет вовсе, — декорации, кнопки, группы — от такого удаления не страдают: им и показывать было нечего.
Элемент можно убрать без потерь для данных. Данные без элемента живут, элемент без данных — нет.
2. Главный обман: «нарисовал поле — завёл данные»
Ошибка новичка звучит так: раз поле на форме появилось, значит, и место для значения появилось. Растёт она из жеста, который мы делали не раз.
перетащили реквизит в элементы
├── создан элемент ← как видно
└── задана связь ← с чем связан
Жест один, действий два, и редактор делает оба сам, ни о чём не спрашивая. Скрытым второе не остаётся: связь видна в свойствах созданного элемента. А вот если добавить элемент не перетаскиванием, а вручную, задавать её придётся самому — иначе поле останется ни с чем.
| что думает новичок | как на самом деле |
|---|---|
| нарисовал поле — завёл данные | нарисовал поле — завёл способ показать данные |
| удалил поле — удалил данные | удалил поле — убрал показ |
| поле пустое — данных нет | поле пустое — значение не заполнено или связи нет |
Последняя строка — самая коварная: пустое поле выглядит одинаково в двух самых частых случаях, а бывают и другие.
3. Четыре сочетания
Раз это две вещи, они сочетаются четырьмя способами — и все четыре встречаются в живых формах.
| элемент есть | элемента нет | |
|---|---|---|
| реквизит есть | обычное поле | значение живёт, но не показано |
| реквизита нет | декорация, кнопка, группа | ничего |
Верхняя левая клетка — то, что видно в форме чаще всего. Правая верхняя знакома по прошлой главе: реквизит формы без элемента — служебное значение или результат, который кладёт в него обработчик. Нижняя левая — элементы, которым нечего показывать по их природе.
Есть ли что показывать — решает реквизит формы. Показано ли оно и как — решает элемент со своими свойствами.
4. Один реквизит — сколько угодно элементов
Раз элемент только показывает, ничто не мешает показать одно значение несколько раз и по-разному.
Объект.Артикул
├── поле в карточке
├── колонка в списке
└── поле в форме выбора
Все три элемента показывают одно и то же значение из базы: изменили в одном месте, записали — увидели везде. Обратное неверно: свойство с путём к данным у элемента одно — одна строка, один адрес. Вести он может куда угодно — в реквизит формы, в реквизит объекта, в колонку табличной части, — но он один.
| реквизит | элемент | |
|---|---|---|
| сколько может быть на другой стороне | элементов сколько нужно | адрес один |
| где живёт | в данных формы | в структуре элементов одной формы |
5. Связь называется путём к данным
У элемента есть свойство, в котором записано, что он показывает. Записано оно именем: «Объект.Артикул», «ПоказыватьПодробности» — те самые пути, которые мы читали в прошлой главе.
Пусто это свойство — элемент ни с чем не связан. Заполнено — связан ровно с тем, что там написано. Читать и задавать его будем в следующем параграфе; здесь важно другое: связь — не подразумевается, а записана, и её видно. А раз видно, ею можно пользоваться при разборе поломок.
6. Зачем это при чтении чужой формы
Разделение данных и элементов превращает три частых жалобы в три разных поиска.
| жалоба | где искать |
|---|---|
| «поле пропало» | элементы: убрали или спрятали, данные не трогали |
| «поле есть, а значения не видно» | путь к данным: связан ли элемент и с чем |
| «ввожу, а в отчёте нет» | реквизиты: значение в форме, а не в записи |
Третью строку мы разбирали в главе о данных, первые две — дело этой главы. Общее у них одно: прежде чем чинить, называют, что именно сломано — показ или данные.
7. В Конфигураторе и в Предприятии
Опыт с удалением, после которого ничего не придётся восстанавливать из копии.
-
Откройте форму элемента «Товаров» и удалите из структуры элементов поле «Артикул». Реквизиты не трогайте.
-
Обновите конфигурацию базы данных и откройте карточку товара в Предприятии: поля нет.
-
Откройте список товаров: колонка артикула на месте, и значение в ней прежнее. Данные никуда не делись — их перестала показывать одна форма.
-
Вернитесь в форму и перетащите «Артикул» из реквизитов обратно в элементы. Обновите конфигурацию: поле вернулось, значение прежнее.
Четвёртый шаг стоит проделать внимательно: возвращённое поле встанет, скорее всего, не туда, где стояло. Данные это не задело — а порядок на экране пришлось восстанавливать руками. Ровно в этом и состоит разница между тем, что хранится, и тем, что показывают.
Главное в одном абзаце
Элемент и данные — две разные вещи с разной судьбой: уберёшь элемент — значение останется, уберёшь реквизит — показывать станет нечего. Главный обман новичка, «нарисовал поле — завёл данные», растёт из перетаскивания: жест один, а действий за ним два — создать элемент и связать его с данными. Сочетаний поэтому четыре, и все они живые: реквизит с элементом — обычное поле, реквизит без элемента — значение, которое не показывают, элемент без реквизита — декорация, кнопка или группа, и пустое место, когда нет ни того ни другого. Есть ли что показывать — решает реквизит, показано ли оно и как — элемент со своими свойствами; одно значение показывают сколько нужно элементов, а адрес у элемента один. Связь между ними не подразумевается, а записана в свойстве элемента — в пути к данным.
Связь записана, и записана именем. Но какое имя туда попадает, что оно означает по частям — и что будет, если написать не то?
Контрольные вопросы
- Что происходит с данными, если удалить элемент, и что — если удалить реквизит?
- Почему возникает обман «нарисовал поле — завёл данные»?
- Какие два действия скрыты в перетаскивании реквизита в элементы?
- Назовите четыре сочетания реквизита и элемента и приведите пример каждого.
- Сколько элементов может показывать один реквизит и сколько реквизитов может показывать один элемент?
- Поле на форме пустое. Какие причины у этого возможны?
- Где записана связь элемента с данными?
Упражнения
По образцу. Проделайте опыт из параграфа на форме элемента «Контрагентов»: удалите поле телефона, посмотрите список, верните обратно.
Своё: разложите по клеткам. Отнесите к одной из четырёх клеток: кнопка «Записать», поле артикула, реквизит формы «ОстаткиПоСкладам» без выведенной таблицы, надпись «Все цены без НДС».
Ловушка: «удалил поле — потерял данные». Коллега случайно удалил с формы поле «ЕдиницаИзмерения» и говорит, что теперь единицы у товаров пропали. Как проверить это за минуту и что вы ему скажете?
Обратный ход. В форме есть поле, а значения в нём никогда не видно, хотя у товаров значение заполнено. Какие объяснения возможны и в каком порядке их проверять?
На чтение. В форме поступления два элемента связаны с «Объект.Контрагент»: поле в шапке и ещё одно поле рядом с итогом — показывает, но ввода не принимает. Что это значит и ошибка ли это?
Ответы — в конце части.
§ 4.3. Поле и его путь к данным
В свойство попадает адрес — имя того, что поле показывает. Документация говорит об этом свойстве коротко: оно содержит путь к реквизиту, с которым связан элемент. Адрес этот читается по частям, и прочитать его — значит ответить на главный вопрос о любом поле: откуда оно берёт значение.
1. Поле — элемент, который показывает одно значение
Из пяти видов элементов поле встречается чаще прочих, и работа у него простая: показать одно значение и, если разрешено, дать его изменить. Строки — не его дело, для них есть таблица.
В документации это сказано так: поле предназначено для показа и редактирования реквизитов формы нетабличных типов, а внутри таблицы поле становится её колонкой. Читать это нужно как «поле показывает одно значение, а не таблицу целиком»: значение это может быть и из табличной части — тогда поле и живёт колонкой. К колонкам вернёмся в главе о списках.
2. Путь читается по частям
Путь — это имя, собранное через точку. Первая часть называет то, чем располагает форма, то есть её реквизит — чаще всего основной, «Объект»; остальные части уточняют, что взять внутри.
| путь | что означает |
|---|---|
| ПоказыватьПодробности | реквизит формы целиком |
| Объект.Артикул | реквизит объекта внутри основного реквизита |
| Объект.Товары.Количество | колонка табличной части |
Правило чтения у нас уже есть — оно из главы о данных: начинается с «Объект.» — значит, перед нами данные записи, о которой форма разговаривает; начинается с другого имени — значит, форма держит это значение у себя.
Путь к данным — адрес, а не копия. Поле не держит значение у себя: оно показывает то, что лежит в данных формы по этому адресу, и по этому же адресу отправляет введённое обратно.
3. Путь не пишут, его выбирают
Свободного текста здесь нет: путь задают, выбирая из списка того, чем форма располагает.
| как появился элемент | что с путём |
|---|---|
| перетащили реквизит в элементы | путь заполнен сразу |
| добавили элемент вручную | путь пуст, его выбирают из списка данных формы |
Отсюда следствие, успокаивающее новичка: выбирая из списка, ошибиться трудно — там только то, что у формы есть. Набрать путь руками редактор тоже позволяет, и вот тогда опечатка возможна. А испортиться путь может и позже — об этом чуть ниже.
4. Из пути поле узнаёт свой тип
Связь даёт полю больше, чем значение. Из данных приходит тип, а из типа — то, как поле выглядит и ведёт себя по умолчанию.
| тип, пришедший из данных | что появляется у поля |
|---|---|
| строка | обычный ввод текста |
| число | ввод цифр, выравнивание вправо |
| дата | кнопка календаря |
| булево | флажок |
| ссылка на запись | кнопка выбора, если выбор разрешён |
Правило, которое встречалось ещё в разговоре об автоформах, здесь получает точное объяснение. Вид поля следует из типа реквизита не потому, что платформа угадывает, а потому, что поле спрашивает тип по своему адресу. Слово «по умолчанию» тут не лишнее: у поля есть и собственное свойство «Вид», которым выбор платформы можно изменить, — об этом следующий параграф.
Поле не хранит тип у себя: оно спрашивает его у данных, на которые указывает. А вид, подсказанный типом, можно и переопределить.
5. Когда путь ведёт в пустоту
Опечатки нет, а сломаться связь всё-таки может: реквизит удалили или переименовали, а поле осталось со старым адресом.
было: Объект.Артикул → реквизит
стало: Объект.Артикул → нет такого
Эти два случая стоит различать с самого начала: путь не задан — связи никогда не было; путь ведёт в пустоту — связь была и устарела. Поле в обоих случаях пустое, а чинят их по-разному: в первом связь задают, во втором ищут, что случилось с реквизитом.
Проверять это стоит там же, где менялось: изменили состав данных — пройдите по элементам и посмотрите их пути. Привычка та же, что из разговора о цене своей формы: поменяли объект — проверьте его формы.
6. Как читать поле в чужой форме
Разбор одного поля укладывается в три вопроса, и все три закрываются свойством с путём.
| вопрос | ответ по пути |
|---|---|
| откуда значение | адрес целиком |
| это данные записи или формы | начинается ли путь с «Объект.» |
| где искать источник | в дереве объекта или в реквизитах формы |
Есть и четвёртый вопрос, который задают, когда пути нет вовсе: чем занят элемент, если он ничего не показывает? Ответов два. Либо это кнопка, группа или декорация — им путь и не положен. Либо это поле, которому связь просто не задали: так бывает у элемента, добавленного вручную.
7. В Конфигураторе
Соберём и прочитаем связь своими руками.
- Откройте форму элемента «Товаров», выделите поле «Артикул» и найдите в палитре свойств путь к данным. Прочитайте его вслух по частям.
-
Посмотрите путь у поля-флажка «ПоказыватьПодробности»: он из одной части — это данные формы, а не записи.
-
Добавьте в элементы новое поле вручную, не перетаскиванием. Посмотрите на предпросмотр: поле есть, показывать ему нечего.
-
Задайте новому полю путь к данным, выбрав «Объект.Наименование». Теперь на форме два элемента показывают одно значение — то самое, о чём говорил прошлый параграф.
-
Удалите добавленное поле: оно было нужно для опыта.
Третий шаг стоит запомнить: именно так выглядит элемент, которому не задали связь. Не «сломан», не «пуст» — просто ни с чем не связан.
Главное в одном абзаце
У поля есть свойство, в котором записан путь к данным — адрес того, что поле показывает; документация так и говорит: путь к реквизиту, с которым связан элемент. Читается адрес по частям через точку: первая часть называет реквизит формы, остальные уточняют, что взять внутри, — «Объект.Артикул» это данные записи, «ПоказыватьПодробности» данные самой формы. Пишут путь не руками: его выбирают из списка того, чем форма располагает, поэтому опечатки почти исключены — зато адрес может повиснуть, если реквизит потом удалили или переименовали. Из пути поле узнаёт тип, а из типа берётся его вид и поведение: календарь у даты, кнопка выбора у ссылки, флажок у булева — поле не знает своего типа, оно узнаёт его у данных. Поэтому разбор любого поля начинается с одного места: посмотреть путь и прочитать его по частям.
Тип пришёл из данных и сам выбрал полю вид. Но у поля есть и собственное свойство «Вид» — значит, выбор платформы можно изменить? И насколько далеко это заходит: одно значение — сколько способов показать?
Контрольные вопросы
- Что записано в свойстве «путь к данным» и как оно читается?
- Что означает путь, начинающийся с «Объект.», и чем он отличается от пути из одной части?
- Как выглядит путь к колонке табличной части?
- Почему опечатка в пути почти невозможна и как он тогда может повиснуть?
- Откуда поле берёт свой тип и что из этого следует для его вида?
- Что показывает поле, которому не задали путь?
- Какие три вопроса о поле закрывает его путь к данным?
Упражнения
По образцу. Выпишите пути к данным всех полей формы элемента «Контрагентов» и отметьте, какие из них ведут в запись, а какие — в данные формы.
Своё: предскажите вид. Не открывая редактор, скажите, что появится у поля, связанного с реквизитом «Дата» документа, с реквизитом «Контрагент» и с реквизитом формы типа Булево.
Ловушка: «поле сломалось». После того как из справочника убрали реквизит, в форме осталось поле, которое ничего не показывает. Коллега предлагает пересобрать форму заново. Что вы предложите вместо этого?
Обратный ход. У поля путь «Объект.Товары.Цена». Что можно сказать об этом поле и где оно, скорее всего, находится на форме?
На чтение. В форме два элемента: у первого путь «Объект.Контрагент», у второго пути нет вовсе, а на экране в нём виден текст. Что это за элементы?
Ответы — в конце части.
§ 4.4. Виды полей: одно значение, разные способы показать
Выделите поле «Артикул» и раскройте в палитре список у строки «Вид»: выбран в нём один вариант — тот, что подставила платформа, глядя на строковый тип. Выбор этот не окончательный: вариант в списке меняют, как любую другую настройку. Здесь и становится видно во всей полноте, что элемент и то, что он показывает, — разные вещи: артикул один, а способов его показать несколько.
1. Свойство «Вид» и кто его заполняет
У поля есть свойство, которое решает, чем оно будет на экране.
| кто задаёт | когда |
|---|---|
| платформа | сама, по типу данных из пути |
| разработчик | когда выбор платформы не подходит |
Значение по умолчанию — не приказ, а предложение. Строка получает поле ввода потому, что это самый ходовой вид для строки, а не потому, что иначе нельзя.
2. Пять рабочих видов
Своих видов у поля около двух десятков — не путать с пятью видами элементов из начала главы, — но в обычной форме встречаются в основном пять.
| вид | что показывает | ввод |
|---|---|---|
| поле ввода | значение любого типа | да |
| поле надписи | значение, которое менять нельзя | нет |
| поле флажка | булево: да или нет | да |
| поле переключателя | выбор одного варианта из нескольких | да |
| поле картинки | картинку | нет |
Остальные нужны для особых задач: поле календаря показывает месяц целиком, поле индикатора — шкалу заполнения, поля табличного и текстового документа — встроенный документ. Встретив такое поле в чужой форме, вы узнаете его по имени вида и по тому, что оно показывает.
Доступен, впрочем, не весь набор сразу: выбор сужает тип данных, на которые поле указывает.
3. Вид ограничен типом
Свобода тут не полная, и ограничивают её данные.
| тип данных | какие виды подойдут |
|---|---|
| строка, число, дата | ввод, надпись |
| булево | флажок, ввод, надпись |
| ссылка на запись | ввод, надпись |
| набор вариантов | переключатель |
Правило простое: вид меняет способ показа, но не сам показываемый предмет. Флажок возможен, когда за полем булево, — и то лишь один из допустимых видов: булево показывают и полем ввода, и надписью. А строку флажком не покажешь: нечего ставить и снимать.
Тип решает, что показывают. Вид решает, как. Второе выбирают из того, что позволяет первое.
4. Надпись и декорация — не одно и то же
Самая полезная пара в этом параграфе. Оба показывают текст, который нельзя изменить, а различаются тем, откуда текст берётся.
| поле надписи | декорация | |
|---|---|---|
| это | поле — тот же элемент, что и поле ввода, только вид другой | другой вид элемента, не поле |
| путь к данным | есть | нет |
| что на экране | значение из данных | текст, набранный разработчиком |
| меняется ли | да, когда меняется значение | нет, он записан в форме |
Отсюда правило чтения чужой формы: увидели текст, который выглядит как подпись, — посмотрите в структуре, что это за элемент, и проверьте путь к данным. Поле с путём — данные, показанные без права ввода. Декорация — просто надпись, пути к данным у неё не бывает.
5. Зачем менять вид
Поводов немного, и все они про работу пользователя.
| повод | что делают |
|---|---|
| значение показать, но не давать менять | вид «поле надписи» |
| выбор из двух-трёх вариантов на виду | вид «поле переключателя» |
| признак, который читают глазами | вид «поле картинки» |
Первая строка — самая частая, и у неё есть соперник: свойство поведения, которое запрещает изменение, оставляя поле полем. Разница в том, что видит пользователь: надпись выглядит как текст, а запрещённое к изменению поле — как поле, в которое не пускают.
6. Один реквизит — два вида рядом
Раз вид принадлежит элементу, одно значение можно показать дважды и по-разному на одной форме.
Объект.Артикул
├── поле ввода ← в карточке правят
└── поле надписи ← в шапке показывают
Оба элемента смотрят по одному адресу: изменили в поле ввода — надпись обновилась. Это прямое продолжение правила из разговора о том, почему элементы не равны данным: сколько угодно элементов на один реквизит, и каждый настроен по-своему.
7. В Конфигураторе и в Предприятии
Опыт на две минуты: одно значение, два способа показать.
- Откройте форму элемента «Товаров» и выделите поле «Артикул». Найдите в палитре свойство «Вид» и посмотрите, что предлагает список.
-
Смените вид на «поле надписи». Обновите конфигурацию базы данных и откройте карточку товара: артикул виден, но не вводится.
-
Верните полю вид «поле ввода»: карточка снова даёт править артикул.
-
Выделите поле-флажок «ПоказыватьПодробности» и посмотрите список видов у него. Он короче — тип булево позволяет меньше.
-
Ничего не меняя, закройте форму. Если что-то поменяли — верните: база серии должна остаться прежней.
Второй шаг стоит проделать даже тем, кому он кажется очевидным. Поле, ставшее надписью, — самый наглядный пример того, что данные и их показ живут врозь: в базе ничего не изменилось, а работать с карточкой стало иначе.
Главное в одном абзаце
У поля есть свойство «Вид», и платформа заполняет его сама по типу данных из пути — но это предложение, а не приказ. Рабочих видов пять: поле ввода, поле надписи, поле флажка, поле переключателя, поле картинки; всего же видов у поля около двух десятков, и остальные нужны для особых задач. Свобода выбора ограничена типом: флажок возможен, когда за полем булево, переключатель — когда есть набор вариантов, а строку ни тем ни другим не покажешь. Отсюда правило: тип решает, что показывают, вид — как. Поле надписи и декорация выглядят одинаково, но первое связано с данными и меняется вместе с ними, а второе показывает текст, записанный в форме, — различает их путь к данным. Менять вид стоит ради работы пользователя: показать без права ввода, дать выбор на виду, показать признак картинкой; и одно значение спокойно показывают два элемента разного вида на одной форме.
Вид выбран, путь задан, значение на экране. Но поле может оказаться невидимым, недоступным для ввода или без подписи — и всё это тоже чьи-то решения. Где они записаны?
Контрольные вопросы
- Какое свойство решает, чем поле будет на экране, и кто его заполняет?
- Назовите пять видов полей, которые встречаются чаще всего.
- Почему нельзя показать строку полем флажка?
- Чем поле надписи отличается от декорации и как их различить в чужой форме?
- Зачем менять вид поля? Назовите два повода.
- Что произойдёт со значением в базе, если сменить вид поля?
- Можно ли показать один реквизит двумя полями разного вида на одной форме?
Упражнения
По образцу. Смените вид поля «Телефон» в форме элемента «Контрагентов» на надпись, посмотрите в Предприятии и верните обратно.
Своё: подберите вид. Какой вид вы дадите полю для каждого случая: ИНН, который менеджеру нельзя править; признак «архивный» у контрагента; выбор способа доставки из трёх вариантов; логотип контрагента.
Ловушка: «сделай поле некликабельным». Заказчик просит, чтобы поле суммы в документе «нельзя было трогать». Назовите два способа и объясните, чем они отличаются для пользователя; точные настройки второго разберём дальше.
Обратный ход. В чужой форме текст показывается и меняется при изменении данных, а ввести в него ничего нельзя. Что это за элемент и как проверить догадку?
На чтение. В форме поле связано с реквизитом типа Булево, а вид у него — поле ввода. Что увидит пользователь и зачем так могли сделать?
Ответы — в конце части.
§ 4.5. Свойства элемента: видимость, доступность, заголовок, подсказка
Записаны они там же, где путь и вид, — в палитре свойств элемента, среди тех самых свойств внешнего вида и поведения, о которых говорилось в начале главы. Четыре свойства из неё встречаются почти у каждого элемента и решают судьбу поля на экране: видно ли его, можно ли в него вводить, что написано рядом и что всплывает при наведении курсора.
1. Четыре свойства, которые есть почти у всех
Свойств у элемента десятки, но эти четыре читают первыми.
| свойство | что задаёт | что видит пользователь |
|---|---|---|
| Видимость | показывать ли элемент | есть поле на экране или нет |
| Доступность | можно ли с ним работать | обычное поле или приглушённое |
| Заголовок | подпись к элементу | текст слева или сверху |
| Подсказка | текст при наведении курсора | всплывающее пояснение |
Все четыре — про показ, а не про данные. Значение в базе от них не меняется: погасить поле и спрятать его — не то же самое, что стереть значение.
2. Видимость: элемент есть, на экране его нет
Документация говорит коротко: ложь — поле не отображается. Элемент при этом никуда не девается: он остаётся в структуре, со своим путём и видом, просто его не показывают.
| элемент удалили | элементу сняли видимость | |
|---|---|---|
| в структуре элементов | его нет | он есть |
| на экране | нет | нет |
| вернуть обратно | собрать заново | поставить свойство |
Это и есть декларативность в самом чистом виде: прятать поле — не действие, а правило. Никто не пишет «спрятать поле», кто-то один раз снял флажок в свойстве.
Спрятанное поле — не удалённое: оно осталось в структуре. И спрятано оно не навсегда — пользователь часто может вернуть его себе сам.
3. Доступность и только просмотр
Два свойства, которые легко спутать, потому что оба про «нельзя изменить».
| свойство | что происходит | как выглядит |
|---|---|---|
| Доступность = ложь | с полем нельзя работать вовсе | поле приглушено |
| Только просмотр = истина | значение видно, изменить нельзя | поле выглядит обычным |
Документация добавляет к «только просмотру» важную оговорку: свойство имеет смысл лишь там, где редактирование не запрещено прикладным смыслом или правами. Иначе говоря, это не защита, а удобство: поле, которое незачем трогать.
И третий способ мы уже знаем — сменить вид на надпись. Три способа, три разных впечатления у пользователя.
| способ | что видит пользователь |
|---|---|
| вид «поле надписи» | текст, поля нет |
| только просмотр | поле как поле, но ввод не принимает |
| доступность = ложь | приглушённое поле, до него не добраться |
4. Заголовок и подсказка
Заголовок — подпись к элементу. Пустой он не означает «подписи не будет»: документация говорит, что пустая строка — это автоматическое определение заголовка. Платформа возьмёт его из представления реквизита — то самое правило из разговора об автоформах. Убрать подпись совсем можно другим свойством, — оно задаёт, где стоит заголовок, и среди его значений есть «нет».
| что в свойстве | что на экране |
|---|---|
| пусто | подпись, собранная платформой |
| свой текст | этот текст |
| положение заголовка «нет» | подписи нет вовсе |
Подсказка — всплывающий текст при наведении курсора, и у неё есть соседнее свойство, задающее способ показа: всплывать, стоять рядом кнопкой и другие варианты.
Пишут подсказки не для украшения. Поле «Артикул» в подсказке не нуждается, а поле «Коэффициент» — очень.
5. Элемент есть, а на экране его нет
Это самое частое недоумение при разборе чужой формы, и причин у него несколько.
| причина | где проверить |
|---|---|
| снято свойство «Видимость» | палитра свойств элемента |
| скрыта группа, в которой он лежит | палитра свойств этой группы |
| пользователь убрал поле себе | настройка формы у этого пользователя |
| не хватает прав | роли пользователя |
| видимость меняет код формы | модуль формы |
Порядок проверки — от простого к трудному, сверху вниз по таблице: сначала палитра — у самого элемента и у группы над ним, — потом настройка формы, потом права, и только в конце модуль. Причины эти самые частые, но не единственные: поле может и просто не поместиться на экране, о чём речь в главе о композиции. Всё, кроме последней строки, читается глазами; последняя требует открыть модуль, а он в этой книге за границей.
Прежде чем открывать модуль, посмотрите свойство. Чаще всего ответ там.
6. Пользователь тоже настраивает форму
Про третью строку стоит сказать отдельно, потому что она удивляет: часть решений принимает не разработчик.
| что может пользователь | как |
|---|---|
| скрыть ненужные поля | снять флажки в настройке формы |
| вывести поле для реквизита, которому элемента не досталось | кнопка добавления полей там же |
| переставить поля и собрать в группы | там же |
Доступна настройка, если форма это позволяет и у пользователя есть право сохранять свои данные; сохраняется она за ним одним — у соседа форма останется прежней, а сбросить свою настройку он может там же. Следствие для чтения важное: поле, скрытое свойством, — не тайна, вернуть его себе пользователь обычно может. Свойством прячут от взгляда, а не от доступа: доступ закрывают правами.
Прятать элемент свойством или кодом — договорённость команды, а не правило платформы. Для чтения формы свойство удобнее: оно видно в палитре, а код виден только тому, кто открыл модуль.
7. В Конфигураторе и в Предприятии
Опыт на все четыре свойства сразу.
-
Откройте форму элемента «Товаров» и снимите видимость у поля «ЕдиницаИзмерения». Обновите конфигурацию и посмотрите карточку: поля нет.
-
В Предприятии откройте настройку формы и найдите скрытое поле в списке. Поставьте флажок: поле вернулось — у вас одного.
-
Верните видимость в Конфигураторе, а в Предприятии сбросьте свою настройку формы.
-
Задайте полю «Артикул» подсказку «Внутренний код товара» и посмотрите, как она всплывает.
-
Очистите у этого поля заголовок и посмотрите, что подпись осталась: платформа собрала её сама.
-
Верните всё как было: база серии должна остаться прежней.
Второй шаг стоит проделать даже тем, кто уверен, что знает ответ. Он показывает: форма, которую вы собрали, — не последнее слово. Последнее остаётся за тем, кто с ней работает.
Главное в одном абзаце
Четыре свойства элемента решают его судьбу на экране: видимость — показывать ли его, доступность — можно ли с ним работать, заголовок — что написано рядом, подсказка — что всплывёт при наведении курсора; данных они не касаются вовсе. Спрятанный элемент не удалён: он остаётся в структуре со своим путём и видом, и это чистая декларативность — не действие «спрятать», а правило в свойстве. Запретить изменение можно тремя способами, и пользователь увидит три разные вещи: надпись вместо поля, поле, не принимающее ввод, или приглушённое поле. Пустой заголовок означает не «подписи нет», а «подпись соберёт платформа». А когда элемент есть, но на экране его нет, причин несколько: снята видимость у самого элемента или у группы над ним, пользователь убрал поле себе в настройке формы, не хватает прав или видимость меняет код, — и проверять их стоит в этом порядке, начиная с палитры свойств.
Читать одно поле мы научились: путь, вид, четыре свойства. Но в чужой форме полей два десятка — с какого начать и как не утонуть в свойствах?
Контрольные вопросы
- Какие четыре свойства элемента читают первыми и что задаёт каждое?
- Чем спрятанный элемент отличается от удалённого?
- Почему видимость — пример декларативности?
- Назовите три способа не дать пользователю изменить значение и разницу между ними.
- Что означает пустое свойство «Заголовок»?
- Элемент есть, а на экране его нет. Какие причины возможны и в каком порядке их проверять?
- Что может сделать с формой сам пользователь и что из этого следует?
Упражнения
По образцу. Снимите видимость у поля «КонтактноеЛицо» в форме элемента «Контрагентов», проверьте в Предприятии и верните обратно.
Своё: подберите свойство. Что вы зададите для каждого случая: телефон должен быть виден, но не правиться; поле «Комментарий» нужно спрятать от всех; у поля «ИНН» должно всплывать пояснение; подпись к полю «Наименование» нужно изменить на «Название товара».
Ловушка: «поле исчезло». Пользователь звонит: «из карточки пропал артикул, верните». В форме поле есть, видимость стоит. Что вы спросите и куда посмотрите?
Обратный ход. У поля заголовок пуст, а подпись на экране есть. Откуда она взялась и что будет, если в свойстве написать свой текст?
На чтение. В чужой форме поле «Сумма» погашено, а рядом надпись показывает ту же сумму. Что сделал автор формы и зачем, скорее всего?
Ответы — в конце части.
§ 4.6. Чужая форма: разбор полей и путей к данным
Начинают не с поля, а со списка: чужую форму разбирают не глядя на экран, а идя сверху вниз по структуре элементов и записывая про каждую строку три вещи. Свойств у элемента десятки, но для разбора хватает нескольких — вида, пути к данным и тех, что решают, что пользователь может с полем сделать. Утонуть в остальных не получится, если сразу завести таблицу.
1. Таблица разбора
Выглядит она так, и заполняется по одной строке на элемент.
| элемент | вид | путь к данным | что это значит |
|---|---|---|---|
| Артикул | поле ввода | Объект.Артикул | данные записи, правятся |
| ИтогоВес | поле надписи | ИтогоВес | данные формы, считает код |
| Пояснение | декорация | — | текст, записанный в форме |
Три первые колонки списываются с редактора, четвёртая — та, ради которой всё затевалось: в ней вы своими словами говорите, откуда значение и что с ним делает пользователь.
2. Идти по структуре, а не по экрану
Соблазн разбирать по картинке велик, но структура надёжнее.
| экран | структура элементов | |
|---|---|---|
| что видно | только показанное | всё, включая скрытое |
| порядок | зависит от групп | тот, что задал разработчик |
| свойства | не видны | рядом, в палитре |
Экран пригодится потом — чтобы сверить прочитанное с тем, что достаётся пользователю. Но первым читают дерево: оно полное.
3. Три вопроса к каждому полю
Вопросы те же, что в прошлых параграфах, только теперь их задают подряд и быстро.
| вопрос | где ответ |
|---|---|
| что это за элемент | поле, таблица, кнопка, группа или декорация — видно в структуре; у поля вид уточняет свойство «Вид» |
| откуда берёт значение | путь к данным |
| что с ним может пользователь | видимость, доступность, только просмотр |
Заголовок смотрят не всегда, а когда подпись на экране расходится с именем реквизита: это верный признак, что её задали руками.
4. Что считать находкой
Разбор нужен не ради таблицы: в ней ищут места, где форма говорит о замысле автора.
| находка | о чём говорит |
|---|---|
| поле без пути к данным | связь не задали или реквизит исчез |
| два поля с одним путём | одно значение показано дважды, обычно по-разному |
| поле с необычным видом | значение показывают, но не дают править |
| поле со снятой видимостью | показывают не всем или не всегда |
| реквизит без поля | значение живёт в форме, но пользователю не показано |
Последняя строка находится не в таблице элементов, а сравнением двух списков — реквизитов и элементов. Это тот самый приём из главы о данных, и здесь он работает так же.
5. Что видно по путям в сумме
Когда пути выписаны, из них складывается портрет формы — ещё до того, как вы поняли её замысел.
пути с «Объект.» → форма об одной записи
пути без него → значение не из записи
путей нет вовсе → форма не связана
с данными напрямую
Если почти все пути ведут в «Объект.», перед вами обычная карточка. Если половина путей — в реквизиты формы, значит, значение приходит не из записи; чаще всего его готовит код, но это стоит проверить. Если путей нет совсем, данные появятся от действий пользователя или из кода: так устроены помощники, диалоги и рабочие места — те самые формы, у которых в центре задача, а не предмет. Разговор о них — в главе об особых формах.
6. Четыре ловушки
Первая: читать экран вместо структуры. Скрытые элементы так и останутся незамеченными, а именно в них часто вся соль.
Вторая: принять декорацию за поле. На экране текст выглядит одинаково, а различает их вид элемента в структуре: поле это или декорация. Путь к данным — подтверждение: у декорации его не бывает вовсе.
Третья: забыть про группы. Поле может быть видимым, а группа над ним — нет; на экране не будет ни того ни другого.
Четвёртая: счесть пустое поле сломанным. Пустым оно бывает и когда связи нет, и когда значение просто не заполнено.
7. Разбор по шагам
Шесть шагов, которые складываются с разбором реквизитов из главы о данных.
-
Откройте структуру элементов и выпишите все элементы сверху вниз, отмечая вид каждого.
-
Для каждого поля запишите путь к данным; для элементов без пути поставьте прочерк.
-
Отметьте элементы, у которых снята видимость или доступность, и группы, в которых они лежат.
-
Сверьте список путей со списком реквизитов: найдите реквизиты, которым элемента не досталось.
-
Объясните каждую строку одной фразой про работу пользователя.
-
Откройте форму в Предприятии и сверьте: то ли вы прочитали.
Шестой шаг — не формальность. Прочитанное в редакторе и увиденное в Предприятии расходятся чаще, чем кажется, и каждое расхождение — это чья-то настройка, которую вы пропустили.
Главное в одном абзаце
Чужую форму разбирают по структуре элементов, а не по экрану: структура полная, в ней видно и скрытое. На каждый элемент заводят строку таблицы и записывают три вещи — вид, путь к данным и то, что пользователь может с ним сделать; заголовок смотрят, когда подпись на экране расходится с именем реквизита. Находки ищут в готовой таблице: поле без пути, два поля с одним путём, поле с необычным видом, снятая видимость, а сравнением с реквизитами — значение, которому элемента не досталось. По путям в сумме виден портрет формы: сплошные «Объект.» — обычная карточка, много собственных реквизитов — значение приходит не из записи, путей нет вовсе — форма не связана с данными напрямую. И четыре ловушки: читать экран вместо структуры, принять декорацию за поле, забыть про группу над полем и счесть пустое поле сломанным.
Поля разобраны поодиночке, и каждое объяснено. Но экран — не список полей: они стоят рядами, собраны в рамки, разложены по страницам. Кто и где решает, как всё это размещается?
Контрольные вопросы
- Почему разбор начинают со структуры элементов, а не с экрана?
- Какие три вещи записывают про каждый элемент?
- Когда стоит посмотреть на заголовок элемента?
- Назовите три находки, ради которых составляют таблицу разбора.
- Как найти реквизит, которому не досталось элемента?
- Что можно сказать о форме, если почти все пути начинаются с «Объект.»?
- Назовите четыре ловушки разбора полей.
Упражнения
По образцу. Составьте таблицу разбора для формы элемента «Товаров» — той, что вы собирали сами. Ответы известны заранее, проверяется порядок.
Своё: объясните каждое поле. Возьмите форму, где есть поле-флажок и поле надписи, и объясните каждую строку одной фразой про работу пользователя.
Ловушка: «в форме нет поля склада». Коллега разбирает форму поступления по экрану и говорит, что склад в ней не выводится. Где он мог его не заметить?
Обратный ход. В таблице разбора у двух полей один и тот же путь, и у одного из них вид «поле надписи». Что задумал автор формы?
На чтение. В форме десять элементов, и ни у одного нет пути к данным. Что это за форма и где искать её данные?
Ответы — в конце части.
Ответы к части 4
Ответы собраны здесь, а не под вопросами: подсказка, увиденная сразу после вопроса, отменяет попытку вспомнить. У каждого ответа до трёх ступеней: сам ответ, указание — если ответ не дался сразу — и полное решение там, где рассуждение важнее вывода.
§ 4.1. Элемент формы: то, что пользователь видит и трогает
К вопросу 1. Ответ. Элемент формы — единица того, что видно в окне. Видов пять: поле, таблица, кнопка, группа, декорация.
К вопросу 2. Ответ. Элементы выстроены деревом с корнем «Форма», и порядок в дереве — это порядок на экране: что выше, то и показано выше; что вложено в группу, то внутри её рамки.
К вопросу 3. Указание. Кто дал элементу имя?
Полное решение. Имя элементу дал редактор, когда реквизит перетащили в элементы: проще всего было назвать его так же. Тождества за этим нет. Строка в реквизитах — данные, строка в элементах — способ их показать, и имя элемента можно сменить, ничего не потеряв: в базе от этого не изменится ни одно значение. Одинаковые имена — привычка редактора, и путаница из-за неё стоит дороже, чем кажется.
К вопросу 4. Ответ. Внутри своей формы и больше нигде. В дереве объекта элементов нет: там заданы данные, а как их показывать — дело каждой формы.
К вопросу 5. Ответ. Два: в карточке своё поле, в списке своя колонка. Это разные элементы разных форм, и настроены они могут быть по-разному.
К вопросу 6. Ответ. Данные — откуда элемент берёт значение; внешний вид — как он выглядит; поведение — что с ним можно делать.
К вопросу 7. Ответ. У группы, кнопки и декорации: группа собирает другие элементы, кнопка запускает команду, декорация поясняет. Показывать им нечего, поэтому и пути к данным у них нет. Он есть у поля и у таблицы.
К упражнению «По образцу». Ответ. В форме элемента «Контрагентов» — поля наименования, кода, ИНН, телефона и контактного лица; если вы выводили флажок «ПоказыватьКонтакты», рядом будет поле-флажок. Корень у структуры один — «Форма».
К упражнению «Своё: назовите вид». Ответ. Рамка «Контактные данные» — группа; надпись «Заполняется автоматически» — декорация; строка с телефоном — поле; кнопка «Провести» — кнопка; список поступлений внизу карточки — таблица.
К упражнению «Ловушка: „переименовал поле — потерял данные"». Указание. Что вообще хранится в базе — элементы или реквизиты?
Полное решение. Изменилось только имя элемента внутри этой формы. В базе не изменилось ничего: там лежат значения реквизитов, а элемент — способ их показать. Поле по-прежнему показывает артикул, потому что связь задана не именем, а путём к данным. Осторожность нужна в другом месте: на имя элемента может ссылаться код формы, если он есть, — тогда переименование придётся повторить и там.
К упражнению «Обратный ход». Ответ. Это один из тех элементов, у которых пути к данным нет: декорация — надпись или картинка, группа, собирающая другие элементы, или кнопка, у которой вместо данных команда.
К упражнению «На чтение». Ответ. «Наименование» — поле, показывающее реквизит с тем же именем; «НаименованиеПодпись» — скорее всего декорация или поле-надпись рядом с ним. Проверяется это одним взглядом: есть ли у второго элемента путь к данным.
§ 4.2. Почему элементы не равны данным
К вопросу 1. Ответ. Удалили элемент — значение осталось, его просто перестали показывать. Удалили реквизит формы — элемент, который на него ссылался, остался с путём, ведущим в пустоту.
К вопросу 2. Указание. Сколько действий скрыто в одном движении мышью?
Полное решение. Обман растёт из перетаскивания. Реквизит перенесли в элементы — редактор создал элемент и тут же задал ему связь, и со стороны это выглядит одним действием. Отсюда ощущение, что поле и есть данные. Проверяется оно легко: добавьте элемент вручную — связь не появится, и поле окажется ни с чем.
К вопросу 3. Ответ. Создать элемент и задать ему связь с данными — путь к данным.
К вопросу 4. Ответ. Реквизит с элементом — обычное поле; реквизит без элемента — служебное значение, которое не показывают; элемент без реквизита — декорация, кнопка, группа; нет ни того ни другого — пустое место.
К вопросу 5. Ответ. Один реквизит показывают сколько нужно элементов — поле в карточке, колонка в списке, поле в форме выбора. У элемента свойство с путём одно: один адрес.
К вопросу 6. Ответ. Самые частые две: значение не заполнено или элемент ни с чем не связан. Бывают и другие — например, значение заполняет обработчик, которого нет.
К вопросу 7. Ответ. В свойстве элемента — в пути к данным.
К упражнению «По образцу». Ответ. В списке контрагентов телефон остаётся на месте: удалили элемент, а не данные. После возврата поле, скорее всего, встанет в конец формы — порядок придётся поправить руками.
К упражнению «Своё: разложите по клеткам». Ответ. Кнопка «Записать» — элемент без реквизита; поле артикула — реквизит с элементом; реквизит формы «ОстаткиПоСкладам» без таблицы — реквизит без элемента; надпись «Все цены без НДС» — элемент без реквизита.
К упражнению «Ловушка: „удалил поле — потерял данные"». Указание. Где посмотреть значение, не открывая эту форму?
Полное решение. Проверка занимает минуту: откройте список товаров или отчёт — единицы на месте. Удалён был элемент, то есть способ показать значение в одной форме; сами значения лежат в записях и видны всем остальным формам и запросам. Восстановить показ просто — перетащить реквизит обратно в элементы; поправить придётся разве что порядок полей.
К упражнению «Обратный ход». Ответ. Порядок проверки такой: сначала посмотреть путь к данным у этого поля — задан ли он и туда ли ведёт; потом — не заполняет ли значение обработчик, которого нет; и только потом искать причину в самих данных.
К упражнению «На чтение». Ответ. Ошибки нет: один реквизит показывают два элемента, и настроены они по-разному — в шапке для ввода, у итога для просмотра. Значение у обоих одно и то же, потому что адрес один.
§ 4.3. Поле и его путь к данным
К вопросу 1. Ответ. Адрес того, что поле показывает, — путь к реквизиту, с которым связан элемент. Читается по частям через точку, слева направо.
К вопросу 2. Ответ. Путь с «Объект.» ведёт в данные записи, о которой форма разговаривает. Путь из одной части — в реквизит самой формы, значение которого живёт, пока открыто окно.
К вопросу 3. Ответ. Из трёх частей: основной реквизит, табличная часть, реквизит строки — «Объект.Товары.Количество».
К вопросу 4. Указание. Откуда берутся части пути, когда его задают?
Полное решение. Путь обычно выбирают из списка того, чем форма располагает, — несуществующего там просто нет. Набрать его руками редактор тоже позволяет, и тогда опечатка возможна. Но чаще путь портится не при задании, а потом: реквизит удалили или переименовали, а поле осталось со старым адресом. Поэтому правило и звучит так: поменяли состав данных — пройдите по элементам.
К вопросу 5. Ответ. Тип приходит из данных по пути, и из него по умолчанию следует вид поля и его поведение: календарь у даты, флажок у булева, кнопка выбора у ссылки. Переопределить выбор платформы можно свойством «Вид».
К вопросу 6. Ответ. Ничего: поле есть, а показывать ему нечего. Это не поломка — связь просто не задана.
К вопросу 7. Ответ. Откуда значение; данные это записи или формы; где искать источник — в дереве объекта или в реквизитах формы.
К упражнению «По образцу». Ответ. У полей наименования, кода, ИНН, телефона и контактного лица пути начинаются с «Объект.» — это данные записи. У флажка «ПоказыватьКонтакты», если вы его выводили, путь из одной части — данные формы.
К упражнению «Своё: предскажите вид». Ответ. У даты — поле с кнопкой календаря; у контрагента — поле с кнопкой выбора; у булева — поле, показанное флажком.
К упражнению «Ловушка: „поле сломалось"». Указание. Что именно перестало существовать — поле или его адрес?
Полное решение. Пересобирать форму незачем: сломалась одна связь, а не форма. Посмотрите у поля путь к данным — он ведёт на реквизит, которого больше нет. Дальше два пути: если реквизит убрали намеренно, удалите и поле; если его переименовали, задайте полю новый адрес. Форма при этом остаётся своей, со всей раскладкой, которую иначе пришлось бы собирать заново.
К упражнению «Обратный ход». Ответ. Путь из трёх частей ведёт в строку табличной части, значит, это колонка таблицы товаров, а не поле в шапке. Искать его надо внутри элемента-таблицы.
К упражнению «На чтение». Ответ. Первый — поле, связанное с реквизитом объекта. Второй — декорация: текст на экране у неё есть, а пути к данным не бывает вовсе.
§ 4.4. Виды полей: одно значение, разные способы показать
К вопросу 1. Ответ. Свойство «Вид». Платформа заполняет его сама по типу данных, на которые указывает путь, а разработчик может выбрать другой вид из допустимых.
К вопросу 2. Ответ. Поле ввода, поле надписи, поле флажка, поле переключателя, поле картинки.
К вопросу 3. Ответ. Флажку нужно значение, которое бывает только истинным или ложным. У строки такого смысла нет — ставить и снимать нечего.
К вопросу 4. Указание. Откуда каждый из них берёт текст?
Полное решение. Поле надписи — это поле, только вид у него другой: у него есть путь к данным, и на экране оно показывает значение, которое меняется вместе с данными. Декорация — другой вид элемента, пути к данным у неё нет вовсе, а текст записан в самой форме и сам по себе не меняется. Различают их в чужой форме одним движением: смотрят, есть ли у элемента путь к данным.
К вопросу 5. Ответ. Показать значение без права ввода; дать выбор из нескольких вариантов на виду; показать признак картинкой.
К вопросу 6. Ответ. Ничего. Вид — свойство элемента, то есть способа показать; значения в базе он не касается.
К вопросу 7. Ответ. Можно: оба поля смотрят по одному адресу, и меняются вместе. Например, поле ввода в карточке и надпись в шапке.
К упражнению «По образцу». Ответ. Телефон виден, но не вводится; в базе значение прежнее. После возврата вида поле снова принимает ввод.
К упражнению «Своё: подберите вид». Ответ. ИНН, который нельзя править, — поле надписи (или поле ввода со свойством, запрещающим изменение); признак «архивный» — поле флажка; выбор способа доставки — поле переключателя; логотип — поле картинки.
К упражнению «Ловушка: „сделай поле некликабельным"». Ответ. Первый способ — сменить вид на надпись: пользователь увидит текст, и поля там больше не будет. Второй — оставить поле полем, но запретить изменение свойством поведения: поле видно как поле, но в него не пускают. Выбор зависит от того, что важнее — убрать вид поля или сохранить привычную рамку.
К упражнению «Обратный ход». Ответ. Скорее всего, поле с видом «надпись»: текст меняется вместе с данными, значит, у элемента есть путь к данным. Проверяется взглядом в палитру свойств — путь и вид стоят рядом.
К упражнению «На чтение». Ответ. Пользователь увидит не флажок, а поле, в котором пишется «Да» или «Нет». Так делают редко — например, когда значение нужно показать словами в одном ряду с другими полями.
§ 4.5. Свойства элемента: видимость, доступность, заголовок, подсказка
К вопросу 1. Ответ. Видимость — показывать ли элемент; доступность — можно ли с ним работать; заголовок — подпись рядом; подсказка — текст при наведении курсора.
К вопросу 2. Ответ. Спрятанный остаётся в структуре элементов со своим путём и видом — его просто не показывают. Удалённого там нет, и собирать его придётся заново.
К вопросу 3. Указание. Что именно сделал разработчик, когда поле исчезло?
Полное решение. Никто не писал «спрятать поле». Снято свойство — задано правило, а прячет платформа сама, каждый раз при открытии формы. Это та же механика, что и во всей книге: «само сработало» означает, что где-то задано правило. Отсюда и порядок разбора: сначала ищут свойство, а не код.
К вопросу 4. Ответ. Сменить вид на надпись — пользователь увидит текст, и поля не будет; поставить «только просмотр» — поле выглядит полем, но ввода не принимает; снять доступность — поле приглушено, до него не добраться.
К вопросу 5. Ответ. Что подпись соберёт платформа — из представления реквизита. Убрать подпись совсем можно свойством, которое задаёт положение заголовка.
К вопросу 6. Ответ. Снята видимость у самого элемента; скрыта группа, в которой он лежит; пользователь убрал поле себе; не хватает прав; видимость меняет код формы. Проверяют в этом порядке — от палитры свойств к модулю.
К вопросу 7. Ответ. Пользователь может скрыть поля, вывести те, которых не было, переставить их и сгруппировать — если у него есть право сохранять свои настройки. Отсюда следствие: свойством прячут от взгляда, а не от доступа.
К упражнению «По образцу». Ответ. Поле исчезает из карточки, но остаётся в структуре элементов; значение контактного лица в базе не меняется и видно в списке.
К упражнению «Своё: подберите свойство». Ответ. Телефон — «только просмотр» (или вид «надпись»); «Комментарий» — снять видимость; ИНН — заполнить подсказку; подпись к наименованию — записать свой заголовок.
К упражнению «Ловушка: „поле исчезло"». Указание. У всех ли пропал артикул?
Полное решение. Первый вопрос — видят ли артикул другие пользователи. Если видят, дело не в форме, а в настройке этого человека: он мог снять флажок в настройке формы, и вернуть поле можно там же. Если не видят никто — смотрите видимость у самого поля и у группы, в которой оно лежит, потом права, и только потом модуль формы.
К упражнению «Обратный ход». Ответ. Подпись собрала платформа из представления реквизита. Если написать в свойстве свой текст, на экране появится он — автоматическая подпись больше подставляться не будет.
К упражнению «На чтение». Ответ. Сумму считают, а не вводят: поле оставили на месте, но закрыли от ввода, а рядом показали значение надписью, чтобы его было видно и при работе с другими полями. Данные у обоих элементов одни.
§ 4.6. Чужая форма: разбор полей и путей к данным
К вопросу 1. Ответ. Структура полная: в ней видно и то, что скрыто, и порядок, заданный разработчиком, а рядом — палитра свойств. Экран показывает только показанное.
К вопросу 2. Ответ. Что это за элемент, откуда он берёт значение и что с ним может сделать пользователь.
К вопросу 3. Ответ. Когда подпись на экране расходится с именем реквизита: значит, заголовок задали руками.
К вопросу 4. Ответ. Например: поле без пути к данным; два поля с одним путём; поле со снятой видимостью. Годятся и другие строки таблицы находок.
К вопросу 5. Ответ. Сравнить два списка — реквизиты формы и элементы. Реквизит, которому не досталось элемента, в таблице разбора не появится.
К вопросу 6. Ответ. Что форма об одной записи: обычная карточка справочника или документа.
К вопросу 7. Ответ. Читать экран вместо структуры; принять декорацию за поле; забыть про группу над полем; счесть пустое поле сломанным.
К упражнению «По образцу». Ответ. В таблице окажутся поля наименования, артикула и единицы с путями через «Объект.», поле-флажок с путём из одной части и таблица остатков, у которой путь тоже свой, без «Объект.».
К упражнению «Своё: объясните каждое поле». Ответ. Фразы должны быть про работу: «флажком пользователь разворачивает подробности», «надпись показывает посчитанный итог, править его нельзя». Объяснение вида «булево, потому что булево» не считается.
К упражнению «Ловушка: „в форме нет поля склада"». Указание. Что коллега мог не увидеть на экране?
Полное решение. Смотреть надо в структуру элементов. Поле может лежать в свёрнутой или скрытой группе, у него может быть снята видимость, а может его убрал себе сам пользователь в настройке формы. Все три случая на экране выглядят одинаково — поля нет, — и различаются только в редакторе. Если поля нет и в структуре, тогда вопрос другой: есть ли вообще реквизит склада у документа.
К упражнению «Обратный ход». Ответ. Одно значение показано дважды: полем ввода там, где его правят, и надписью там, где его нужно видеть, не отвлекаясь от других полей. Значение у обоих одно — адрес один.
К упражнению «На чтение». Ответ. Форма не связана с данными напрямую: скорее всего, это помощник, диалог или рабочее место. Данные у неё появятся от действий пользователя или из кода, а искать их надо в реквизитах формы — и в том, что кладут в них команды.
§ 5.1. Авторазмещение: у формы нет координат
Решает платформа, и решает каждый раз заново — в тот момент, когда открывает окно. Места на экране у элемента нет и быть не может: нигде в свойствах поля не записано, что оно стоит во второй строке слева. Записано другое — где элемент стоит в дереве и что ему разрешено. Из этого платформа и собирает экран.
1. Координат нет
Тому, кто рисовал формы в других системах, это место кажется странным, поэтому скажем прямо.
| чего нет у элемента | что есть вместо |
|---|---|
| координаты по горизонтали и вертикали | место в дереве элементов |
| точного размера в точках | пожелания о ширине и растягивании |
| привязки к краю окна | принадлежность группе |
Мышью тащить можно и в дереве, и по предпросмотру — но платформа при этом меняет не координаты, а место элемента в дереве и его группу. Координат нет и в описании формы, которое уходит на клиента: их просто негде записать.
Элемент не стоит на месте — он стоит в дереве. Место на экране платформа вычисляет при каждом открытии.
2. Почему так сделано
Причина названа ещё в разговоре об управляемых формах, теперь она разворачивается целиком. Одну и ту же форму открывают в разных условиях, и ни одно из них не известно заранее.
| что меняется | пример |
|---|---|
| клиент | тонкий на компьютере, браузер, телефон |
| размер окна | развёрнутое на весь экран и половина экрана |
| настройки | масштаб, размер шрифта |
| язык | подпись «Наименование» и её перевод разной длины |
Нарисованная по координатам форма в этих условиях ломается: подпись не помещается, поле уезжает за край. Форма, собранная по правилам, перестраивается — потому что правила не говорят «здесь», они говорят «после этого, внутри этой группы, во всю ширину».
3. Чем управляют вместо координат
Рычагов немного, и все они про правила, а не про точки.
| рычаг | что задаёт |
|---|---|
| порядок в дереве | что показать раньше, что позже |
| вложенность в группу | что окажется рядом и в какой рамке |
| растягивание | занимать ли всё свободное место |
| положение в группе | к какому краю группы прижать элемент |
| ширина и высота | пожелание в символах и строках, а не в точках |
Слово «пожелание» здесь не смягчение. Документация говорит о ширине поля ввода так: задаётся в символах, используется при расчёте макета формы, ноль — автоматическое определение. Высота считается строками. Пожелание — потому что платформа взвешивает его против других пожеланий и против свободного места: если места мало, поле будет сжато, если много и растягивание разрешено — раздаст свободное. Точного «шестьсот точек» в управляемой форме не бывает, и положение в группе — тоже правило выравнивания, а не смещение от угла.
4. «Решай сама» — обычное значение
У свойств размещения есть третье состояние — не «да» и не «нет», а «решай сама», — и у каждого свойства оно записано по-своему.
Растягивать по горизонтали
├── Истина ← растягивать
├── Ложь ← не растягивать
└── не задано ← решает платформа
Ширина
├── число в символах ← пожелание
└── ноль ← решает платформа
Документация описывает это прямо: у растягивания неопределённое значение означает автоматическое определение, у ширины ту же роль играет ноль, а положение в группе со значением «авто» берётся от родительской группы. Форма, в которой всюду оставлено «решай сама», — не недоделанная: это форма, где разработчик не спорил с платформой без причины.
Незаданное значение — не забытая настройка, а решение доверить выбор платформе.
5. Что из этого следует
Три следствия, которые меняют привычки.
| следствие | что это значит на работе |
|---|---|
| одна форма выглядит по-разному | на широком экране и на узком — разный вид |
| «подвинь поле правее» не выполнимо буквально | двигают порядок, группу или растягивание |
| проверять надо в нескольких размерах окна | то, что красиво развёрнутым, может быть тесным |
Отсюда правило разбора: увидев на экране странное размещение, ищут не ошибку рисования, а правило — порядок, группу, растягивание. И наоборот: собирая свою форму, задают правила, а проверяют глазами.
6. Ловушка для тех, кто рисовал раньше
Самая частая ошибка новичка с опытом — искать в управляемой форме то, чего в ней нет.
| привычка | что делать вместо |
|---|---|
| тащить элемент в нужную точку | тащить его в дереве или на предпросмотре: меняется порядок и группа |
| задать точный размер | разрешить растягивание, задать ширину-пожелание |
| выровнять по сетке | собрать в группу и положиться на неё |
Эта потеря кажется обидной ровно до первого открытия формы на другом экране. Управляемая форма не мешает разработчику — она не даёт испортить чужой экран одним движением мыши. Испортить осознанно, задав неудачные правила, она, конечно, не помешает: об этом вся глава.
7. В Конфигураторе и в Предприятии
Опыт, который показывает авторазмещение в действии.
- Откройте карточку товара в Предприятии и растяните окно во всю ширину, потом сожмите до половины. Посмотрите, что стало с полями и подписями.
-
Вернитесь в Конфигуратор, откройте форму элемента «Товаров» и найдите у поля наименования свойства размера и растягивания. Убедитесь, что координат среди них нет.
-
Разрешите полю «Артикул» растягиваться по горизонтали. Обновите конфигурацию и посмотрите карточку в широком окне.
-
Верните свойство как было: база серии должна остаться прежней.
-
Скажите вслух, чем задано положение каждого поля на этой форме. Если в ответе нет слов «порядок», «группа» и «растягивание», посмотрите ещё раз.
Главное в одном абзаце
В управляемой форме у элемента нет координат: место на экране платформа вычисляет при каждом открытии, а разработчик задаёт не точку, а правила — порядок в дереве, вложенность в группу, растягивание, положение в группе и ширину-пожелание. Сделано это потому, что условия открытия неизвестны заранее: клиент, размер окна, масштаб, длина подписей на другом языке. Нарисованная по координатам форма в таких условиях ломается, собранная по правилам — перестраивается. У свойств размещения есть третье состояние — «решай сама»: незаданное растягивание, нулевая ширина; это не забытая настройка, а решение доверить выбор платформе. Отсюда привычки: «подвинь поле правее» выполняется не мышью, а порядком, группой или растягиванием; проверять форму надо в нескольких размерах окна; а разбирая чужую, ищут не ошибку рисования, а правило.
Правила названы, и первое из них — вложенность. Элементы не просто идут друг за другом: они собраны в рамки, и внутри каждой рамки свой порядок. Что такое эта рамка и что она решает?
Контрольные вопросы
- Где в управляемой форме записано место элемента на экране?
- Почему у элементов нет координат — назовите две причины из условий открытия.
- Чем управляют вместо координат? Назовите три рычага.
- Что означает незаданное значение у свойств размещения и как оно записано у растягивания и у ширины?
- Почему ширина элемента — пожелание, а не точный размер?
- Что отвечать на просьбу «подвинь это поле правее»?
- Почему форму стоит проверять в разных размерах окна?
Упражнения
По образцу. Откройте список контрагентов в узком и широком окне и опишите, что изменилось в размещении колонок.
Своё: переведите просьбу. Переведите на язык правил: «пусть телефон стоит справа от наименования», «пусть наименование занимает всю ширину», «пусть ИНН будет поуже».
Ловушка: «форма разъехалась». Коллега жалуется: на его ноутбуке карточка выглядит иначе, чем на вашем мониторе, и требует «прибить поля на место». Что вы объясните и что предложите проверить?
Обратный ход. В форме поле стоит во всю ширину окна, а соседнее — узкое. Какими свойствами это могло быть задано?
На чтение. Разработчик задал всем полям формы точную ширину и запретил растягивание. Что случится с этой формой на узком экране и на широком?
Ответы — в конце части.
§ 5.2. Группы: рамка, внутри которой свой порядок
Каждое поле нашей карточки товара стоит под предыдущим — наименование, артикул, единица, — и это не привычка платформы, а правило: так их кладёт сама форма, по тому же правилу, что и вертикальная группа. Любую пару полей можно поставить рядом, собрав в свою группу. Группа решает сразу две вещи: что стоит вместе и как оно внутри выстраивается — столбиком или в строку. Первое — про смысл, второе — про экран, и оба решения записаны в одном элементе.
1. Группа — элемент без данных
Группа стоит в структуре наравне с полями, но данных у неё нет: показывать ей нечего, а потому и пути к данным не положено — об этом шла речь в разговоре об элементах. Её работа — держать в себе другие элементы. Слово «рамка» тут условное: рисовать рамку группа не обязана, и почему — разберём дальше.
Форма
├── Наименование ← поле
└── Учёт ← группа
├── Артикул ← поле
└── ЕдиницаИзмерения ← поле
Всё, что вложено в группу, платформа размещает внутри её места на экране. Всё, что не вложено, — снаружи, по правилам той группы, в которой лежит; для верхних элементов такой группой оказывается сама форма.
Группа не показывает значений — только рамку, заголовок, порядок. Она отвечает на вопрос, кто с кем стоит рядом.
2. Главное свойство: как выстраивать вложенное
У обычной группы и у страницы есть свойство «Группировка» — им и решается, лягут поля столбиком или встанут в строку.
| значение | что получится |
|---|---|
| вертикальная | элементы друг под другом |
| горизонтальная | элементы в строку |
| горизонтальная всегда | в строку, даже если тесно |
| горизонтальная, если возможно | в строку, пока хватает ширины |
Последнее значение — правило, которое само смотрит на ширину окна: на широком экране поля встанут рядом, на узком опустятся друг под друга, и делать для этого ничего не нужно. «Возможно» здесь считается по ширине, которая нужна вложенным элементам: если она не влезает, платформа переносит их вниз.
3. Группа в группе — так собирают строки
Одной группы редко хватает: чаще всего форма — это вертикальная стопка, в которой некоторые ряды разложены в строку. Бывает и иначе — наверху может стоять группа страниц, — но стопка встречается чаще прочего.
Форма ← вертикальная
├── Наименование
├── Учёт ← горизонтальная
│ ├── Артикул
│ └── ЕдиницаИзмерения
└── ПоказыватьПодробности
Читается такое дерево сверху вниз, с поправкой на направление каждой группы. По нему можно нарисовать экран, не открывая Предприятие, — этим мы займёмся отдельно, когда дойдём до скетча.
4. Рамка и заголовок — отдельные решения
Группа может выглядеть по-разному, вплоть до полной невидимости, и это настраивают двумя свойствами.
| что задают | варианты |
|---|---|
| отображение | без выделения, слабое, обычное, сильное |
| заголовок | показывать или нет |
Отсюда важное для чтения чужой формы: группа в дереве есть, а рамки на экране нет — и это не ошибка. Возможностей две: у группы отключено выделение — или у неё снято свойство «Объединённая». Про второе документация говорит прямо: тогда элементы такой группы располагаются в родительской, а из свойств самой группы действуют только цвет фона и группировка.
| что видно в дереве | что на экране |
|---|---|
| группа с сильным выделением | рамка с заголовком |
| группа без выделения | ничего, только порядок |
| группа без «Объединённой» | элементы живут в родительской |
Внешний вид группы на этом настроен. Остаётся вопрос важнее — ради чего вообще собирают элементы в группы.
5. Зачем собирать в группы
Поводов три, и все встречаются в живых формах.
| повод | пример |
|---|---|
| смысл | поля одного дела рядом: «Учёт», «Контакты» |
| размещение | поставить два поля в строку |
| поведение разом | спрятать группу — исчезнут все её элементы |
Третья строка — та самая, о которой шла речь в разговоре о свойствах: поле может быть видимым, а группа над ним — нет. Отсюда и правило разбора: проверяя видимость, смотрят не только на сам элемент, но и на все группы, в которые он вложен.
Видимость, доступность и «только просмотр» группы достаются всему, что внутри. Это удобно, когда помнишь, и загадочно, когда забыл.
6. Что группы говорят при чтении
Группы — самая говорящая часть композиции: по ним видно, как автор формы представлял себе работу пользователя.
| находка | о чём говорит |
|---|---|
| поля собраны в группу с заголовком | автор считает их одним делом |
| горизонтальная группа из двух полей | значения читают вместе |
| группа без выделения | сгруппировали ради размещения, не ради смысла |
| одинокий элемент в своей группе | остаток прежней раскладки — или способ управлять им отдельно |
Последняя строка читается двояко. Чаще это след: поля из группы вынесли, а саму группу забыли убрать. Но бывает и замысел — группу оставили, чтобы прятать одно поле вместе с её заголовком.
7. В Конфигураторе и в Предприятии
Соберём первую группу — она останется в форме и дальше.
-
Откройте форму элемента «Товаров» и добавьте в элементы группу. Назовите её «Учёт», заголовок задайте «Учёт».
-
Перетащите в неё поля «Артикул» и «ЕдиницаИзмерения». В структуре они должны оказаться вложенными.
-
Поставьте группировку «горизонтальная» и посмотрите на предпросмотр: поля встали в строку.
-
Обновите конфигурацию базы данных и откройте карточку товара. Сожмите окно: посмотрите, что стало со строкой.
-
Переключите группировку на «горизонтальная, если возможно» и повторите опыт с узким окном.
-
Оставьте группу на форме: дальше мы будем собирать композицию вокруг неё.
Пятый шаг стоит проделать внимательно. Разница между «горизонтальной» и «горизонтальной, если возможно» — это разница между правилом жёстким и правилом с оговоркой; на широком экране они выглядят одинаково.
Главное в одном абзаце
Группа — элемент, который ничего не показывает: данных у неё нет, а работа её в том, чтобы держать в себе другие элементы и задавать им свойством «Группировка» направление — вертикально или горизонтально, всегда или пока хватает ширины. Группы вкладывают друг в друга, и обычная форма оказывается вертикальной стопкой, в которой некоторые ряды разложены в строку. Рамка и заголовок — отдельные решения: выделение бывает слабым, обычным, сильным или никаким, поэтому группа в дереве может быть, а рамки на экране нет; то же самое даёт снятое свойство «Объединённая» — тогда элементы группы располагаются прямо в родительской, а из свойств самой группы действуют только цвет фона и группировка. Собирают в группы ради смысла, ради размещения и ради того, чтобы управлять всем сразу: свойства группы достаются всему, что внутри, — потому и видимость проверяют у всех групп, в которые элемент вложен. А при чтении чужой формы группы показывают, как автор представлял себе работу пользователя.
Рамка собрала поля в блок, блоки легли стопкой. Но в форме документа блоков столько, что в окно они не помещаются, и половина из них нужна не всегда. Куда девать остальное?
Контрольные вопросы
- Что такое группа и почему у неё нет пути к данным?
- Какое свойство группы решает, как выстроятся вложенные элементы, и какие у него значения?
- Чем «горизонтальная» отличается от «горизонтальной, если возможно»?
- Как из групп собирается обычная форма — опишите словами.
- Почему группа может быть в дереве, а рамки на экране нет?
- Что происходит со свойствами группы для вложенных элементов?
- О чём говорит одинокий элемент в собственной группе?
Упражнения
По образцу. Соберите в форме элемента «Контрагентов» группу «Контакты» и положите в неё телефон и контактное лицо.
Своё: разложите карточку. Нарисуйте на бумаге дерево групп для карточки контрагента: наименование, ИНН, телефон, контактное лицо. Объясните каждую группу одной фразой.
Ловушка: «рамка пропала». Разработчик собрал группу, задал ей заголовок, а на экране ни рамки, ни заголовка. Какие два объяснения возможны и где смотреть?
Обратный ход. На экране два поля стоят в строку. Что можно сказать о дереве элементов, не открывая его?
На чтение. В чужой форме группа «Дополнительно» содержит одно поле и имеет сильное выделение. Что, скорее всего, случилось с этой формой раньше?
Ответы — в конце части.
§ 5.3. Страницы: форма, которую показывают по частям
Остальное раскладывают по страницам. Страницы — тоже группы, только особые: они показывают не всё содержимое сразу, а одну часть за раз, и пользователь сам выбирает какую, переключая закладки. Так форма документа, которая не помещается в окно, остаётся одной формой — просто показанной по частям.
1. Две группы, а не одна
Страничная раскладка собирается из групп с разным значением свойства «Вид» — «Страницы» и «Страница», — и путать их не стоит.
Форма
├── Номер, Дата
└── Страницы ← группа «Страницы»
├── Шапка ← группа «Страница»
│ ├── Контрагент
│ └── Склад
└── Товары ← группа «Страница»
└── таблица товаров
| вид группы | что делает |
|---|---|
| Страницы | держит набор страниц и показывает закладки |
| Страница | держит элементы одной закладки |
Страница внутри устроена как обычная группа: у неё своя группировка и свой «Заголовок» — он и становится надписью на закладке. Всё, что мы знаем о группах, работает и здесь.
«Страницы» — это переключатель, «Страница» — это содержимое. Одна группа держит набор, другая — то, что в нём лежит.
2. Закладки можно показывать по-разному
У группы «Страницы» есть свойство «Отображение страниц», которое решает, где будут закладки, — и будут ли вообще.
| значение | что увидит пользователь |
|---|---|
| сверху, снизу | ряд закладок над или под содержимым |
| слева, справа | столбец закладок сбоку |
| нет | закладок не видно |
| авто | решает платформа |
Есть и седьмое значение — пролистывание: закладок на виду нет, а страницы переключают жестом. Оно не про место закладок, а про способ переключения.
Значение «нет» только кажется странным. Страницы без закладок нужны, когда пользователя ведут по шагам и переключают страницы командами «Далее» и «Назад». Так устроены помощники; к ним вернёмся, когда дойдём до особых форм.
3. Какая страница открывается первой
При открытии формы видна одна страница, и это тоже решено правилом, а не случаем: у группы «Страницы» есть свойство «Текущая страница».
Отсюда вопрос при чтении чужой формы: почему открывается не первая закладка? Ответ ищут в этом свойстве. Если там пусто, а открывается всё равно не первая, страницу переключает код при открытии формы — это уже за границей книги, но знать, что так бывает, полезно.
4. Что класть на какую страницу
Страницы экономят место, но прячут содержимое. Поэтому раскладывают не по удобству разработчика, а по работе.
| куда | что |
|---|---|
| на первую | то, что нужно каждый раз: основное дело формы |
| на следующие | то, что нужно не всегда: подробности, дополнительно |
| вне страниц | то, что нужно видеть на любой закладке |
Последняя строка важна: номер и дата документа нужны при любой открытой закладке, поэтому их кладут в форму над группой страниц, а не внутрь.
Обратная сторона тоже есть. Что лежит на второй закладке, пользователь видит, только открыв её. Поле, которое обязательно заполнить, на второй закладке легко пропустить — и узнать о нём лишь по ошибке при записи.
Страница откладывает показ, а не данные. Откладывать можно то, что нужно не всегда, — но не то, без чего нельзя записать.
5. Что страницы говорят при чтении
Страницы — самое крупное решение композиции, и по ним первым делом видно, как автор делил работу.
| находка | о чём говорит |
|---|---|
| две-три страницы по делу | форма о сложной записи, работу разложили на части |
| десяток страниц | форма разрослась; часть закладок пользователю не нужна |
| страница с одним полем | остаток прежней раскладки или место для будущего |
| закладок нет, а страницы есть | пошаговый помощник |
Читают страницы в том же порядке, что и всё дерево: сперва набор, потом каждая страница как обычная группа.
6. Страница — не отдельная форма
Иногда новичок, увидев закладки, решает, что каждая — своя форма. Нет: форма одна, данные у неё общие, и переключение закладок ничего не открывает и не закрывает.
| страница | отдельная форма | |
|---|---|---|
| данные | общие с остальными страницами | свои |
| открытие | переключение закладки | новое окно |
| запись | записывается вся форма разом | своя запись |
Это важно при чтении путей к данным: реквизиты у формы одни на все закладки, и пути полей на разных страницах ведут в одни и те же данные.
7. В Конфигураторе и в Предприятии
Соберём первую свою форму документа — поступления — и разложим её по двум закладкам.
-
Откройте в дереве документ «ПоступлениеТоваров» и конструктором создайте ему форму документа. Назначьте её основной.
-
Добавьте в элементы группу «Страницы», а в неё две страницы: «Шапка» и «Товары».
-
Перетащите на страницу «Шапка» поля контрагента и склада, на страницу «Товары» — таблицу товаров. Номер и дату оставьте над страницами.
-
Обновите конфигурацию базы данных и откройте поступление № 12 в Предприятии. Переключите закладки: номер и дата остаются на месте.
-
Поменяйте положение закладок на «слева» и посмотрите ещё раз. Верните «сверху».
-
Оставьте форму: она понадобится в главе о списках, когда будем разбирать таблицу товаров.
Главное в одном абзаце
Страницы — способ показать форму по частям: на экране одна закладка, остальные ждут, пока пользователь их откроет. Собирается такая раскладка из групп с двумя значениями свойства «Вид»: «Страницы» держат набор и показывают закладки, «Страница» держит содержимое одной закладки и внутри устроена как обычная группа. Где будут закладки — сверху, снизу, сбоку, в виде пролистывания или нигде — решает свойство «Отображение страниц»; страницы без закладок нужны помощникам, которые ведут пользователя по шагам. Какая страница откроется первой, записано в свойстве «Текущая страница». Раскладывают по работе: на первую — то, что нужно каждый раз, на следующие — то, что нужно не всегда, а то, что нужно на любой закладке, — над страницами. Прятать на второй закладке то, без чего нельзя записать, не стоит. И страница — не отдельная форма: данные у всех закладок общие, записывается форма разом.
Поля разложены по группам и закладкам. Но в форме бывает и то, что не поле и не группа: пояснение под полем, картинка, линия, отделяющая одно от другого. Зачем они, если ничего не показывают из данных?
Контрольные вопросы
- Из групп каких двух видов собирается страничная раскладка и чем они различаются?
- Как устроена страница изнутри?
- Какие бывают варианты показа закладок и зачем нужно значение «нет»?
- Где записано, какая страница откроется первой?
- Что кладут на первую страницу, что — на следующие, а что — вне страниц?
- Почему обязательное поле не стоит прятать на вторую закладку?
- Чем страница отличается от отдельной формы?
Упражнения
По образцу. Разложите по двум закладкам форму элемента «Контрагентов»: «Основное» — наименование и ИНН, «Контакты» — телефон и контактное лицо.
Своё: разложите реализацию. Документ «РеализацияТоваров» устроен так же, как поступление. Нарисуйте дерево его формы на закладках и объясните, что вы оставили над страницами и почему.
Ловушка: «каждая закладка — своя форма». Коллега уверен, что изменения на закладке «Товары» записываются отдельно от шапки. Что вы ему объясните?
Обратный ход. Форма открывается сразу на второй закладке. Где искать причину и в каком порядке?
На чтение. В чужой форме группа «Страницы» с четырьмя страницами, а закладок на экране нет, и внизу кнопки «Далее» и «Назад». Что это за форма?
Ответы — в конце части.
§ 5.4. Декорации: то, что в форме ради пользователя, а не ради данных
Затем, чтобы форма была понятна. Декорация ничего не показывает из данных и ничего не принимает — она поясняет, отмечает, оформляет. Видов у неё два: надпись и картинка. А линии, которая напрашивается после разговора о группах, среди них нет — и почему, разберём в этом же параграфе.
1. Два вида, и оба без данных
Декорация — один из пяти видов элементов, тот самый, у которого пути к данным не бывает. Документация называет её элементом, предназначенным для оформления, в отличие от поля.
| вид декорации | что показывает | откуда берётся |
|---|---|---|
| надпись | текст | записан в самой форме |
| картинка | изображение | из картинок конфигурации |
Двух видов хватает для оформления, не связанного с данными: что нужно сказать словами — надпись, что показать значком — картинка.
Декорация говорит с пользователем от имени автора формы, а не от имени записи: пути к данным у неё нет, и сказать что-то о записи ей нечем.
2. Надпись
Текст надписи записан в свойстве «Заголовок» самой декорации. Свойство называется так же, как подпись у поля, но работает иначе: у поля заголовок подписывает поле, а у надписи он и есть весь показываемый текст, ни к чему не привязанный. Меняется он только тогда, когда его поменяли в форме.
| свойство | что задаёт |
|---|---|
| Заголовок | сам текст |
| Рамка | обвести ли надпись |
| Гиперссылка | показывать ли текст как ссылку |
С полем надписи её путают постоянно, и различение то же, что в разговоре о видах полей: поле надписи показывает значение из данных и меняется вместе с ним, декорация показывает текст, набранный разработчиком, и не меняется сама. Различает их вид элемента в структуре.
3. Картинка
Картинка-декорация показывает изображение, выбранное из картинок конфигурации: значок, логотип, пиктограмму предупреждения.
| картинка-декорация | поле картинки | |
|---|---|---|
| что это | декорация | поле с видом «поле картинки» |
| путь к данным | не бывает | есть |
| откуда изображение | задано в форме | приходит по пути |
Различает их, как и надпись с полем надписи, вид элемента и путь к данным. Подсказкой служит и сама картинка: у каждого товара своя — почти наверняка поле; одна и та же у всех — скорее декорация, но проверить всё равно стоит по пути.
4. Разделителя нет — есть группа
Линии, отделяющей одно от другого, среди видов декорации нет. В управляемой форме разделяют не линией, а правилом — группой.
| как выглядит на экране | чем сделано |
|---|---|
| линия и заголовок над блоком полей | группа с выделением и заголовком |
| рамка вокруг нескольких полей | группа с сильным выделением |
| пустой промежуток | интервалы между элементами в группе |
Это ещё одно проявление принципа, с которого начиналась глава: не рисуем, а задаём правило. Разделение — не картинка на экране, а смысловое решение «это одно дело, а это другое», и записано оно в структуре.
Увидели в чужой форме линию — ищите не декорацию, а группу.
5. Надпись-ссылка
Надпись можно показать как гиперссылку, и тогда пользователь станет на неё нажимать. Что при этом произойдёт, декорация сама не знает: это задано в обработчике нажатия.
| что видно | что записано в форме |
|---|---|
| подчёркнутый текст, как ссылка | свойство «Гиперссылка» у надписи |
| что-то открывается по нажатию | обработчик события нажатия — в модуле |
Для чтения формы этого достаточно: ссылка есть — значит, есть и код, который её обслуживает. Сам код — за границей книги.
6. Когда декорация к месту
Декорации легко добавлять, поэтому их легко и переборщить.
| к месту | не к месту |
|---|---|
| короткое пояснение к блоку полей | инструкция на абзац |
| значок предупреждения рядом с важным полем | украшение ради украшения |
| текст, который не зависит от записи | текст, который должен меняться вместе с данными |
Последняя строка — самая частая ошибка: пояснение, которое должно зависеть от записи, сделали декорацией, и оно одинаково у всех записей, хотя должно было меняться. Если текст меняется вместе с данными, это поле надписи, а не декорация. А пояснение к одному полю чаще лучше положить в подсказку этого поля, о которой шла речь в разговоре о свойствах.
7. В Конфигураторе и в Предприятии
Добавим одно пояснение к группе «Учёт» — оно останется в форме.
-
Откройте форму элемента «Товаров» и добавьте декорацию вида «надпись» внутрь группы «Учёт», после полей.
-
Задайте ей заголовок «Артикул и единицу заполняет отдел закупок».
-
Посмотрите на предпросмотр и найдите надпись в структуре: вид элемента — декорация, пути к данным нет.
-
Обновите конфигурацию базы данных и откройте карточку товара. Откройте другой товар: надпись та же — она про форму, а не про запись.
-
Поставьте у группы «Учёт» сильное выделение и посмотрите, как появилась рамка. Верните выделение, как было.
Пятый шаг — ответ на вопрос о линии: то, что пользователь видит как разделитель, разработчик задаёт свойством группы.
Главное в одном абзаце
Декорация — элемент для оформления: данных у неё нет, пути к данным не бывает, и говорит она с пользователем от имени автора формы, а не от имени записи. Видов два: надпись, текст которой записан в её заголовке, и картинка, выбранная из картинок конфигурации. С полем надписи и полем картинки их различает вид элемента в структуре: поле показывает данные и меняется вместе с ними, декорация одинакова у всех записей. Разделителя среди декораций нет — разделяют группой с выделением и заголовком, и линию в чужой форме ищут в свойствах группы. Надпись может быть ссылкой; что случится по нажатию, задано обработчиком, то есть кодом. Декорация к месту, когда поясняет то, что не зависит от записи; текст, который должен меняться с данными, — дело поля, а пояснение к одному полю чаще уместнее в его подсказке.
Все детали композиции названы: группы, страницы, декорации. Но дерево элементов и экран до сих пор живут у нас порознь — в одном месте строки, в другом прямоугольники. Можно ли по одному сразу увидеть другое?
Контрольные вопросы
- Какие два вида декораций бывают и чем они отличаются от полей?
- Где записан текст надписи-декорации?
- Как отличить картинку-декорацию от поля картинки?
- Почему среди декораций нет разделителя и чем разделяют блоки полей?
- Что означает надпись, показанная как гиперссылка?
- Когда декорация не к месту? Назовите два случая.
- Что лучше для пояснения к одному полю — надпись или подсказка?
Упражнения
По образцу. Добавьте в форму элемента «Контрагентов» надпись «ИНН — 10 или 12 цифр» рядом с полем ИНН и проверьте в Предприятии.
Своё: декорация или поле. Для каждого решите, чем это сделать: «Документ проведён» — меняется от документа к документу; «Все цены без НДС» — одинаково для всех; логотип фирмы в шапке; фотография товара.
Ловушка: «добавь линию между блоками». Заказчик просит «провести черту» между шапкой документа и его товарами. Разработчик ищет в палитре декорацию «разделитель» и не находит. Что вы ему подскажете?
Обратный ход. В чужой форме над полями контрагента стоит заголовок «Покупатель» с линией. Какой элемент вы ожидаете найти в структуре?
На чтение. В форме надпись «Нажмите, чтобы заполнить по умолчанию» подчёркнута и выглядит как ссылка. Что можно сказать о форме, не открывая модуль?
Ответы — в конце части.
§ 5.5. От дерева к скетчу и обратно
Можно — и это главный навык главы. Дерево элементов и экран — два взгляда на одну форму: дерево говорит, что в чём лежит и в каком порядке, экран показывает, как это легло. Кто умеет переводить одно в другое, тот читает форму, не открывая Предприятие, и собирает её, не гадая в редакторе.
1. Два описания одной формы
У нас уже есть оба способа записи, и оба встречались в книге не раз.
| дерево элементов | скетч экрана | |
|---|---|---|
| что показывает | вложенность и порядок | прямоугольники и их соседство |
| где живёт | в редакторе формы | на бумаге |
| что в нём видно | всё, включая скрытое | только то, что увидит пользователь |
| кто его читает | разработчик | тот, кто работает с формой |
Скетч — не рисунок ради красоты. Это набросок прямоугольниками: поле — строка с подписью, группа — рамка, закладки — ряд надписей сверху. Линейки и точные размеры не нужны: размеры в управляемой форме задают не точками, а свойствами — шириной-пожеланием и растягиванием, — и раскладывает их под окно платформа.
2. Правила перевода
Перевод держится на нескольких правилах, и все они уже встречались по отдельности.
| в дереве | на скетче |
|---|---|
| вертикальная группа | прямоугольники друг под другом |
| горизонтальная группа | прямоугольники в строку |
| группа с выделением | рамка |
| заголовок группы | надпись у рамки |
| группа «Страницы» | ряд закладок: каждая — вложенная «Страница», открыта одна |
| декорация-надпись | строка текста без поля |
Ещё одно правило — отрицательное: элемент со снятой видимостью на скетч не попадает. Его место в дереве, а не на экране.
Дерево читают сверху вниз, и каждая группа говорит, как разложить то, что в ней лежит. Больше для скетча ничего не нужно.
3. Из дерева в скетч
Возьмём форму товара в том виде, в каком она стала к этому параграфу.
Форма ← вертикальная
├── Наименование
├── Учёт ← горизонтальная,
│ ├── Артикул с заголовком
│ ├── ЕдиницаИзмерения
│ └── надпись-пояснение
├── ПоказыватьПодробности
└── ОстаткиПоСкладам ← таблица
Переводим построчно: форма вертикальная — значит, всё идёт столбиком; группа «Учёт» горизонтальная и с заголовком — значит, рамка, а в ней поля в строку.
┌─ Товар ─────────────────────────────┐
│ Наименование: [ ] │
│ ┌ Учёт ───────────────────────────┐ │
│ │ Артикул: [ ] Ед.: [ ] … │ │
│ └─────────────────────────────────┘ │
│ [✓] Показывать подробности │
│ ┌ Склад ───────┬ Количество ──────┐ │
│ │ │ │ │
│ └──────────────┴──────────────────┘ │
└─────────────────────────────────────┘
Надпись-пояснение в скетче обозначена многоточием в строке: горизонтальная группа пытается положить её туда же, а влезет ли — зависит от ширины. Если на экране она окажется ниже — значит, не хватило ширины, и это повод подумать о группировке «если возможно».
4. Из скетча в дерево
Обратный ход полезнее прямого: так собирают форму. Начинают со скетча на бумаге, а дерево выводят из него.
┌─ Контрагент ────────────────────────┐
│ Наименование: [ ] │
│ ИНН: [ ] │
│ ┌ Контакты ───────────────────────┐ │
│ │ Телефон: [ ] Лицо: [ ] │ │
│ └─────────────────────────────────┘ │
└─────────────────────────────────────┘
Читаем скетч, как дерево: сверху вниз, находя рамки и строки.
| на скетче | в дереве |
|---|---|
| всё идёт столбиком | форма вертикальная |
| рамка «Контакты» | группа с заголовком и выделением |
| два поля в строку внутри рамки | группа «Контакты» горизонтальная |
| наименование во всю ширину | у поля включено растягивание по горизонтали |
5. Где скетч расходится с экраном
Скетч, нарисованный до сборки, — замысел, экран — результат. Расходиться они будут, и каждое расхождение что-то говорит; то же верно и для скетча, нарисованного по дереву чужой формы.
| расхождение | о чём говорит |
|---|---|
| поля в строке опустились друг под друга | не хватило ширины |
| рамки на экране нет | у группы нет выделения |
| поле не на месте | порядок в дереве не тот |
| поля нет совсем | снята видимость или его нет в дереве |
Поэтому скетч проверяют на экране, а экран — по дереву. Каждое молчит о своём: скетч не знает про ширину окна, экран не показывает скрытого.
6. Зачем это нужно при чтении
Для чужой формы скетч по дереву — самый быстрый способ понять замысел, не открывая Предприятие и не заводя тестовую запись.
| задача | как помогает перевод |
|---|---|
| понять, что увидит пользователь | скетч по дереву — без запуска |
| найти, где на экране нужное поле | путь от дерева к прямоугольнику |
| объяснить форму другому | скетч на бумаге понятнее дерева |
| предложить улучшение | правят скетч, потом дерево |
Последняя строка — рабочая привычка: обсуждать форму с пользователем удобнее скетчем, а не деревом. Дерево — то, на чём говорит редактор; скетч — то, что можно показать любому.
7. В Конфигураторе и в Предприятии
Опыт в обе стороны.
- Откройте форму элемента «Товаров» и, не заглядывая в Предприятие, нарисуйте на бумаге скетч по дереву элементов.
-
Откройте карточку товара и сверьте. Каждое расхождение объясните по таблице расхождений.
-
Нарисуйте скетч формы элемента «Контрагентов» так, как хотели бы её видеть, и выведите из него дерево: группы, их направление, заголовки.
-
Соберите это дерево в редакторе и сверьте результат со своим скетчем.
Главное в одном абзаце
Дерево элементов и экран описывают одну форму разными средствами: дерево — вложенность и порядок, экран — прямоугольники и соседство, и скетч на бумаге переносит второе туда, где его удобно читать и обсуждать. Перевод держится на нескольких правилах — вертикальная группа кладёт друг под другом, горизонтальная — в строку, выделение рисует рамку, заголовок — надпись у неё, группа «Страницы» — закладки, надпись-декорация — строку текста — и на одном отрицательном: скрытое на скетч не попадает. Из дерева в скетч переводят, чтобы увидеть чужую форму без запуска; из скетча в дерево — чтобы собрать свою. Расхождения скетча с экраном говорят о ширине, выделении, порядке и видимости, поэтому скетч проверяют экраном, а экран — деревом. Дерево — то, на чём говорит редактор; скетч — то, что можно показать тому, кто с формой работает.
Инструмент готов: дерево читается как экран, экран — как дерево. Осталось применить его к форме, которую собирали не мы. Хватит ли одного скетча, чтобы понять, как её автор думал о работе?
Контрольные вопросы
- Чем дерево элементов отличается от скетча экрана по тому, что в них видно?
- Назовите правила перевода из дерева в скетч.
- Какой элемент на скетч не попадает и почему?
- Как по скетчу понять, какая группировка у группы?
- Почему скетч и экран расходятся? Назовите два случая.
- Зачем обсуждать форму с пользователем скетчем, а не деревом?
- Какой ход полезнее при сборке формы — из дерева в скетч или обратно?
Упражнения
По образцу. Нарисуйте скетч формы поступления, которую вы собрали на закладках: номер и дата, закладки «Шапка» и «Товары».
Своё: выведите дерево. Представьте, что у склада появились реквизиты «Адрес» и «Ответственный». Нарисуйте скетч его карточки — наименование, адрес, ответственный в рамке «Кто отвечает» — и выведите из него дерево.
Ловушка: «на скетче было не так». Разработчик собрал форму по скетчу, а на ноутбуке пользователя два поля из одной строки оказались одно под другим. Он считает, что ошибся в дереве. Прав ли он?
Обратный ход. На экране — рамка «Оплата» с тремя полями в строку, а под ней комментарий во всю ширину. Запишите дерево, которое могло это дать.
На чтение. В дереве чужой формы есть группа «Служебное» со снятой видимостью и пятью полями внутри. Что будет на вашем скетче и что это говорит о форме?
Ответы — в конце части.
§ 5.6. Чужая форма: композиция и замысел
Нарисуйте скетч чужой формы и покажите коллеге: он увидит, где какое поле, — но не узнает, почему склад стоит отдельно от покупателя, а автор документа спрятан на третьей закладке. Скетч отвечает на вопрос «что увидит пользователь», а замысел прячется в другом — почему поля сложены так, а не иначе. Для него нужен ещё один проход по тому же дереву, с другими вопросами.
1. Два прохода
Разбор композиции чужой формы идёт в два прохода по одному дереву.
| проход | вопрос | результат |
|---|---|---|
| первый | что увидит пользователь | скетч экрана |
| второй | почему сложено так | фразы о замысле |
Первый проход мы уже умеем: правила перевода из прошлого параграфа. Второй — новый, и держится он на том, что решения композиции обычно о чём-то говорят. Группа — «это одно дело», страница — «это можно открыть потом», выделение — «это важно», скрытое — «это не для всех». Обычно — не всегда: группу бывает заводят и ради одного размещения, и тогда говорит она только о раскладке.
Скетч показывает форму. Замысел объясняет её — и его читают по тем же группам, только спрашивают о другом.
2. Порядок: от крупного к мелкому
Читать композицию удобнее от самых крупных решений к самым мелким.
| шаг | что смотрим | о чём это |
|---|---|---|
| 1 | страницы | как автор поделил работу |
| 2 | группы на каждой странице | что считает одним делом |
| 3 | направление и выделение групп | что читают вместе, что главное |
| 4 | декорации | что пришлось пояснять |
| 5 | скрытое | что показывают не всем или не всегда |
Порядок не случаен: страница важнее группы, группа важнее отдельного поля. Кто начинает с полей, тонет в них и не видит, как они сложены.
3. Разбор на примере
Вот дерево чужой формы документа — реализации из другой конфигурации.
Форма ← вертикальная
├── Шапка ← горизонтальная,
│ ├── Номер без выделения
│ └── Дата
├── Страницы
│ ├── Основное
│ │ ├── Покупатель ← с заголовком
│ │ │ ├── Контрагент
│ │ │ └── КонтактноеЛицо
│ │ └── Склад
│ ├── Товары
│ │ └── таблица товаров
│ └── Дополнительно
│ └── Служебное ← видимость
│ ├── Автор снята
│ └── Комментарий
└── Пояснение ← декорация
Первый проход — скетч.
┌─ Реализация ──────────────────────┐
│ Номер: [ ] Дата: [ ] │
│ [Основное][Товары][Дополнительно] │
│ ┌ Покупатель ───────────────────┐ │
│ │ Контрагент: [ ] │ │
│ │ Контактное лицо: [ ] │ │
│ └───────────────────────────────┘ │
│ Склад: [ ] │
│ Цены указаны без скидок │
└───────────────────────────────────┘
Второй проход — замысел, по шагам из таблицы выше.
| что видим | что это говорит |
|---|---|
| три страницы | работу поделили на основное, товары и остальное |
| номер и дата над страницами | их нужно видеть на любой закладке |
| группа «Покупатель» с заголовком | кому продаём — одно дело |
| склад вне группы | склад автор с покупателем не связывал |
| декорация под формой | цены вызывали вопросы, пришлось пояснить |
| группа «Служебное» скрыта | автор и комментарий есть, но не для всех |
4. Три вопроса к каждой группе
Когда форма большая, таблицу замысла заполняют по группам — и к каждой задают три вопроса.
| вопрос | где ответ |
|---|---|
| что в ней | вложенные элементы: какое дело они вместе делают |
| как разложено | группировка и выделение |
| видна ли | видимость самой группы и групп над ней |
Самый полезный из трёх — первый. Если на него не выходит ответить одной фразой о работе пользователя, группа, скорее всего, собрана ради размещения, а не ради смысла. Это тоже находка — и повод проверить, не зря ли у такой группы рамка и заголовок.
5. Что считать находкой
Как и в разборе полей, ценность разбора — в находках, а не в таблице.
| находка | о чём говорит |
|---|---|
| группа, которую не описать одной фразой | собрана ради места, а не ради смысла |
| поле, которое по смыслу просится в соседнюю группу | раскладка устарела |
| обязательное поле на дальней закладке | пользователи будут ошибаться при записи |
| скрытая группа с важными полями | кому-то их показывают — или прячут всегда; ищите, кто меняет видимость |
| много декораций-пояснений | форма непонятна без подсказок |
Последние две строки — повод спросить у тех, кто с формой работает. Прочитать в дереве можно, что поле скрыто; почему — знает только автор или пользователь.
6. Четыре ловушки
Первая: читать только экран. Скрытая группа на скетч не попадёт — а в ней может быть главное.
Вторая: не заметить группу без выделения. На экране её нет, а в дереве она есть и управляет соседством.
Третья: считать закладки отдельными формами. Данные у закладок общие: закладка меняет только то, что видно, а не то, что записывается.
Четвёртая: искать разделитель-декорацию. Вспомните разговор о декорациях: разделителя среди них нет, линию над блоком полей рисует группа с выделением, и искать её надо в свойствах группы.
7. Разбор по шагам
Шесть шагов — тот же приём, что при разборе полей: сначала полный список по дереву, потом вопросы к каждой строке, в конце сверка с экраном.
-
По дереву нарисуйте скетч: всё, что увидит пользователь на первой закладке.
-
Пройдите страницы: как названы, что на каждой, что вынесено над ними.
-
Для каждой группы ответьте на три вопроса: что в ней, как разложено, видна ли.
-
Найдите декорации и скажите, что они поясняют.
-
Выпишите скрытое и предположите, кому его показывают.
-
Запишите замысел формы в нескольких фразах о работе пользователя и сверьте с формой в Предприятии.
Шестой шаг — итог всего разбора. Замысел в нескольких фразах — то, что остаётся от формы, когда поля забыты; если фраз выходит много, стоит спросить, не смешались ли в них несколько замыслов. А пойманный замысел и есть ответ на вопрос, как автор представлял себе работу человека, который будет её открывать.
Главное в одном абзаце
Композицию чужой формы разбирают в два прохода по одному дереву: первый даёт скетч — что увидит пользователь, второй — замысел, почему сложено именно так. Читают от крупного к мелкому: страницы — как поделена работа, группы — что считается одним делом, направление и выделение — что читают вместе и что главное, декорации — что пришлось пояснять, скрытое — что показывают не всем. К каждой группе задают три вопроса: что в ней, как разложено, видна ли; если первый не укладывается в одну фразу о работе, группа собрана ради места. Находки — группы без смысла, устаревшая раскладка, обязательное поле на дальней закладке, скрытые важные поля, россыпь пояснений; о причинах последних спрашивают людей. Ловушки — читать только экран, не заметить группу без выделения, считать закладки отдельными формами и искать разделитель среди декораций. Итог разбора — замысел формы в нескольких фразах о работе пользователя.
Экран разобран: что где лежит и почему. Но одна часть формы до сих пор стояла в стороне — таблицы. Строки товаров в поступлении, остатки по складам, список записей в форме списка. Чем таблица отличается от поля и откуда берёт свои строки?
Контрольные вопросы
- Какие два прохода делают при разборе композиции чужой формы и что даёт каждый?
- В каком порядке читают решения композиции и почему именно так?
- Какие три вопроса задают к каждой группе?
- О чём говорит группа, которую не удаётся описать одной фразой о работе?
- Почему скрытую группу нельзя пропускать?
- Какие находки стоит обсудить с теми, кто работает с формой?
- Назовите четыре ловушки разбора композиции.
Упражнения
По образцу. Разберите в два прохода форму поступления, которую вы собрали на закладках: скетч и замысел в три фразы.
Своё: замысел в фразах. Запишите замысел формы элемента «Товаров» — той, что получилась к концу главы, — в три фразы о работе кладовщика.
Ловушка: «группы нет — значит, поля сами по себе». Коллега не видит на экране рамки вокруг номера и даты и решает, что они не связаны. Что он пропустил?
Обратный ход. Замысел формы описан так: «главное — кому продаём и что; остальное — по требованию; служебное — только бухгалтеру». Нарисуйте дерево, которое этому соответствует.
На чтение. В чужой форме на первой закладке двадцать полей без групп, а на второй — одно поле в группе с сильным выделением. Что вы скажете о её композиции?
Ответы — в конце части.
Ответы к части 5
Ответы собраны здесь, а не под вопросами: подсказка, увиденная сразу после вопроса, отменяет попытку вспомнить. У каждого ответа до трёх ступеней: сам ответ, указание — если ответ не дался сразу — и полное решение там, где рассуждение важнее вывода.
§ 5.1. Авторазмещение: у формы нет координат
К вопросу 1. Ответ. Нигде: места на экране у элемента нет. Записано его место в дереве элементов и правила — группа, порядок, растягивание. Экран платформа собирает по ним при каждом открытии.
К вопросу 2. Ответ. Форму открывают разными клиентами и в окнах разного размера; добавьте к этому масштаб, размер шрифта и длину подписей на другом языке. Ни одно из условий заранее не известно.
К вопросу 3. Ответ. Порядок в дереве, вложенность в группу, растягивание, положение в группе, ширина и высота как пожелание.
К вопросу 4. Указание. Что стоит в свойстве, когда его не трогали?
Полное решение. Третье состояние означает «решай сама». Записано оно у разных свойств по-разному: у растягивания это незаданное значение — документация называет его автоматическим определением, — а у ширины ту же роль играет ноль. Положение в группе со значением «авто» берётся от родительской группы. Форма, где всюду оставлено «решай сама», не недоделана: платформа справляется с размещением сама, пока ей не сказали иначе.
К вопросу 5. Ответ. Потому что ширина задаётся в символах и участвует в расчёте макета: места может не хватить, и тогда платформа сожмёт поле. Точного размера в точках в управляемой форме не бывает.
К вопросу 6. Ответ. Что буквально подвинуть нельзя, но можно изменить порядок в дереве, собрать поля в группу или разрешить растягивание — и спросить, что именно человеку мешает.
К упражнению «По образцу». Ответ. В узком окне колонки сжимаются, часть подписей укорачивается, а при совсем малой ширине список показывает не все колонки сразу. В широком — колонки раздаются по свободному месту.
К упражнению «Своё: переведите просьбу». Ответ. «Телефон справа от наименования» — положить оба поля в одну группу с горизонтальным порядком; «наименование во всю ширину» — разрешить растягивание по горизонтали; «ИНН поуже» — задать ширину в символах.
К упражнению «Ловушка: „форма разъехалась"». Указание. На чьём экране форма «правильная»?
Полное решение. Правильного экрана нет: форма собирается под то окно, в котором открыта, и на ноутбуке коллеги она выглядит иначе по устройству, а не по ошибке. «Прибить поля на место» в управляемой форме нельзя — координат нет. Проверить стоит другое: не тесно ли на узком экране, не расползаются ли поля на широком, и не мешает ли конкретному человеку конкретное поле. Если мешает — лечится это порядком, группой или растягиванием, и лечится для всех сразу.
К упражнению «Обратный ход». Ответ. Широкому полю разрешено растягивание по горизонтали, у узкого задана ширина в символах или растягивание запрещено. Возможен и третий вариант: поля лежат в разных группах.
К упражнению «На чтение». Ответ. На узком экране полям не хватит места, и платформа всё равно сожмёт их или покажет полосу прокрутки. На широком — форма останется прижатой к левому краю, а справа будет пустота. Обе картины — цена спора с платформой без причины.
§ 5.2. Группы: рамка, внутри которой свой порядок
К вопросу 1. Ответ. Элемент, который держит в себе другие элементы. Показывать ему нечего, поэтому и пути к данным не положено.
К вопросу 2. Ответ. Свойство «Группировка». Значения: вертикальная, горизонтальная, горизонтальная всегда и горизонтальная, если возможно.
К вопросу 3. Ответ. «Горизонтальная» ставит элементы в строку и тогда, когда места мало. «Горизонтальная, если возможно» смотрит на ширину: не хватило — опускает элементы друг под друга.
К вопросу 4. Ответ. Как вертикальная стопка, в которой некоторые ряды разложены в строку: форма — вертикальная группа, внутри неё поля и другие группы, а горизонтальные группы собирают поля в ряды.
К вопросу 5. Указание. Что вообще рисует рамку?
Полное решение. Рамка — не обязательное свойство группы, а одно из значений отображения: оно бывает сильным, обычным, слабым и никаким. При «никаком» на экране остаётся только порядок. Вторая возможность — снятое свойство «Объединённая»: тогда элементы такой группы располагаются прямо в родительской, а из свойств самой группы действуют только цвет фона и группировка. Ни то ни другое ошибкой не является: группу часто заводят ради размещения, а не ради вида.
К вопросу 6. Ответ. Видимость, доступность и «только просмотр» действуют на всё, что внутри: спрятали группу — исчезли все её элементы.
К вопросу 7. Ответ. Чаще — что поля из группы вынесли, а её саму забыли убрать. Но бывает и замысел: группу оставили, чтобы прятать одно поле вместе с её заголовком.
К упражнению «По образцу». Ответ. В структуре появляется группа «Контакты», а телефон и контактное лицо оказываются вложенными в неё; на экране — рамка с заголовком, внутри два поля.
К упражнению «Своё: разложите карточку». Ответ. Разумный вариант: форма — вертикальная; наименование отдельно; группа «Реквизиты» с ИНН; группа «Контакты» с телефоном и контактным лицом. Объяснение каждой группы — одной фразой про дело, а не про красоту.
К упражнению «Ловушка: „рамка пропала"». Указание. Рамку рисует не заголовок.
Полное решение. Первое объяснение — у группы отключено отображение: заголовок задан, а рисовать его не на чем. Второе — снято свойство «Объединённая», и элементы ушли в родительскую группу вместе с заголовком. Смотреть нужно в палитру свойств самой группы, а не в свойства полей: поля тут ни при чём.
К упражнению «Обратный ход». Ответ. Оба поля лежат в одной группе, и у неё горизонтальная группировка — в одном из двух видов. Если на узком экране поля опускаются друг под друга, значит, «если возможно».
К упражнению «На чтение». Ответ. Скорее всего, полей в группе было несколько, а потом их убрали или перенесли: заголовок и сильное выделение ради одного поля заводят редко.
§ 5.3. Страницы: форма, которую показывают по частям
К вопросу 1. Ответ. Из групп со значениями свойства «Вид» «Страницы» и «Страница». Первая держит набор и показывает закладки, вторая держит содержимое одной закладки.
К вопросу 2. Ответ. Как обычная группа: своя группировка, свой заголовок — он и становится надписью на закладке.
К вопросу 3. Ответ. Сверху, снизу, слева, справа, никак и на усмотрение платформы; отдельно — пролистывание жестом. Значение «нет» нужно помощникам, где страницы переключают командами «Далее» и «Назад».
К вопросу 4. Ответ. В свойстве «Текущая страница» у группы «Страницы».
К вопросу 5. Ответ. На первую — то, что нужно каждый раз; на следующие — то, что нужно не всегда; вне страниц — то, что нужно на любой закладке, вроде номера и даты документа.
К вопросу 6. Указание. Что пользователь видит на закладке, которую не открывал?
Полное решение. Ничего: содержимое второй закладки показывается только тогда, когда её открыли. Обязательное поле там легко пропустить, и узнает о нём пользователь по ошибке при записи — то есть в самый неудобный момент. Прятать на следующие закладки стоит то, без чего можно обойтись, а не то, без чего нельзя записать.
К вопросу 7. Ответ. Страница — часть одной формы: данные общие, переключение ничего не открывает, записывается всё разом. Отдельная форма — своё окно со своими данными и своей записью.
К упражнению «По образцу». Ответ. В структуре появляется группа «Страницы» с двумя страницами; наименование и ИНН на «Основном», телефон и контактное лицо на «Контактах». Если вы собирали группу «Контакты» в прошлом параграфе, её можно положить на страницу целиком.
К упражнению «Своё: разложите реализацию». Ответ. Над страницами — номер и дата; «Шапка» — контрагент и склад; «Товары» — таблица товаров. Над страницами остаётся то, что нужно видеть на любой закладке.
К упражнению «Ловушка: „каждая закладка — своя форма"». Ответ. Форма одна: закладки лишь показывают её по частям. Реквизиты общие, и записывается форма целиком, одной кнопкой — шапка вместе с товарами.
К упражнению «Обратный ход». Ответ. Сначала свойство «Текущая страница» у группы «Страницы»; если там пусто — страницу переключает код при открытии, и тогда причина в модуле.
К упражнению «На чтение». Ответ. Пошаговый помощник: страницы есть, но закладки скрыты, и пользователь переходит по ним командами «Далее» и «Назад».
§ 5.4. Декорации: то, что в форме ради пользователя, а не ради данных
К вопросу 1. Ответ. Надпись и картинка. От полей они отличаются тем, что пути к данным у них не бывает: показывают то, что записано в самой форме.
К вопросу 2. Ответ. В её свойстве «Заголовок». У надписи это и есть весь показываемый текст.
К вопросу 3. Ответ. По виду элемента в структуре и по пути к данным: у декорации пути нет, у поля картинки есть. Подсказка — у каждой записи своя картинка почти наверняка значит поле.
К вопросу 4. Указание. Как в управляемой форме задают то, что на экране выглядит линией?
Полное решение. Разделитель — это не отдельная вещь на экране, а решение «здесь кончается одно дело и начинается другое». В управляемой форме такие решения записывают правилом: блоки полей собирают в группы, а группам задают выделение и заголовок. Линия, рамка, промежуток — всё это вид группы, а не отдельный элемент. Поэтому отдельной декорации-разделителя и нет: ей нечего было бы делать.
К вопросу 5. Ответ. Что на надпись будут нажимать, а что произойдёт по нажатию, задано обработчиком — значит, в форме есть код, который её обслуживает.
К вопросу 6. Ответ. Когда это инструкция на абзац вместо короткого пояснения; когда это украшение ради украшения; когда текст должен меняться вместе с данными.
К вопросу 7. Ответ. Чаще подсказка: она привязана к полю и видна, когда пользователь к нему подходит. Надпись уместна как пояснение к целому блоку.
К упражнению «По образцу». Ответ. В структуре появляется декорация-надпись рядом с полем ИНН; в Предприятии она одинакова у всех контрагентов.
К упражнению «Своё: декорация или поле». Ответ. «Документ проведён» — поле надписи: меняется от документа к документу; «Все цены без НДС» — декорация-надпись; логотип фирмы — декорация-картинка; фотография товара — поле картинки с путём к данным.
К упражнению «Ловушка: „добавь линию между блоками"». Ответ. Искать разделитель бесполезно: его среди декораций нет. Шапку и товары собирают в группы, и группе, которая идёт второй, задают выделение и заголовок — линия появится как часть её вида.
К упражнению «Обратный ход». Ответ. Группу с заголовком «Покупатель» и выделением, внутри которой лежат поля контрагента.
К упражнению «На чтение». Ответ. У надписи включено свойство «Гиперссылка», а в модуле формы есть обработчик нажатия, который и заполняет значения. Код за границей книги, но то, что он есть, видно без модуля.
§ 5.5. От дерева к скетчу и обратно
К вопросу 1. Ответ. Дерево показывает вложенность и порядок, включая скрытое; скетч — прямоугольники и соседство, только то, что увидит пользователь.
К вопросу 2. Ответ. Вертикальная группа — друг под другом; горизонтальная — в строку; выделение — рамка; заголовок группы — надпись у рамки; группа «Страницы» — ряд закладок; надпись-декорация — строка текста без поля. И отрицательное: скрытое на скетч не попадает.
К вопросу 3. Ответ. Элемент со снятой видимостью: его место в дереве, на экране пользователь его не увидит.
К вопросу 4. Ответ. По раскладке внутри рамки: прямоугольники друг под другом — вертикальная, в строку — горизонтальная.
К вопросу 5. Ответ. Например: не хватило ширины, и поля из строки опустились друг под друга; у группы нет выделения, и рамки на экране нет.
К вопросу 6. Указание. Кто из двоих знает, что такое группировка?
Полное решение. Дерево — язык редактора: в нём группировки, выделения, пути к данным, и человеку, который с формой работает, всё это ничего не говорит. Скетч показывает то же решение в том виде, в каком его увидит пользователь, — прямоугольниками и подписями. Поэтому спорить о форме с пользователем удобнее по скетчу, а переводить согласованный скетч в дерево — уже дело разработчика.
К вопросу 7. Ответ. Из скетча в дерево: так собирают форму — сперва замысел на бумаге, потом правила в редакторе.
К упражнению «По образцу». Ответ. Сверху номер и дата в одну строку или друг под другом; под ними ряд закладок «Шапка» и «Товары»; открыта «Шапка» — контрагент и склад.
К упражнению «Своё: выведите дерево». Ответ. Форма вертикальная; наименование; группа «Кто отвечает» с заголовком и выделением, внутри адрес и ответственный — друг под другом или в строку, как нарисовали.
К упражнению «Ловушка: „на скетче было не так"». Ответ. Скорее всего, не прав: на узком экране горизонтальная группа «если возможно» опускает поля друг под друга — так и задумано. Проверить стоит группировку: если стоит «если возможно», дерево верное, а расхождение — от ширины окна.
К упражнению «Обратный ход». Ответ. Форма вертикальная; группа «Оплата» с заголовком и выделением, горизонтальная, внутри три поля; под ней поле комментария с растягиванием по горизонтали.
К упражнению «На чтение». Ответ. На скетче группы не будет вовсе — ни рамки, ни пяти полей. Это говорит, что у формы есть часть, которую пользователь не видит: служебные значения или то, что показывают только в особых случаях.
§ 5.6. Чужая форма: композиция и замысел
К вопросу 1. Ответ. Первый даёт скетч — что увидит пользователь. Второй — замысел: почему сложено именно так, в нескольких фразах о работе.
К вопросу 2. Ответ. От крупного к мелкому: страницы, группы, направление и выделение, декорации, скрытое. Крупные решения задают рамку для мелких; кто начинает с полей, тонет в них.
К вопросу 3. Ответ. Что в ней, как разложено, видна ли.
К вопросу 4. Ответ. Что её, скорее всего, собрали ради размещения, а не ради смысла. Тогда стоит проверить, не зря ли у неё рамка и заголовок.
К вопросу 5. Указание. Что знает скетч о скрытом?
Полное решение. Ничего: скрытая группа на скетч не попадает, и по экрану о ней не узнать. А в ней может лежать главное — поля, которые показывают одним пользователям и прячут от других, или то, что появляется только в особых случаях. Разбор, построенный по экрану, этого не увидит; разбор по дереву — увидит и заставит спросить, кто и когда меняет её видимость.
К вопросу 6. Ответ. Скрытую группу с важными полями — почему и от кого она скрыта; россыпь декораций-пояснений — что именно в форме непонятно.
К вопросу 7. Ответ. Читать только экран; не заметить группу без выделения; считать закладки отдельными формами; искать разделитель среди декораций.
К упражнению «По образцу». Ответ. Скетч: номер и дата сверху, закладки «Шапка» и «Товары», на открытой — контрагент и склад. Замысел, например: «номер и дата нужны всегда»; «шапку заполняют один раз»; «товары — основная работа, им отдана своя закладка».
К упражнению «Своё: замысел в фразах». Ответ. Например: «наименование — главное, оно первым»; «артикул и единица — одно дело для склада, их держат вместе в рамке „Учёт“»; «подробности и остатки кладовщик смотрит по требованию». Годится любой вариант, где фразы про работу, а не про устройство.
К упражнению «Ловушка: „группы нет — значит, поля сами по себе"». Ответ. Группу без выделения: на экране её не видно, а в дереве она есть и держит номер и дату в одной строке. Судить о связанности по рамке нельзя — её может и не быть.
К упражнению «Обратный ход». Ответ. Форма вертикальная; страницы «Основное», «Товары», «Дополнительно»; на «Основном» — группа «Покупатель» с заголовком; таблица на «Товарах»; на «Дополнительно» — группа «Бухгалтерия» с видимостью, которую показывают только бухгалтеру.
К упражнению «На чтение». Ответ. Композиция перекошена: на первой закладке двадцать полей без всякого деления — дело не разложено на части; на второй одно поле выделено так, будто оно важнее всего остального. Скорее всего, раскладка устарела, и замысел придётся восстанавливать по разговору с пользователями.
§ 6.1. Таблица: элемент, который показывает строки
Откройте поступление № 12 на закладке «Товары»: там не одно значение, а столбик строк — бумага, ручки, папки, у каждой своё количество и цена. Поле такое не покажет, ему положено одно значение. Для строк у формы есть свой элемент — таблица, один из пяти видов элементов, которые мы уже знаем. Внутри неё лежат поля, но не так, как в группе: каждое из них показывает свою графу во всех строках сразу.
1. Чем таблица отличается от поля
Документация делит работу между ними прямо: поле показывает реквизиты нетабличных типов, таблица — табличных.
| поле | таблица | |
|---|---|---|
| что показывает | одно значение | строки |
| путь к данным | к одному значению | к набору строк |
| что внутри | ничего | колонки |
| кнопки | свои у некоторых видов | своя командная панель |
Разница не во внешнем виде, а в том, что стоит за элементом. За полем — значение, за таблицей — набор строк, и у каждой строки свои значения.
Поле показывает значение, таблица — строки. У каждой строки свои значения, и показывают их колонки.
2. Откуда таблица берёт строки
Путь к данным у таблицы есть, как у поля, но ведёт он не к значению, а к табличному реквизиту. Основных источников три; двум из них в этой главе будет свой разговор, а третий мы уже разбирали среди типов реквизитов формы.
| путь к данным | что за ним | откуда строки |
|---|---|---|
| Объект.Товары | табличная часть документа | из записи в базе |
| ОстаткиПоСкладам | таблица значений — реквизит формы | их кладёт обработчик |
| Список | динамический список | запрос к базе |
Первая строка — данные записи: строки товаров принадлежат поступлению и записываются вместе с ним. Вторая — данные формы: строки живут, пока открыто окно. Третья — особый случай: строки не хранятся ни в записи, ни в форме — платформа получает их запросом к базе и подгружает по мере надобности. Различие это и есть главный вопрос главы.
3. Колонки — это поля внутри таблицы
Внутри таблицы в структуре элементов лежат колонки, и каждая колонка — обычное поле. В документации об этом сказано так: размещённое в таблице поле представляет собой колонку.
Товары ← таблица
│ путь: Объект.Товары
├── Товар ← поле-колонка
├── Количество ← поле-колонка
├── Цена ← поле-колонка
└── Сумма ← поле-колонка
Всё, что мы знаем о полях, работает и здесь: у колонки есть вид, путь к данным, видимость, заголовок. Путь у колонки ведёт внутрь строки — как именно, разберём в отдельном разговоре о колонках. А самое наглядное в колонках видно на одной строке — той, где стоит курсор.
4. Текущая строка
Строк в таблице много, а работает пользователь в каждый миг с одной — той, где стоит курсор. Её называют текущей строкой.
| что видно | что это значит |
|---|---|
| выделенная строка | текущая: с ней сейчас работают |
| стандартная кнопка удаления над таблицей | удалит текущую строку |
| поле под таблицей показывает сведения о товаре | берёт их из текущей строки |
Для чтения формы понятие это важнее, чем кажется. Когда что-то в форме «само меняется при переходе по строкам», за этим почти всегда стоит текущая строка — и, как правило, обработчик, который отзывается на её смену. Сам обработчик за границей книги, но причину видно без него: значение под таблицей зависит от того, на какой строке курсор.
5. Что таблица разрешает
У таблицы есть свойства, которые решают, что пользователь может сделать со строками.
| свойство | что разрешает |
|---|---|
| изменять состав строк | добавлять и удалять строки |
| изменять порядок строк | двигать строки вверх и вниз |
| только просмотр | ничего не менять вовсе |
Это удобство, а не защита. Документация добавляет к первым двум ту же оговорку, что знакома по полям: свойства имеют смысл лишь там, где изменение не запрещено прикладным смыслом и правами.
Есть у таблицы и свойство отображения — список, дерево или иерархический список. Табличная часть документа обычно показана списком; дерево и иерархический список пока только назовём — к ним вернёмся в разговоре о форме списка, где строки вложены друг в друга, как группы товаров.
6. Своя командная панель
Над таблицей стоят свои кнопки: добавить строку, удалить, передвинуть. Это не кнопки формы, а командная панель самой таблицы — отдельная группа, которую платформа заполняет стандартными командами.
| где кнопка | чья она |
|---|---|
| над таблицей | командной панели таблицы |
| вверху формы | командной панели формы |
Отсюда вопрос при чтении чужой формы: стандартная кнопка над таблицей действует на строки этой таблицы, а не на всю запись. Чья кнопка, видно в структуре — она лежит внутри командной панели таблицы. Если кнопок над таблицей нет, возможно, их убрали — или у таблицы запрещено изменение состава строк.
7. В Конфигураторе и в Предприятии
Посмотрим на две таблицы, которые уже есть в наших формах.
-
Откройте форму поступления, которую собрали на закладках, и найдите таблицу товаров в структуре элементов. Посмотрите её путь к данным.
-
Раскройте таблицу: внутри — колонки. Выделите колонку «Количество» и убедитесь, что это поле со своим видом и путём.
-
Найдите у таблицы командную панель и свойства изменения состава и порядка строк.
-
Откройте форму элемента «Товаров» и найдите таблицу остатков по складам. Сравните путь: из одной части, без «Объект.» — данные формы.
-
Откройте поступление № 12 в Предприятии, встаньте на вторую строку и нажмите удаление строки — не записывая, закройте документ без сохранения. Удалилась именно текущая строка.
Пятый шаг — напоминание о прошлой главе про данные: правка строк, как и правка полей, живёт в копии, пока документ не записан.
Главное в одном абзаце
Таблица — элемент для строк: поле показывает одно значение, таблица — набор строк, и у каждой строки свои значения, которые показывают колонки. Путь к данным у таблицы ведёт к табличному реквизиту, и источников у формы три: табличная часть записи, таблица значений в данных формы и динамический список, чьи строки приносит запрос. Колонки — обычные поля внутри таблицы: с видом, путём, видимостью, заголовком. В каждый миг одна строка текущая — с ней и работают кнопки, от неё и зависит то, что в форме «меняется при переходе по строкам». Свойства таблицы решают, можно ли добавлять, удалять и двигать строки, — но это удобство, а не защита. Над таблицей стоит её собственная командная панель, и кнопки на ней действуют на строки этой таблицы, а не на всю запись.
У таблицы три источника строк, и самый частый — табличная часть документа. Строки товаров приходят вместе с поступлением, правятся в форме и уходят в базу при записи. Как это устроено и где здесь граница между записью и формой?
Контрольные вопросы
- Чем таблица отличается от поля?
- Куда ведёт путь к данным у таблицы?
- Назовите три источника строк таблицы и скажите, где живут строки в каждом случае.
- Что такое колонка таблицы с точки зрения видов элементов?
- Что такое текущая строка и зачем её понимать при чтении формы?
- Какие свойства решают, что пользователь может делать со строками?
- Чем командная панель таблицы отличается от командной панели формы?
Упражнения
По образцу. Найдите в форме поступления таблицу товаров и выпишите её путь и пути всех колонок.
Своё: откуда строки. Для каждой таблицы определите источник строк: товары в реализации; остатки по складам в карточке товара; список контрагентов в форме списка.
Ловушка: «удалил строку — значит, удалил товар». Кладовщик боится удалять строку в поступлении: «вдруг товар пропадёт из справочника». Что вы ему объясните?
Обратный ход. Над таблицей в чужой форме нет ни одной кнопки, а строки в ней не добавляются. Какие объяснения возможны?
На чтение. В чужой форме под таблицей стоит надпись, которая меняется, когда пользователь переходит по строкам. Что можно сказать об этой форме, не открывая модуль?
Ответы — в конце части.
§ 6.2. Таблица из табличной части: товары в поступлении
Проверьте на деле. Откройте поступление № 12, добавьте четвёртую строку — например, ещё одну пачку бумаги, — и закройте документ, не записывая. Откройте снова: строк три, как было. Строки табличной части — часть той же записи, что и шапка, и живут по тому же правилу, что артикул в карточке товара: форма работает с их копией, а в базу они уходят только при записи — и уходят все разом, вместе с документом.
1. Табличная часть живёт внутри записи
Табличная часть — не отдельный объект, а часть документа: строки товаров принадлежат поступлению так же, как его номер и дата. В форме это видно по основному реквизиту.
Объект (ДокументОбъект.ПоступлениеТоваров)
├── Номер, Дата, Контрагент, Склад
└── Товары ← табличная часть
├── Товар
├── Количество
├── Цена
└── Сумма
Это та же картина, что мы видели, разворачивая «Объект» в главе о данных. Таблица на форме показывает то, что лежит внутри «Объекта», и путь у неё — «Объект.Товары».
Строки табличной части — такие же данные записи, как номер и дата. Таблица на форме — способ их показать.
2. Как таблица попадает в форму
Путь тот же, что у поля: перетащить из реквизитов в элементы. Разница в том, что тащат не одно значение, а табличную часть целиком.
| что перетащили | что появилось в элементах |
|---|---|
| Объект.Артикул | поле |
| Объект.Товары | таблица с колонками |
Колонки редактор предложит сам — по реквизитам табличной части. Как и с полями, это правило, а не обязанность: колонку можно убрать, и реквизит строки от этого не исчезнет, его просто перестанут показывать.
У каждой строки табличной части есть ещё и стандартный реквизит — «НомерСтроки». Его платформа ведёт сама, и в таблице он обычно виден первой колонкой.
Таблица на месте. Теперь посмотрим, что происходит со строками, пока форма открыта.
3. Жизнь строк в открытой форме
Строки проходят тот же путь, что и все данные формы, и граница между записью и формой проходит там же.
| что делает пользователь | что происходит |
|---|---|
| открыл документ | строки вместе с шапкой пришли копией в данные формы |
| добавил, удалил, поменял строку | изменилась копия, в базе прежнее |
| нажал «Записать» | вся табличная часть записана вместе с документом |
| закрыл без записи | копия исчезла вместе со всеми правками строк |
Запись — действие над документом, а не над строкой: отдельной «записи строки» у платформы нет. Табличная часть уходит в базу так же, как документ, — одним куском.
4. Сумма документа и сумма строки
Опыт ниже нужен не ради арифметики: он показывает границу — что делает объект при записи, а что остаётся на форме до неё.
| что | когда пересчитывается |
|---|---|
| сумма документа | при записи — модуль объекта складывает суммы строк |
| сумма строки | сама не пересчитывается |
Сумму документа складывает из строк код в модуле объекта при записи — так собрана конфигурация «Канцтовары»; сам код за границей книги. Складывает он колонку «Сумма», какой бы формой ни записывали документ. А вот сумма строки при изменении количества сама не поменяется: для этого нужен обработчик формы, а в наших формах их нет. Отсюда ловушка. Поменяли количество, записали — и итог документа сложился из прежних сумм строк, а с новыми количествами он уже не сходится. Правило объекта верно считает то, что ему дали; дать ему верные суммы строк — дело формы.
5. Строки и проведение
Строки табличной части — исходные данные для проведения: код проведения в модуле объекта обходит строки и по каждой делает движение — остаток товара на складе растёт на её количество.
строка поступления → движение регистра
Товар: ручка Товар: ручка
Количество: 400 Склад: Основной
Количество: +400
Отсюда практическое следствие для чтения: таблица товаров в документе — не «просто список», а исходные данные для учёта. Строка, добавленная в форме, до записи и проведения ни на какие остатки не влияет.
6. Как узнать табличную часть в чужой форме
Главные признаки читаются по путям.
| признак | что значит |
|---|---|
| путь таблицы начинается с «Объект.» | строки — часть записи |
| пути колонок — «Объект.Товары.Количество» | колонки — реквизиты строки |
| реквизит строки есть, а колонки нет | его не показывают, но он хранится |
| путь таблицы без «Объект.» | это не табличная часть, а данные формы |
Последняя строка — та же история, что с полями: не все реквизиты табличной части обязаны быть на экране. Найти скрытые помогает сравнение колонок с составом табличной части внутри «Объекта».
7. В Конфигураторе и в Предприятии
Соберём таблицу товаров заново — чтобы увидеть, как она появляется.
-
Откройте форму поступления, которую собрали на закладках, и удалите из страницы «Товары» таблицу. Реквизиты не трогайте.
-
Разверните в реквизитах «Объект» и перетащите табличную часть «Товары» на страницу «Товары». Посмотрите, какие колонки появились.
-
Обновите конфигурацию базы данных и откройте поступление № 12. Добавьте строку и закройте без записи: строк по-прежнему три.
-
Откройте снова, поменяйте количество в первой строке и посмотрите на сумму строки: она прежняя. Закройте без записи.
-
Проверьте, что таблица снова на месте, и оставьте форму.
Главное в одном абзаце
Табличная часть — не отдельный объект, а часть записи: строки товаров принадлежат поступлению так же, как номер и дата, и в форме лежат внутри основного реквизита, по пути «Объект.Товары». В форму таблицу выводят тем же жестом, что и поле, — перетаскиванием, и колонки редактор предлагает сам, по реквизитам строки; у каждой строки есть ещё стандартный номер. Строки живут по общему правилу данных формы: пришли копией, правятся в копии, уходят в базу только при записи — и уходят целиком, вместе с документом. Сумму документа в «Канцтоварах» при записи складывает из сумм строк код объекта, а сумма строки сама не меняется — обработчиков в наших формах нет, и поэтому итог может разойтись с количествами. Строки — исходные данные для проведения, и до записи и проведения ни на какие остатки они не влияют. В чужой форме табличную часть узнают по путям: таблица — «Объект.Товары», колонки — «Объект.Товары.Количество».
Колонки редактор создал сам, по реквизитам строки. Но каждая колонка — поле со своим путём, видом и свойствами. Что в этом пути означает каждая часть и что можно сделать с колонкой, не трогая данных?
Контрольные вопросы
- Где в данных формы лежит табличная часть документа?
- Каким жестом выводят табличную часть в форму и что при этом появляется?
- Что происходит со строками, пока форма открыта, и когда они попадают в базу?
- Можно ли записать в базу только одну изменённую строку? Почему?
- Кто считает сумму документа и сумму строки и почему после изменения количества итог может оказаться неверным?
- Как строки поступления связаны с остатками на складе?
- По каким признакам узнать табличную часть в чужой форме?
Упражнения
По образцу. Проделайте опыт с добавлением строки на документе «РеализацияТоваров»: добавьте строку, закройте без записи, откройте снова.
Своё: предскажите итог. В поступлении меняют количество в двух строках и записывают документ. Что будет с суммами строк и с суммой документа?
Ловушка: «строку добавил — значит, товар уже на складе». Кладовщик добавил строку в поступление, не записав документ, и удивляется, почему в отчёте об остатках её нет. Что вы объясните?
Обратный ход. В табличной части документа есть реквизит «Скидка», а колонки с таким заголовком в таблице нет. Где он и хранится ли его значение?
На чтение. В чужой форме две таблицы: у одной путь «Объект.Услуги», у другой — «ПодборУслуг», без «Объект.». Чем различаются их строки и что будет с каждой при закрытии без записи?
Ответы — в конце части.
§ 6.3. Колонки таблицы: поля, которые показывают каждую строку
Выделите в таблице товаров колонку «Цена» и посмотрите на её путь к данным: «Объект.Товары.Цена». Три части — и каждая отвечает на свой вопрос: чья это запись, какая в ней табличная часть, какой реквизит строки показать. С этим адресом колонка работает во всех строках сразу: в первой показывает цену бумаги, во второй — цену ручки.
1. Путь колонки по частям
Путь таблицы мы уже видели — «Объект.Товары». Путь колонки продолжает его на одно звено.
| часть пути | что означает |
|---|---|
| Объект | основной реквизит — запись документа |
| Товары | табличная часть этой записи |
| Цена | реквизит строки |
Таблица говорит «вот строки», колонка — «вот что показать в каждой из них». Поэтому путь колонки начинается с пути своей таблицы: в таблице табличной части колонка показывает то, что есть в строке.
Путь колонки — это путь таблицы плюс имя реквизита строки. Один адрес на все строки: в каждой он указывает на своё значение.
2. Колонка — это поле
Колонка — не отдельный вид элемента, а поле, поставленное в таблицу: документация так её и описывает. Поэтому всё, что мы знаем о полях, у колонки есть: вид, видимость, доступность, «только просмотр», заголовок. Заголовок колонки — это надпись в шапке таблицы.
| свойство | у колонки |
|---|---|
| вид | поле ввода, флажок, надпись, картинка и другие — как у поля |
| заголовок | надпись в шапке таблицы |
| видимость | показывать ли колонку |
| только просмотр | видно, но не правится ни в одной строке |
Колонку-флажок вы видели не раз: булев реквизит строки в таблице показывают именно так — флажком в каждой строке.
3. Свойства, которые есть только у колонки
Часть свойств поля имеет смысл только тогда, когда поле стоит в таблице. Документация так и оговаривает у каждого из них.
| свойство | что задаёт |
|---|---|
| «Отображать в шапке» | есть ли у колонки заголовок в шапке |
| «Отображать в подвале» | есть ли у колонки строка под таблицей |
| «Текст подвала», «Путь к данным подвала» | что написать под колонкой |
| «Фиксация в таблице» | прижать колонку к левому или правому краю, чтобы не уезжала при прокрутке |
Подвал — место под таблицей, где часто показывают итог: сколько всего штук, на какую сумму. Подвал включают у таблицы, а что в нём написать, решает каждая колонка — текстом или путём к реквизиту.
4. Что можно сделать с колонкой, не трогая данных
Колонка — способ показать, а не место, где лежит значение; поэтому почти всё, что с ней делают, данных не касается.
| что сделали | что с данными |
|---|---|
| убрали колонку | реквизит строки на месте, хранится |
| поменяли порядок колонок | ничего |
| поменяли заголовок | ничего |
| закрепили у края | ничего |
| сделали только для просмотра | значения есть, править их в форме нельзя |
Последняя строка требует осторожности. Сумму строки делают «только для просмотра», когда её считает код формы. В наших формах кода нет — закройте колонку суммы для правки, и вводить её станет некому.
Колонку можно убрать, переставить, переименовать — строки от этого не меняются. А вот запретить правку стоит, только если значение кто-то считает.
5. Группы колонок
Иногда в одной ячейке шапки стоят две колонки — одна над другой или рядом под общим заголовком. Это группа колонок: особый вид группы, который встречается только внутри таблицы.
Товары ← таблица
├── Товар
├── КоличествоЦена ← группа колонок
│ ├── Количество
│ └── Цена
└── Сумма
При чтении чужой формы группа колонок — знак, что автор экономил ширину или хотел, чтобы два значения читались вместе. Данных она не касается, как и любая группа, — и это частный случай правила, которое стоит проговорить целиком.
6. Колонка и реквизит строки — не одно и то же
Всё, что мы говорили о поле и реквизите, повторяется для колонки и реквизита строки.
| реквизит строки | колонка | |
|---|---|---|
| где живёт | в табличной части объекта | в структуре элементов формы |
| сколько их | один на табличную часть | в каждой форме свои |
| убрали | значения исчезли | значения на месте, не показаны |
В одной форме документа колонку цены показывают, в другой — нет, а реквизит «Цена» у строки один на все формы.
7. В Конфигураторе и в Предприятии
Поработаем с колонками таблицы товаров — ничего не меняя в данных.
-
Откройте форму поступления, выделите в таблице колонку «Цена» и прочитайте её путь по частям.
-
Переименуйте заголовок колонки «Количество» в «Кол-во» и поставьте колонку «Сумма» перед «Ценой».
-
Снимите видимость у колонки «Цена». Обновите конфигурацию и откройте поступление № 12: колонки нет, а сумма документа прежняя — цены в строках никуда не делись, их просто не показывают.
-
Верните видимость, заголовок и порядок колонок, как были.
-
Скажите вслух, что случилось бы, если бы вы вместо видимости сняли у колонки «Сумма» возможность правки.
Главное в одном абзаце
Колонка — поле внутри таблицы, и путь у неё продолжает путь таблицы на одно звено: «Объект.Товары.Цена» — запись, табличная часть, реквизит строки; один адрес на все строки, в каждой он указывает на своё значение. У колонки есть всё, что есть у поля, — вид, видимость, доступность, «только просмотр», заголовок, который становится надписью в шапке, — и свойства, которые имеют смысл только в таблице: показ в шапке и в подвале, текст или путь подвала, фиксация у края. Почти всё, что делают с колонкой, данных не касается: убрали, переставили, переименовали — строки прежние; а запрещать правку стоит, только если значение кто-то считает. Колонки бывают собраны в группы колонок, и это, как любая группа, решение о показе. И колонка — не реквизит строки: реквизит один на табличную часть, колонки у каждой формы свои.
С табличной частью разобрались: строки живут в записи, колонки их показывают. Но в форме списка товаров строки не принадлежат никакой записи — это сами товары, сколько их есть в базе. Откуда берётся такая таблица и почему её нельзя записать?
Контрольные вопросы
- Из каких частей состоит путь колонки и что означает каждая?
- Почему путь колонки всегда начинается с пути её таблицы?
- Какие свойства поля есть у колонки и чем становится её заголовок?
- Какие свойства имеют смысл только у колонки?
- Что происходит с данными, если убрать колонку или поменять порядок колонок?
- Когда колонку стоит делать «только для просмотра» и чем это опасно в наших формах?
- Чем колонка отличается от реквизита строки?
Упражнения
По образцу. Выпишите пути всех колонок таблицы товаров в форме реализации, если вы её собирали, или в форме поступления.
Своё: закрепите главное. В таблице двенадцать колонок, и при прокрутке вправо пропадает наименование товара. Какое свойство и у какой колонки вы поменяете?
Ловушка: «убрал колонку — пропали цены». Разработчик скрыл колонку «Цена», а бухгалтер уверен, что цены из документов удалены. Как проверить и что объяснить?
Обратный ход. Под таблицей в чужой форме стоит «Итого: 146 500». Где искать, откуда берётся это число?
На чтение. В чужой форме колонка «Сумма» только для просмотра, а в модуле формы есть обработчик изменения количества. Что, скорее всего, делает этот обработчик?
Ответы — в конце части.
§ 6.4. Динамический список: таблица, которая показывает базу
Откройте список товаров и поищите кнопку «Записать». Её нет — и не потому, что её забыли. Записывать нечего: строки этой таблицы не лежат ни в записи, ни в форме. Список их не хранит, а показывает — берёт из базы запросом и показывает то, что запрос вернул на момент выборки. Такой реквизит формы называется динамическим списком.
1. Что это такое
Динамический список — реквизит формы особого типа, о котором мы вскользь говорили в главе о данных. За ним стоит запрос к базе, и документация описывает его именно так: он даёт возможность описать в форме запрос, указать порядок сортировки, отборы, группировки и оформление.
| табличная часть | таблица значений | динамический список | |
|---|---|---|---|
| где строки | в записи | в данных формы | в базе |
| кто их кладёт | пользователь и код | код | запрос |
| записываются ли | вместе с записью | никогда | нечего записывать |
Третья колонка — главное отличие. Две первые таблицы держат строки у себя, динамический список держит только правило, по которому строки берутся.
Табличная часть и таблица значений хранят строки. Динамический список хранит вопрос к базе, а строки получает в ответ.
Строже: у этого реквизита заданы основная таблица — или текст запроса, если он написан вручную, — отбор, порядок и оформление; по ним платформа строит запрос, выполняет его и приносит строки.
2. Основная таблица: что показывать
Первое, что читают у динамического списка, — основную таблицу. Документация называет её таблицей, главной в запросе: например, справочник «Товары».
| что задали | что сделала платформа |
|---|---|
| основная таблица «Справочник.Товары» | сама построила запрос к товарам |
| ничего больше | колонки, сортировка, выбор — по умолчанию |
Это та же декларативность, что всюду в книге. Пока запрос строит платформа, никто не пишет «загрузи товары и выведи их в таблицу» — задают, что показывать, а как достать, решает она. Если стандартного запроса мало, у списка есть флажок произвольного запроса: с ним текст запроса пишет разработчик.
3. Запрос на сервере, строки на клиенте
Принцип клиента и сервера виден здесь нагляднее, чем где бы то ни было.
клиент: показать товары
│
сервер: запрос к базе
│
клиент: получил строки,
которые видны на экране
У динамического списка есть свойство «Динамическое считывание данных»; документация описывает его так: выбирать данные только при необходимости их отображения на экране. Когда оно включено, список из ста тысяч товаров не тянет все строки на клиент: приходит порция — столько, сколько нужно показать на экране и хватить на ближайшую прокрутку. Прокрутил — пришла следующая.
4. Почему список нельзя записать
Раз список только показывает и строк у себя не держит, записывать в нём нечего. Строки списка — не копия записей, а результат запроса, чаще всего по строке на запись. Править их прямо в списке обычно и не дают: правят запись, открывая её форму.
| что делает пользователь | что происходит |
|---|---|
| двойной щелчок по строке | открывается форма этого товара |
| правит и записывает карточку | меняется запись в базе |
| возвращается в список | список показывает новое значение |
Отсюда граница, которую стоит держать в голове: в табличной части правка строки — это правка документа; в динамическом списке правка строки — это правка другой записи, открытой из списка.
5. Сколько списков в форме
Основной реквизит формы списка — динамический список, и называется он обычно «Список». Но динамический список может жить и в другой форме, дополнительным реквизитом: например, в карточке контрагента можно показать его поступления.
| где | какой реквизит |
|---|---|
| форма списка товаров | основной реквизит «Список» |
| карточка контрагента | дополнительный реквизит — список его поступлений |
Во втором случае форма говорит о контрагенте, а список показывает связанные с ним записи — те самые «данные помимо записи», о которых шла речь в главе о данных, только берутся они из базы.
6. Как узнать динамический список в чужой форме
Признаки читаются по путям и типам.
| признак | где смотреть |
|---|---|
| реквизит формы типа «динамический список» | список реквизитов |
| путь таблицы — имя этого реквизита | свойства таблицы |
| пути колонок — «Список.Наименование» | свойства колонок |
| у таблицы нет кнопок добавления строк | командная панель таблицы |
Путь колонки здесь начинается не с «Объект.», а с имени списка, и дальше идёт имя поля запроса. А колонок может быть и больше, чем реквизитов у товара: какие поля даёт запрос и как их отбирают и сортируют — это уже настройки списка, о них разговор впереди.
7. В Предприятии
Опыт на то, что строки берутся из базы.
- Откройте список товаров. Найдите: есть ли кнопка «Записать», можно ли поменять наименование прямо в строке.
-
Откройте двойным щелчком ручку шариковую, поменяйте наименование на «Ручка шариковая синяя» и запишите.
-
Вернитесь в список: строка показывает новое наименование.
-
Верните прежнее наименование «Ручка шариковая» и запишите: база серии должна остаться прежней.
-
Отсортируйте список по коду и обратно по наименованию. Сортировка меняет только порядок показа — в базе ничего не произошло.
Главное в одном абзаце
Динамический список — реквизит формы, за которым стоит запрос к базе: он не хранит строки, а показывает то, что в базе есть сейчас. В отличие от табличной части, чьи строки живут в записи, и таблицы значений, чьи строки живут в форме, динамический список держит только правило, а строки получает в ответ на запрос. Главное его свойство — основная таблица: задали «Справочник.Товары», и платформа сама построила запрос; если этого мало, запрос пишут вручную, включив произвольный. Запрос выполняется на сервере, а на клиент уходит порция строк, видимых на экране, — поэтому большой список открывается быстро. Записывать список нечего: правят запись, открывая её форму, а список потом показывает новое. Основной реквизит формы списка — динамический список «Список», но такой список может жить и в другой форме, дополнительным реквизитом. В чужой форме его узнают по типу реквизита и по путям колонок, которые начинаются с его имени.
Динамический список мы видели в автоформе списка. Но где он живёт, когда форму списка собирают свою, и что меняется, если открыть её в редакторе?
Контрольные вопросы
- Где живут строки динамического списка и чем это отличает его от табличной части и таблицы значений?
- Что такое основная таблица динамического списка?
- Как здесь проявляется декларативность?
- Почему список из ста тысяч товаров открывается быстро?
- Почему у формы списка нет кнопки «Записать»?
- Может ли динамический список быть не основным реквизитом формы? Приведите пример.
- Как узнать динамический список в чужой форме?
Упражнения
По образцу. Проделайте тот же опыт на справочнике складов: поменяйте наименование склада в карточке, посмотрите список, верните.
Своё: где строки. Для каждой таблицы скажите, где живут её строки: товары в поступлении; список контрагентов; остатки по складам в карточке товара; поступления в карточке контрагента.
Ловушка: «отсортировал — испортил базу». Пользователь боится сортировать список товаров по артикулу: «вдруг товары перемешаются». Что вы объясните?
Обратный ход. В чужой форме таблица, у колонок пути начинаются с «Список.», кнопок добавления строк нет. Что за реквизит за этой таблицей и где искать правку строк?
На чтение. В карточке склада есть таблица с путём «ТоварыНаСкладе», и в списке реквизитов формы у этого реквизита тип «динамический список». Что показывает таблица и почему её не записывают вместе со складом?
Ответы — в конце части.
§ 6.5. Форма списка: где живёт динамический список
Создайте справочнику «Товары» форму списка и посмотрите на её реквизиты. Основной там один — «Список», выделенный полужирным, и тип у него динамический список; другие реквизиты форме тоже можно завести, но конструктор их не создаёт. Ответ рядом: в своей форме список живёт в основном реквизите — там же, где в карточке живёт «Объект». Всё остальное в форме списка построено вокруг него.
1. Основной реквизит формы списка
Разница между двумя формами одного справочника видна в одной строке.
| форма элемента | форма списка | |
|---|---|---|
| основной реквизит | «Объект» | «Список» |
| тип | объект справочника | динамический список |
| о чём форма | об одной записи | о множестве записей |
| что записывает | эту запись | ничего |
Это то самое различие, которое мы вывели ещё в разговоре об основном реквизите: тип основного реквизита говорит, о чём форма. Здесь оно перестаёт быть теоретическим — вот две формы, и разница между ними ровно в этой строке.
В карточке основной реквизит — сама запись. В форме списка — правило, по которому записи достают из базы.
2. Что собрал конструктор
Кроме реквизита конструктор кладёт в форму и остальное — то, из чего список состоит.
| что появилось | зачем |
|---|---|
| реквизит «Список» | правило, по которому берутся строки |
| таблица с путём «Список» | показывает строки на экране |
| колонки «Код», «Наименование» | показывают поля запроса |
| командная панель таблицы | создать, скопировать, пометить на удаление, найти |
Колонок в списке меньше, чем реквизитов у товара: артикула и единицы среди них нет. Конструктор кладёт колонки по тем полям, что описывают запись коротко, — для справочника это код и наименование. Нужные колонки добавляют сами; как именно, разберём в практике.
3. Кнопки списка действуют на записи
В форме элемента кнопки записывают и проводят. В форме списка записывать нечего, поэтому и кнопки другие — они работают с записями базы.
| кнопка | что делает |
|---|---|
| создать | открывает форму элемента для новой записи |
| скопировать | создаёт новую запись по образцу текущей |
| пометить на удаление | ставит пометку у текущей записи |
| найти | ищет по строкам списка |
Заметьте: ни одна из них не меняет сам список — они меняют записи, а список потом показывает новое. Это прямое следствие того, что строки ему не принадлежат.
4. Иерархия: список с вложенностью
У «Товаров» есть группы — справочник иерархический. Динамический список умеет показывать такую структуру не плоским перечнем, а с вложенностью: у таблицы для этого есть отображение — список, дерево или иерархический список.
Показывать иерархию список умеет, но не сам по себе: как она выглядит, решает отображение таблицы. Отсюда и знакомая пара форм: у иерархического справочника кроме формы элемента бывает форма группы — о ней мы говорили в разговоре о видах автоформ. Список показывает и группы, и элементы, а открывает для каждого свою форму.
В дереве, впрочем, формы может и не быть вовсе — и список всё равно откроется.
5. Своя форма списка или автоформа
Форма списка живёт по тем же правилам, что и все остальные: пока своей нет, платформа строит её сама.
| в дереве объекта | что откроется |
|---|---|
| ветка «Формы» пуста | автоформа списка |
| форма есть, назначена основной | она |
| форма есть, но не назначена основной | по двойному щелчку — автоформа; саму форму можно открыть командой |
Проверяется это там же, где мы проверяли назначение формы элемента, — в окне редактирования объекта, в строках основных форм. Правило одно на все виды форм. А вот что именно список покажет — какие поля, какие строки, в каком порядке, — решают его настройки, и это следующий разговор.
6. Что читать в чужой форме списка
Разбор такой формы короче, чем карточки, и начинается с того же вопроса.
| что смотрим | что узнаём |
|---|---|
| тип основного реквизита | форма о множестве записей |
| путь таблицы | имя списка |
| пути колонок | какие поля запроса показывают |
| командная панель | что пользователю разрешено делать с записями |
| есть ли отбор в настройках списка | показывают не всё — разговор впереди |
Последняя строка — самая частая находка в чужих формах списков: список показывает не весь справочник, а его часть. Где это задано, разберём в следующем параграфе.
7. В Конфигураторе и в Предприятии
Соберём свою форму списка и добавим в неё колонку.
-
Откройте справочник «Товары» и создайте конструктором форму списка. Назначьте её основной.
-
Посмотрите реквизиты: строка «Список», полужирным, тип — динамический список. Разверните её: внутри поля запроса.
-
Найдите в элементах таблицу и её колонки. Посмотрите путь таблицы и путь любой колонки.
-
Добавьте колонку «Артикул»: разверните реквизит «Список», найдите там поле «Артикул» и перетащите его в таблицу.
-
Обновите конфигурацию базы данных и откройте список товаров: колонка с артикулами на месте.
-
Оставьте форму и колонку: дальше будем настраивать сам список.
Главное в одном абзаце
В своей форме списка динамический список живёт в основном реквизите — там же, где в карточке живёт «Объект», только тип у него другой, и потому форма говорит не об одной записи, а о множестве. Конструктор кладёт в форму сам список, таблицу с путём к нему, колонки по полям запроса и командную панель; колонок меньше, чем реквизитов у объекта, и нужные добавляют сами. Кнопки формы списка не записывают её, а работают с записями: создать, скопировать, пометить на удаление, найти, — список потом показывает новое. Иерархический справочник список показывает с вложенностью, и у групп своя форма. Назначают форму списка там же, где форму элемента, — в основных формах объекта, а пока своей нет, работает автоформа. В чужой форме списка читают тип основного реквизита, пути таблицы и колонок, командную панель и настройки списка — в них чаще всего и прячется то, что список показывает не всё.
Список показывает не всё, что есть в базе, и не только то, что хранится в записи: колонок бывает больше, строки отобраны, порядок задан. Где всё это настраивается?
Контрольные вопросы
- Где в своей форме списка живёт динамический список?
- Чем основной реквизит формы списка отличается от основного реквизита формы элемента?
- Что кладёт в форму конструктор формы списка?
- Почему колонок в списке меньше, чем реквизитов у объекта?
- Что делают кнопки формы списка и почему среди них нет записи?
- Как список показывает иерархический справочник?
- Где назначают форму списка основной?
Упражнения
По образцу. Создайте форму списка справочнику «Контрагенты», назначьте основной и добавьте колонку «ИНН».
Своё: предскажите состав. Не открывая конструктор, скажите, какие колонки он создаст для справочника «Склады» и почему.
Ловушка: «форму сделал, а список прежний». Разработчик собрал форму списка, добавил колонку, а в Предприятии колонки нет. Что он забыл?
Обратный ход. В чужой форме списка у основного реквизита тип «динамический список», а кнопки «Создать» нет — хотя у остальных форм она есть. Какие объяснения возможны?
На чтение. В форме списка две таблицы: у одной путь «Список», у другой — «ОтобранныеСтроки», без «Список.». Что за вторая таблица и где живут её строки?
Ответы — в конце части.
§ 6.6. Настройки списка: поля, отбор, порядок
Всё это настраивается в одном месте — в настройках самого динамического списка. Открываются они из его свойств, и решают там, какие поля доступны, какие строки показывать, в каком порядке и как их оформить.
1. Четыре настройки
Документация перечисляет их вместе, когда описывает динамический список: запрос, условное оформление, порядок, отбор и группировка. Для чтения формы хватает четырёх; группировка встречается реже и в нашей базе не понадобится.
| настройка | что решает | пример |
|---|---|---|
| поля | какие поля попадают из запроса в список и могут стать колонками | код, наименование, артикул |
| отбор | какие строки показывать | только не помеченные на удаление |
| порядок | в каком порядке | по наименованию |
| условное оформление | как строка выглядит | просроченные — красным |
Ни одна из четырёх не меняет содержимого базы: это правила показа, только заданные не у элемента, а у самого списка. Список задаёт набор строк и их порядок, а таблица их выводит.
Колонки решают, что показать из строки. Настройки списка решают, какие строки вообще будут и в каком порядке.
2. За списком стоит запрос
Проще всего увидеть настройки, если вспомнить, что за списком стоит запрос: список его выполняет и показывает результат. Вот примерно то, что получается, когда основная таблица — товары, отбор пуст, а порядок задан по наименованию:
ВЫБРАТЬ
Товары.Код,
Товары.Наименование,
Товары.Артикул
ИЗ
Справочник.Товары КАК Товары
УПОРЯДОЧИТЬ ПО
Товары.Наименование
Отбор разработчика платформа учитывает, выполняя запрос; порядок задаёт сортировку, поля решают, что вообще попадёт в выборку. Язык запросов в этой книге мы не разбираем: он весь в книге о запросах, а здесь важно одно — за списком стоит запрос, и настройки его уточняют.
3. Произвольный запрос
Когда стандартного запроса не хватает, у списка есть флажок произвольного запроса: с ним разработчик пишет текст сам.
| запрос строит платформа | произвольный запрос | |
|---|---|---|
| кто пишет | платформа по основной таблице | разработчик |
| когда нужно | почти всегда | когда нужны поля из других таблиц или расчёт |
| что читать в чужой форме | основную таблицу | текст запроса |
Читателю чужой формы это важно помнить: если у списка включён произвольный запрос, объяснение странных колонок или строк — в его тексте, а не в свойствах объекта.
4. Поля: откуда их больше, чем реквизитов
Колонок в списке может оказаться больше, чем реквизитов у справочника. Так бывает, когда запрос достаёт поля связанных записей — например, наименование единицы измерения, а не саму ссылку.
| колонка | откуда поле |
|---|---|
| Наименование | реквизит самой записи |
| Артикул | реквизит самой записи |
| ЕдиницаИзмерения | ссылка на другую запись |
| наименование единицы | поле связанной записи через запрос |
Отсюда правило чтения: увидели в списке колонку, которой нет среди реквизитов объекта, — ищите её в полях списка, а если и там нет, то в тексте произвольного запроса.
5. Настройки разработчика и настройки пользователя
Отбирать и сортировать умеет не только разработчик. Пользователь делает то же самое в открытом списке — мы говорили об этом, когда считали цену своей формы: часть претензий человек закрывает сам, не прося ничего у разработчика.
| кто настроил | где живёт | на кого действует |
|---|---|---|
| разработчик | в форме, в настройках списка | на всех |
| пользователь | в его пользовательских настройках | на него одного |
Обычно спорить они не могут: пользовательский отбор накладывается сверху и только сужает то, что уже отобрал разработчик. Но свой отбор разработчик может и вынести в пользовательские настройки — тогда человек вправе его ослабить или снять совсем.
Поэтому жалоба «у меня в списке нет этого товара» имеет два адреса: сначала смотрят настройки пользователя, потом настройки списка в форме.
6. Что это значит при чтении чужой формы
Три частые находки и куда с ними идти.
| что видно | где искать причину |
|---|---|
| список показывает не все записи | отбор в настройках списка или у пользователя |
| колонки, которых нет у объекта | поля списка или текст запроса |
| непривычный порядок строк | порядок в настройках списка |
Ни одна из причин не лежит в дереве объекта — все они в форме. Это и отличает разбор списка от разбора карточки: там мы шли от записи, здесь идём от запроса.
7. В Конфигураторе и в Предприятии
Настроим свой список и сравним с тем, что может сделать пользователь.
-
Откройте форму списка «Товаров» и найдите в свойствах реквизита «Список» настройки. Посмотрите, что задано сейчас.
-
Задайте порядок по наименованию. Обновите конфигурацию и откройте список: строки идут по алфавиту.
-
Поставьте отбор: показывать только товары, не помеченные на удаление. Проверьте в Предприятии.
-
В Предприятии добавьте свой отбор по артикулу и убедитесь, что он сужает список ещё сильнее. Снимите его.
-
Уберите отбор и порядок в Конфигураторе, оставив колонку «Артикул»: база серии должна остаться такой, какой мы её собрали.
Главное в одном абзаце
Что увидит пользователь в списке, решают настройки самого динамического списка: поля — какие данные доступны, отбор — какие строки показывать, порядок — в каком порядке, условное оформление — как строки выглядят. Ни одна из них не меняет базу: это правила показа, только заданные не у элемента, а у списка, потому что за списком стоит запрос, и настройки его уточняют. Когда стандартного запроса мало, включают произвольный, и тогда объяснение странных колонок и строк ищут в его тексте. Полей у списка бывает больше, чем реквизитов у объекта: запрос умеет доставать поля связанных записей. Отбирать и сортировать умеет и пользователь — его настройки живут отдельно и действуют только на него, складываясь с тем, что задал разработчик. Поэтому у жалобы «в списке нет нужной записи» два адреса: настройки пользователя и настройки списка в форме.
Списки мы разобрали со всех сторон: таблица, табличная часть, динамический список и его настройки. Осталось проверить это на форме, которую собирали не мы, — и заодно научиться с первого взгляда отличать одну таблицу от другой.
Контрольные вопросы
- Какие четыре настройки есть у динамического списка и что решает каждая?
- Почему эти настройки не меняют базу?
- Что такое произвольный запрос и когда он нужен?
- Откуда в списке берутся колонки, которых нет среди реквизитов объекта?
- Чем настройки пользователя отличаются от настроек разработчика?
- Пользователь говорит: «в списке нет нужного товара». Где искать причину и в каком порядке?
- Чем разбор формы списка отличается от разбора карточки?
Упражнения
По образцу. Задайте форме списка «Контрагентов» порядок по наименованию и проверьте в Предприятии.
Своё: сформулируйте отбор. Как бы вы настроили список товаров, чтобы кладовщик видел только товары одной группы? Где это задать — в форме или у пользователя, и почему.
Ловушка: «товар пропал из базы». Менеджер уверен, что товар удалили: в списке его нет. Что вы проверите первым делом?
Обратный ход. В списке товаров видна колонка «Единица» с наименованием единицы, хотя у товара хранится ссылка. Как это сделано?
На чтение. В чужой форме список показывает документы только за последний месяц, а в свойствах списка отбор пуст. Где искать причину?
Ответы — в конце части.
§ 6.7. Чужая форма: какие здесь таблицы и откуда у каждой строки
Откройте незнакомую форму и посмотрите на её таблицы: на экране они устроены одинаково — шапка, строки, кнопки сверху. А за ними может стоять что угодно: часть записи, данные формы или запрос к базе. Надёжно различить их на экране не выходит, зато в редакторе это дело двух взглядов — на путь таблицы и на тип реквизита, к которому этот путь ведёт.
1. Три ответа на один вопрос
Вопрос к каждой таблице один: откуда её строки. Ответов ровно три — те самые, что мы разбирали по очереди всю главу.
| откуда строки | что за реквизит | что с ними при закрытии без записи |
|---|---|---|
| из записи | табличная часть в основном реквизите | правки пропадают вместе с копией |
| из данных формы | таблица значений — реквизит формы | строки исчезают вместе с окном |
| из базы по запросу | динамический список | не пропадает ничего: строки — чужие записи |
Третья колонка — не просто следствие. Это самый быстрый способ проверить себя: если вы не можете сказать, что станет со строками при закрытии окна, вы ещё не определили тип таблицы.
Лицо таблицы плохо видно на экране. Надёжно оно читается в редакторе: путь и тип реквизита, к которому путь ведёт.
2. Первый взгляд: путь таблицы
Путь делит три случая надвое с первого взгляда — и делит по числу частей.
| путь таблицы | что это |
|---|---|
| две части: «Объект.Товары» | табличная часть записи |
| одно имя: «Остатки» | реквизит формы — таблица значений или список |
Первый случай закрыт: строки принадлежат записи и уходят в базу вместе с ней. Первая часть почти всегда «Объект» — основной реквизит; но если форма держит запись не только в нём, первой частью встанет имя того реквизита, а смысл не изменится: две части — значит, табличная часть какой-то записи.
Второй случай требует второго взгляда: одно имя говорит только о том, что это реквизит формы, а какой именно — решает тип.
3. Второй взгляд: тип реквизита
Имя из пути ищут в списке реквизитов формы и смотрят на его тип.
| тип реквизита | что за таблица | откуда строки |
|---|---|---|
| ДинамическийСписок | динамический список | запрос к базе |
| ТаблицаЗначений | таблица значений | их кладёт обработчик |
Двух взглядов почти всегда хватает, и порядок их стоит закрепить: путь находится за секунду, потому что таблица у вас уже выделена, а тип требует перейти в другой список и найти там строку. А чтобы не ошибиться на похожем случае, ответ перепроверяют по приметам.
4. Подтверждающие признаки
Тип определён, но у каждого вида таблиц есть приметы, по которым ответ полезно перепроверить — и которые сами по себе говорят о форме кое-что.
| примета | на что указывает |
|---|---|
| пути колонок из трёх частей — «Объект.Товары.Цена» | табличная часть |
| пути колонок — имя реквизита и поле: «Список.Наименование» | динамический список |
| у самого реквизита есть настройки — отбор, порядок, оформление | динамический список |
| строки есть, а вводить их негде и из записи они прийти не могут | их кладёт обработчик — таблица значений |
| кнопок добавления и удаления нет | ни о чём не говорит: так настраивают любую из трёх |
Четвёртая строка — самый частый способ узнать таблицу значений, не заглядывая в код: строки в ней есть, пользователю ввести их негде, а путь к записи не ведёт — значит, их принёс обработчик.
Последняя строка стоит здесь нарочно. Отсутствие кнопок говорит о том, что таблице запретили менять состав строк или убрали панель, — а это делают и с табличной частью, и с таблицей значений, и со списком.
5. Разбор на примере
Вот элементы чужой формы документа — с тремя таблицами сразу.
Форма
├── Шапка
│ ├── Номер, Дата
│ └── Контрагент, Склад
├── Страницы
│ ├── Товары
│ │ └── Товары
│ │ путь: Объект.Товары
│ ├── Остатки
│ │ └── Остатки
│ │ путь: ОстаткиНаСкладе
│ └── История
│ └── Поступления
│ путь: ПоступленияКонтрагента
Список реквизитов формы для той же формы:
Объект ← основной
ДокументОбъект.Реализация
ОстаткиНаСкладе
ТаблицаЗначений
ПоступленияКонтрагента
ДинамическийСписок
Дальше — два взгляда на каждую таблицу.
| таблица | путь | тип | откуда строки |
|---|---|---|---|
| Товары | Объект.Товары | — | из записи |
| Остатки | ОстаткиНаСкладе | ТаблицаЗначений | их кладёт обработчик |
| Поступления | ПоступленияКонтрагента | ДинамическийСписок | запрос к базе |
И сразу выводы, ради которых разбор и делается: правки в первой таблице уйдут в базу при записи документа; вторая пересчитывается обработчиком и в базу не попадает вовсе; третья показывает чужие документы, и «удалить» в ней означало бы удалить другую запись — потому кнопок там, скорее всего, и нет.
6. Четыре ловушки
На разобранном примере всё прозрачно; ошибаются обычно там, где смотреть в редактор кажется лишним.
Первая: считать таблицей всё, где есть строки. Колонка-флажок, группа колонок, страница с одной таблицей — всё это не таблицы. Таблица в структуре элементов одна, остальное лежит внутри неё.
Вторая: принять динамический список за табличную часть. Обе показывают строки, у обеих сверху кнопки — и именно поэтому ошибка так дорога: думаешь, что убираешь строку из документа, а на деле трогаешь другую запись базы. У табличной части кнопка удаления убирает строку из копии, и до записи в базе ничего не меняется. У списка такой кнопки чаще всего нет вовсе, а там, где она есть, это стандартная команда пометки на удаление — и действует она на запись.
Третья: решить, что список бывает только в форме списка. Динамический список живёт и дополнительным реквизитом — как «Поступления» в разборе выше. Тип реквизита это скажет, а расположение — нет.
Четвёртая: искать причину пустой таблицы в дереве объекта. Если строк нет, у каждого вида своя причина: у табличной части — их не вводили, у таблицы значений — обработчик не отработал или не вызывался, у списка — отбор. Три разных адреса, и путать их дорого.
7. Разбор по шагам
Пять шагов — и таблицы разобраны.
-
Пройдите структуру элементов сверху вниз и выпишите все таблицы, не пропуская вложенные в группы и страницы.
-
Для каждой запишите путь. Начинается с «Объект.» — табличная часть, вопрос закрыт.
-
Остальные найдите по имени в списке реквизитов формы и посмотрите тип.
-
Проверьте себя приметами: пути колонок, настройки у реквизита, есть ли кому вводить строки.
-
Для каждой таблицы скажите одной фразой, что станет со строками при закрытии окна без записи.
Пятый шаг и есть та быстрая проверка, с которой параграф начался. Три таблицы — три разные судьбы строк, и если на все три у вас выходит один ответ, возвращайтесь к шагам со второго по четвёртый: где-то в разборе ошибка.
Главное в одном абзаце
Таблицы на экране устроены одинаково, а строки у них приходят из трёх разных мест: из записи, из данных формы или из базы по запросу. Определяют это двумя взглядами: путь из двух частей — «Объект.Товары» — сразу говорит о табличной части записи, а путь из одного имени отправляет в список реквизитов формы, где тип и скажет, динамический список перед вами или таблица значений. Ответ перепроверяют приметами: пути колонок, настройки отбора и порядка у самого реквизита, некому ли вводить строки; а вот отсутствие кнопок над таблицей не говорит ни о чём — так настраивают любую из трёх. Ловушки — считать таблицей всё, где видны строки; принять список за табличную часть; думать, что список бывает только в форме списка; искать причину пустой таблицы не там, где она для этого вида. Проверка разбора простая: для каждой таблицы скажите, что станет со строками, если закрыть окно без записи, — у трёх видов ответы разные.
Формы мы прочитали целиком: реквизиты, поля, группы, страницы, таблицы. Всё это отвечает на вопрос «что показано». Но у формы есть и вторая половина — кнопки: записать, провести, закрыть, найти. Откуда они берутся и почему одни есть в каждой форме, а другие только в этой?
Контрольные вопросы
- Какие три источника строк бывают у таблицы и что станет со строками каждого вида при закрытии окна без записи?
- Что говорит путь таблицы из двух частей и что — путь из одного имени?
- О чём говорит отсутствие кнопок добавления и удаления над таблицей?
- По каким приметам узнают динамический список, не глядя на тип реквизита?
- Как обычно узнают таблицу значений в чужой форме?
- Чем опасно перепутать табличную часть и динамический список?
- Таблица пуста. Какие причины возможны у каждого из трёх видов?
Упражнения
По образцу. Разберите по двум взглядам все таблицы формы поступления, которую вы собирали, и формы списка «Товаров».
Своё: соберите три в одной. Опишите форму документа, в которой были бы все три вида таблиц сразу, и скажите, что показывала бы каждая.
Ловушка: «удалил строку — удалил запись». В форме две таблицы с кнопкой удаления: одна с путём «Объект.Товары», другая — с путём «Заявки», реквизит типа «динамический список». Что сделает кнопка в каждой?
Обратный ход. В форме есть таблица без единой кнопки, колонок в ней больше, чем реквизитов у объекта, а строки видны сразу при открытии. Что это за таблица и где искать, почему строк именно столько?
На чтение. В карточке контрагента таблица с путём «Долги»: строк в ней нет, хотя долги у контрагента есть. Назовите два возможных типа этой таблицы и для каждого — свою причину пустоты.
Ответы — в конце части.
Ответы к части 6
Ответы собраны здесь, а не под вопросами: подсказка, увиденная сразу после вопроса, отменяет попытку вспомнить. У каждого ответа до трёх ступеней: сам ответ, указание — если ответ не дался сразу — и полное решение там, где рассуждение важнее вывода.
§ 6.1. Таблица: элемент, который показывает строки
К вопросу 1. Ответ. Поле показывает одно значение, таблица — набор строк. Внутри таблицы лежат колонки, и у неё своя командная панель.
К вопросу 2. Ответ. К табличному реквизиту: табличной части записи, таблице значений формы или динамическому списку.
К вопросу 3. Ответ. Табличная часть — строки живут в записи и записываются вместе с ней; таблица значений — строки живут в данных формы, пока открыто окно; динамический список — строки платформа получает запросом к базе.
К вопросу 4. Ответ. Колонка — обычное поле, только живущее внутри таблицы: с видом, путём, видимостью, заголовком.
К вопросу 5. Указание. Что меняется, когда курсор переходит на другую строку?
Полное решение. Текущая строка — та, где стоит курсор; в каждый миг она одна. С ней работают стандартные кнопки таблицы, и от неё зависит всё, что в форме «меняется при переходе по строкам». Для чтения формы это ключ: если значение под таблицей меняется вслед за курсором, причина не в самом значении, а в текущей строке — и, как правило, в обработчике, который отзывается на её смену.
К вопросу 6. Ответ. Изменять состав строк, изменять порядок строк и только просмотр. Это удобство интерфейса, а не защита данных.
К вопросу 7. Ответ. Командная панель таблицы — своя группа внутри таблицы, её кнопки действуют на строки этой таблицы. Командная панель формы действует на всю запись.
К упражнению «По образцу». Ответ. Таблица — «Объект.Товары»; колонки — «Объект.Товары.Товар», «Объект.Товары.Количество», «Объект.Товары.Цена», «Объект.Товары.Сумма».
К упражнению «Своё: откуда строки». Ответ. Товары в реализации — табличная часть документа; остатки по складам — таблица значений в данных формы; список контрагентов — динамический список.
К упражнению «Ловушка: „удалил строку — значит, удалил товар"». Ответ. Строка поступления — не товар, а запись о нём внутри документа: в ней ссылка на товар, количество и цена. Удаление строки убирает эту запись из документа; товар в справочнике остаётся, как склад остаётся, когда очищают поле склада.
К упражнению «Обратный ход». Ответ. У таблицы запрещено изменение состава строк; командную панель таблицы скрыли или очистили; таблица только для просмотра — например, потому что её строки кладёт код.
К упражнению «На чтение». Ответ. В форме есть обработчик, отзывающийся на смену текущей строки, а надпись показывает что-то, относящееся к строке, где стоит курсор.
§ 6.2. Таблица из табличной части: товары в поступлении
К вопросу 1. Ответ. Внутри основного реквизита: путь «Объект.Товары».
К вопросу 2. Ответ. Перетаскиванием табличной части из реквизитов в элементы. Появляется таблица с колонками по реквизитам строки.
К вопросу 3. Ответ. Строки пришли копией вместе с шапкой, правятся в копии и попадают в базу только при записи документа.
К вопросу 4. Ответ. Нельзя: табличная часть — часть записи и записывается вместе с документом целиком.
К вопросу 5. Указание. Что именно складывает модуль объекта?
Полное решение. Сумму документа при записи складывает модуль объекта — из колонки «Сумма» по всем строкам. Сумму строки не считает никто: для этого нужен обработчик формы, а в наших формах их нет. Если поменять количество и записать, модуль сложит прежние суммы строк, и итог разойдётся с количествами. Правило объекта честно считает то, что ему дали; дать ему верные суммы строк — работа кода формы, а его в этой книге мы не пишем.
К вопросу 6. Ответ. Строки — исходные данные для проведения: код проведения обходит строки и по каждой увеличивает остаток товара на складе на её количество.
К вопросу 7. Ответ. Путь таблицы начинается с «Объект.»; пути колонок — «Объект.<Табличная часть>.<Реквизит>».
К упражнению «По образцу». Ответ. Как и с поступлением: после закрытия без записи строк столько же, сколько было.
К упражнению «Своё: предскажите итог». Ответ. Суммы строк останутся прежними — их никто не пересчитал. Сумма документа сложится из этих прежних сумм, то есть не изменится, хотя количества другие.
К упражнению «Ловушка: „строку добавил — значит, товар уже на складе"». Ответ. Строка живёт в копии, пока документ не записан, а остатки меняются только при проведении. Пока документ не записан и не проведён, на складе ничего не изменилось.
К упражнению «Обратный ход». Ответ. Реквизит «Скидка» хранится в каждой строке табличной части, только колонки для него в таблице нет — либо её не вывели, либо у неё снята видимость.
К упражнению «На чтение». Ответ. «Объект.Услуги» — табличная часть: строки часть записи, при закрытии без записи правки пропадут, а в базе останется прежнее. «ПодборУслуг» — таблица значений в данных формы: её строки при закрытии исчезнут совсем, в базе их и не было.
§ 6.3. Колонки таблицы: поля, которые показывают каждую строку
К вопросу 1. Ответ. «Объект» — запись документа, «Товары» — её табличная часть, «Цена» — реквизит строки.
К вопросу 2. Ответ. Колонка показывает реквизит каждой строки таблицы, а строки — это то, на что указывает путь таблицы. Путь колонки продолжает его на одно звено.
К вопросу 3. Ответ. Вид, видимость, доступность, «только просмотр», заголовок. Заголовок становится надписью в шапке таблицы.
К вопросу 4. Ответ. «Отображать в шапке», «Отображать в подвале», текст и путь к данным подвала, «Фиксация в таблице».
К вопросу 5. Ответ. Ничего: колонка — способ показать, реквизиты строк на месте и хранятся по-прежнему.
К вопросу 6. Указание. Кто тогда будет вводить значение?
Полное решение. «Только для просмотра» уместно, когда значение считает код: пользователь его видит, а меняет форма. В наших формах кода нет, и сумма строки вводится руками. Закройте её для правки — и вводить её станет некому: сумма останется той, какой была, а модуль объекта сложит эти застывшие суммы в итог документа. Запрещать правку стоит, только если значение кто-то считает.
К вопросу 7. Ответ. Реквизит строки живёт в табличной части объекта и один на все формы; колонка — элемент конкретной формы. Убрали реквизит — значения исчезли; убрали колонку — значения на месте, их не показывают.
К упражнению «По образцу». Ответ. «Объект.Товары.Товар», «Объект.Товары.Количество», «Объект.Товары.Цена», «Объект.Товары.Сумма» — и, если выведена, колонка номера строки.
К упражнению «Своё: закрепите главное». Ответ. «Фиксацию в таблице» у колонки товара — прижать её к левому краю.
К упражнению «Ловушка: „убрал колонку — пропали цены"». Ответ. Вернуть колонке видимость или посмотреть сумму документа: она складывается из строк и осталась прежней. Колонка — способ показать; цены лежат в строках документа и никуда не делись.
К упражнению «Обратный ход». Ответ. В подвале колонки: у таблицы включён подвал, а у колонки «Сумма» задан текст или путь к данным подвала — оттуда и число.
К упражнению «На чтение». Ответ. Пересчитывает сумму строки из количества и цены: пользователь меняет количество, код считает сумму, поэтому колонку суммы и закрыли для правки.
§ 6.4. Динамический список: таблица, которая показывает базу
К вопросу 1. Ответ. В базе: список их не хранит, а получает запросом. Строки табличной части живут в записи, строки таблицы значений — в данных формы.
К вопросу 2. Ответ. Таблица, главная в запросе, — например, справочник «Товары». По ней платформа сама строит запрос.
К вопросу 3. Ответ. Задают, что показывать, — основную таблицу, — а как достать строки, решает платформа, пока запрос не взяли в свои руки.
К вопросу 4. Указание. Сколько строк на самом деле приходит на клиент?
Полное решение. Запрос выполняется на сервере, а на клиент при включённом динамическом считывании уходит не вся таблица, а порция — то, что сейчас видно на экране. Прокрутил — пришла следующая. Поэтому размер базы почти не влияет на то, как быстро открывается список: пользователь всё равно видит два-три десятка строк.
К вопросу 5. Ответ. Записывать нечего: строки не лежат ни в записи, ни в форме. Правят записи, открывая их формы.
К вопросу 6. Ответ. Может: например, в карточке контрагента — дополнительный реквизит-список его поступлений.
К вопросу 7. Ответ. По типу реквизита формы, по пути таблицы — имени этого реквизита — и по путям колонок, начинающимся с него.
К упражнению «По образцу». Ответ. Новое наименование склада видно в списке после записи карточки; после возврата — снова «Основной».
К упражнению «Своё: где строки». Ответ. Товары в поступлении — в записи документа; список контрагентов — в базе, динамический список; остатки по складам — в данных формы; поступления в карточке контрагента — в базе, динамический список.
К упражнению «Ловушка: „отсортировал — испортил базу"». Ответ. Сортировка меняет только порядок показа строк в этом окне. Список ничего не хранит — товары в базе как лежали, так и лежат.
К упражнению «Обратный ход». Ответ. Динамический список. Строки в нём не правят — правят записи, открывая их формы двойным щелчком.
К упражнению «На чтение». Ответ. Таблица показывает результат запроса — скорее всего, товары на этом складе. Записывать её нечего: строки получены из базы, а не хранятся в складе.
§ 6.5. Форма списка: где живёт динамический список
К вопросу 1. Ответ. В основном реквизите формы — том, что выделен полужирным и назван «Список».
К вопросу 2. Ответ. Типом: у формы элемента это объект справочника, у формы списка — динамический список. Отсюда и разница: одна форма об одной записи, другая о множестве.
К вопросу 3. Ответ. Сам реквизит-список, таблицу с путём к нему, колонки по полям запроса и командную панель таблицы.
К вопросу 4. Ответ. Конструктор берёт поля, которые описывают запись коротко, — для справочника это код и наименование. Остальные колонки добавляют руками.
К вопросу 5. Указание. Что вообще можно записать в форме, которая ничего не хранит?
Полное решение. Кнопки списка работают не со списком, а с записями базы: создать, скопировать, пометить на удаление, найти. Записывать в такой форме нечего — строки ей не принадлежат, она их только показывает. Поэтому после любой из этих команд меняется запись в базе, а список просто показывает новое состояние.
К вопросу 6. Ответ. С вложенностью: группы и элементы вместе. Как именно — плоским списком, деревом или иерархическим списком — решает отображение таблицы.
К вопросу 7. Ответ. В окне редактирования объекта, в строках основных форм — там же, где форму элемента.
К упражнению «По образцу». Ответ. В форме появляются реквизит «Список», таблица и колонки кода и наименования; колонка ИНН добавляется перетаскиванием поля из раскрытого реквизита «Список».
К упражнению «Своё: предскажите состав». Ответ. Код и наименование: других реквизитов у складов нет, а эти два описывают запись коротко.
К упражнению «Ловушка: „форму сделал, а список прежний"». Ответ. Либо не обновил конфигурацию базы данных, либо не назначил форму основной — и открывается по-прежнему автоформа.
К упражнению «Обратный ход». Ответ. Команду убрали из командной панели; или у пользователя нет права добавлять записи; или список показывает данные, которые не создают из этой формы.
К упражнению «На чтение». Ответ. Вторая таблица — не динамический список, а реквизит формы: путь у неё без «Список.». Скорее всего, таблица значений, и строки её живут в данных формы, пока открыто окно.
§ 6.6. Настройки списка: поля, отбор, порядок
К вопросу 1. Ответ. Поля — что попадает из запроса в список и может стать колонкой; отбор — какие строки показывать; порядок — в каком порядке; условное оформление — как строки выглядят.
К вопросу 2. Ответ. Это правила показа: список по ним выбирает и сортирует строки, а содержимое базы остаётся прежним.
К вопросу 3. Ответ. Запрос, который разработчик пишет сам, включив соответствующий флажок. Нужен, когда стандартного запроса по основной таблице мало — например, требуются поля из других таблиц или расчёт.
К вопросу 4. Ответ. Из полей списка: запрос умеет доставать поля связанных записей. Если и там их нет — смотрите текст произвольного запроса.
К вопросу 5. Ответ. Настройки разработчика живут в форме и действуют на всех; настройки пользователя живут в его пользовательских настройках и действуют на него одного, только сужая уже отобранное.
К вопросу 6. Указание. Чья настройка сужает список последней?
Полное решение. Сначала смотрят настройки этого пользователя: скорее всего, он сам поставил отбор и забыл. Если там пусто — настройки списка в форме: отбор разработчика действует на всех. И только если и там ничего, ищут причину в данных: запись могли пометить на удаление или у пользователя нет прав её видеть.
К вопросу 7. Ответ. В карточке идут от записи, в списке — от запроса: почти все объяснения лежат не в дереве объекта, а в настройках списка.
К упражнению «По образцу». Ответ. После обновления конфигурации список контрагентов открывается упорядоченным по наименованию у всех пользователей.
К упражнению «Своё: сформулируйте отбор». Ответ. Отбор по родителю — группе товаров. В форме его задают, если так должно быть у всех; если это нужно одному кладовщику, пусть поставит себе сам в настройках списка.
К упражнению «Ловушка: „товар пропал из базы"». Ответ. Первым делом — настройки списка у этого пользователя: отбор и поиск. Потом отбор в форме. И только потом — пометка удаления и права.
К упражнению «Обратный ход». Ответ. Колонка показывает поле связанной записи: запрос списка достаёт наименование единицы по ссылке. Искать это в полях списка, а при произвольном запросе — в его тексте.
К упражнению «На чтение». Ответ. Либо у списка включён произвольный запрос и условие стоит в его тексте, либо отбор задан пользователю в его настройках.
§ 6.7. Чужая форма: какие здесь таблицы и откуда у каждой строки
К вопросу 1. Ответ. Строки приходят из записи (табличная часть) — при закрытии без записи правки пропадают вместе с копией; из данных формы (таблица значений) — исчезают вместе с окном; из базы по запросу (динамический список) — не пропадает ничего, это чужие записи.
К вопросу 2. Ответ. Путь из двух частей — табличная часть записи, почти всегда основного реквизита: «Объект.Товары». Путь из одного имени — реквизит формы, и какой именно, скажет его тип.
К вопросу 3. Ответ. О типе таблицы — ни о чём. Так настраивают любую из трёх: таблице запретили менять состав строк или убрали панель.
К вопросу 4. Ответ. По путям колонок, которые начинаются с имени списка, и по настройкам — отбору, порядку, оформлению — у самого реквизита.
К вопросу 5. Ответ. Строки в ней есть, а взяться им неоткуда: пользователю ввести их негде, путь к записи не ведёт. Значит, их положил обработчик.
К вопросу 6. Указание. Что произойдёт при нажатии кнопки удаления в каждом случае?
Полное решение. В табличной части удаление убирает строку из копии документа, и до записи в базе ничего не меняется. В динамическом списке такой кнопки чаще всего нет, а где есть — это стандартная команда пометки на удаление, и действует она на запись базы. Перепутав одно с другим, легко думать, что правишь свой документ, а на деле тронуть чужую запись.
К вопросу 7. Ответ. У табличной части строки не вводили; у таблицы значений обработчик не отработал или не вызывался; у списка стоит отбор — свой или пользовательский.
К упражнению «По образцу». Ответ. В форме поступления таблица одна, путь «Объект.Товары» — табличная часть. В форме списка «Товаров» таблица с путём «Список», реквизит типа «динамический список» — строки из базы по запросу.
К упражнению «Своё: соберите три в одной». Ответ. Например, форма реализации: товары документа — табличная часть; остатки по складу на дату — таблица значений, которую считает обработчик; прошлые отгрузки этому покупателю — динамический список.
К упражнению «Ловушка: „удалил строку — удалил запись"». Ответ. В первой кнопка уберёт строку из копии документа — до записи в базе ничего не изменится. Во второй стандартная команда пометит на удаление саму заявку, и это действие над записью базы, а не над строкой этой формы.
К упражнению «Обратный ход». Ответ. Судя по приметам — динамический список: колонки его, строки пришли запросом при открытии, кнопок нет, потому что записи создают не отсюда. Почему строк именно столько, смотрят в настройках списка: отбор, а при произвольном запросе — его текст.
К упражнению «На чтение». Ответ. Либо таблица значений — тогда обработчик не заполнил её: не отработал или его не вызвали. Либо динамический список — тогда строки отсечены отбором, своим или пользовательским. Что именно, скажет тип реквизита «Долги».
§ 7.1. Команда: действие, которое форма предлагает сделать
Откройте карточку товара и прочитайте, что написано на кнопках сверху: «Записать и закрыть», «Записать», «Ещё». Ни одной из них мы не задавали — форма собрана из полей и групп, про кнопки речи не было. И всё-таки они есть, и каждая что-то делает. Всё, что форма умеет делать, описано у неё отдельно от того, что она показывает, — списком команд.
1. Два списка у одной формы
У формы две стороны, и в редакторе у каждой свой список.
| сторона формы | о чём | где в редакторе |
|---|---|---|
| о чём разговор | данные и их показ | реквизиты и элементы |
| что можно сделать | действия | команды формы |
До сих пор мы читали только первую сторону: какие данные у формы есть, какими элементами они показаны, как сложены на экране. Вторая отвечает на другой вопрос — что человеку здесь разрешено сделать. Речь при этом о двух списках в редакторе, а не о частях окна: на экране команды покажутся кнопками среди прочих элементов.
Реквизиты и элементы говорят, о чём форма. Команды говорят, что в ней можно сделать.
2. Команда — описание действия, а не само действие
Команда — запись о действии: в ней и то, каким действие видит человек, и то, что платформа выполнит, когда его вызовут. Сама работа в команде не лежит. Свойства у неё такие.
| свойство | что задаёт |
|---|---|
| имя | как команду зовут внутри формы |
| заголовок | текст, который видит пользователь |
| подсказка | что всплывает при наведении |
| картинка | значок команды |
| сочетание клавиш | вызов с клавиатуры |
| действие | имя процедуры, которая выполнится |
Первые пять — про то, каким действие видит человек. Последнее — про то, что произойдёт: документация описывает его коротко, как имя процедуры-обработчика.
Отсюда пара, которую стоит запомнить: команда — это глагол формы, а строго — запись в списке команд, у которой есть заголовок для человека и действие для платформы. Заголовок команды становится подписью на кнопке — если у самой кнопки не задан свой.
3. Команда и кнопка — разные вещи
Саму команду на экране не видно. Видно её носителя — кнопку, элемент формы, стоящий в структуре среди полей и групп. Связывает их одно свойство кнопки: имя команды. Выглядеть носитель может по-разному — кнопкой командной панели, обычной кнопкой, гиперссылкой, — но это всё один вид элемента, и о его видах будет отдельный разговор.
команды формы
├── Записать
└── ОбновитьЦены
структура элементов
├── КоманднаяПанель
│ ├── кнопка → Записать
│ └── кнопка → ОбновитьЦены
└── поля
| команда | кнопка | |
|---|---|---|
| что это | описанное действие | элемент формы |
| где живёт | в списке команд формы | в структуре элементов |
| сколько | одна | сколько угодно на одну команду |
| видна ли | нет | да |
Одну и ту же команду может предлагать несколько кнопок: одна в командной панели, другая рядом с таблицей. И наоборот бывает пусто: команда есть, а кнопки нет, — тогда действие описано, но на экране его никто не предлагает. Исчезнуть команда от этого не исчезает: она остаётся в списке, и вызвать её может код.
Команда — что можно сделать. Кнопка — где это предложено. Кнопка без команды ничего не делает, команда без кнопки — действие, о котором человеку не сказали.
4. За командой стоит обработчик
Свойство «действие» указывает на процедуру: когда пользователь нажал кнопку, платформа вызывает её. Сам код в этой книге мы не пишем и не разбираем — но знать, что он там есть, обязательно.
| что видит пользователь | что за этим |
|---|---|
| вызвал команду — кнопкой или с клавиатуры | платформа нашла её описание |
| ждёт | выполняется процедура из свойства «действие» |
| видит результат | то, что сделала процедура |
Отсюда правило чтения, полезное с первого дня: если кнопка нажимается, а ничего не происходит, идти надо не в элементы, а в команду — и смотреть, на какую процедуру она указывает и есть ли в той процедуре хоть что-нибудь.
У стандартных команд платформы такого вопроса не возникает: что делает «Записать», знает сама платформа.
5. Команды, которых никто не задавал
Вернёмся к кнопкам из начала разговора. Мы их не заводили, а они есть — это та же автогенерация, что строила нам формы целиком.
| что мы задали | что получили |
|---|---|
| документ с реквизитами | команды записать, провести, закрыть |
| справочник | команды записать, закрыть |
| ничего сверх этого | кнопки для них в командной панели |
Приходят эти команды от объекта: платформа знает, что делают с записью справочника и с документом, и предлагает эти действия каждой их форме. Свои команды тоже бывают — и откуда берутся те и другие, разберём в следующем разговоре.
Но прежде чем заводить свои, стоит научиться читать чужие.
6. Что список команд говорит о чужой форме
Список команд — короткий ориентир: по нему быстро видно, ради каких действий форму чаще всего открывают. Прочитать его полезно раньше, чем разглядывать поля.
| что видно в списке | что это значит |
|---|---|
| только стандартные команды | форма для просмотра и правки записи |
| есть свои команды | форму открывают ради действий, а не только правок |
| команда без кнопки | действие описано, но не предложено — ищите, кто его вызывает |
| команда помечена как изменяющая сохраняемые данные | после неё форма считается изменённой |
Последняя строка — про свойство, которое так и называется: «изменяет сохраняемые данные». Документация говорит о нём просто: вызов такой команды ставит форме признак изменённости — тот самый, что появляется, когда пользователь правит поле. Отсюда и знакомое поведение: форма после такой команды спросит при закрытии, записывать ли. Подробнее — когда заведём свою команду.
7. В Конфигураторе и в Предприятии
Посмотрим на обе стороны формы — и убедимся, что кнопки берутся из команд.
- Откройте форму элемента «Товаров», которую собирали, и найдите список команд формы. Перепишите, что в нём есть.
-
Найдите в структуре элементов командную панель формы — верхний ряд кнопок — и сами кнопки. Для любой кнопки посмотрите, с какой командой она связана.
-
Откройте в Предприятии карточку любого товара и сверьте: у каждой кнопки сверху есть своя строка в списке команд.
-
Измените заголовок у одной команды — например, добавьте к нему точку. Обновите конфигурацию и посмотрите на кнопку: надпись изменилась.
-
Верните заголовок как был.
Главное в одном абзаце
У формы две стороны: реквизиты с элементами говорят, о чём она, а команды — что в ней можно сделать. Команда не выполняет работу, а описывает её: у неё есть имя, заголовок для человека, подсказка, картинка, сочетание клавиш и действие — имя процедуры, которая выполнится. Команду не видно; видно кнопку — элемент формы, связанный с командой своим свойством. Одну команду могут предлагать несколько кнопок, а может не предлагать ни одна: тогда действие описано, но не предложено. За каждой своей командой стоит обработчик, и если кнопка нажимается без всякого результата, причину ищут в команде, а не в элементах. Стандартные команды приходят от объекта: платформа знает, что делают с записью справочника и с документом, и предлагает эти действия сама. В чужой форме список команд читают раньше полей: он короткий и сразу говорит, ради чего эту форму открывают.
Команд в форме обычно несколько, и появились они по-разному: одни платформа завела сама, другие живут у объекта и достались всем его формам, третьи заведены прямо здесь. Как различить эти три источника и зачем читателю чужой формы это знать?
Контрольные вопросы
- Какие две стороны есть у формы и где каждая живёт в редакторе?
- Что описывает команда и какие у неё свойства?
- Чем команда отличается от кнопки и что их связывает?
- Может ли у одной команды быть несколько кнопок? А команда без кнопки?
- Что стоит за свойством «действие» и почему мы его в этой книге не открываем?
- Кнопка нажимается, а ничего не происходит. Где искать причину?
- Что можно понять о чужой форме по одному списку её команд?
Упражнения
По образцу. Повторите шаги практики на форме документа: выпишите команды формы поступления и для каждой найдите кнопку в структуре элементов.
Своё: назовите глаголы. Для формы, где кладовщик отмечает приёмку товара, перечислите действия, которые ей понадобятся. Пока только словами.
Ловушка: «удалил кнопку — удалил действие». Разработчик убрал кнопку из командной панели и уверен, что команды больше нет. В чём он ошибается и как проверить?
Обратный ход. В чужой форме есть команда «Пересчитать», а кнопки с таким заголовком нет. Какие объяснения возможны?
На чтение. В списке команд чужой формы шесть строк, из них четыре — стандартные. Что вы скажете об этой форме, не открывая ни одного поля?
Ответы — в конце части.
§ 7.2. Три источника команд: платформа, объект, форма
Откройте в редакторе формы поступления список команд и посмотрите, как он устроен: команд там больше, чем кнопок на экране, и лежат они не одной кучей. Список разбит на разделы. Первый — стандартные: то, что платформа добавила сама. Второй — глобальные: туда попадают команды объектов и общие. Третий — собственные команды формы: то, что завели прямо здесь. Эти разделы и отвечают на вопрос, откуда команда взялась, — а с ним и на вопрос, где искать, что она делает.
1. Три источника в одной таблице
| источник | кто завёл | где живёт | в каких формах | где то, что она делает |
|---|---|---|---|---|
| стандартные | платформа | в платформе: выводятся из вида объекта | во всех формах такого вида | в самой платформе |
| команды объекта | разработчик | в дереве, у объекта | во всех подходящих формах | в модуле команды |
| команды формы | разработчик | в этой форме | только в ней | в модуле формы |
Последняя колонка — главная для читателя чужой формы. Команда, которая ведёт себя странно, отправляет искать причину в одно из трёх разных мест, и перепутать их — значит час читать не тот код.
Источник команды — адрес, по которому идут за объяснением: у стандартной объяснение встроено в платформу, у команды объекта — в модуле команды, у команды формы — в модуле формы.
Развернём таблицу по строкам и начнём с тех команд, которые никто не заводил.
2. Стандартные: глаголы, которые платформа знает сама
Стандартные команды никто не заводит — платформа выводит их из того, с чем форма работает. Документация приводит в пример «Записать» и «Закрыть».
| с чем работает форма | какие глаголы добавляет платформа |
|---|---|
| с записью справочника | записать, закрыть |
| с документом | записать, провести, закрыть |
| с таблицей на форме | добавить строку, удалить, передвинуть |
Набор зависит от вида объекта: у формы обработки, например, записывать нечего, и команды записи у неё нет.
Последняя строка таблицы удивляет чаще всего: стандартные команды бывают не только у формы, но и у элементов. Таблица на форме добавляет стандартные команды таблицы, а кнопки над ней, о которых шла речь в разговоре о таблицах, — лишь их носители: их можно спрятать, а команды останутся.
Это прямое продолжение декларативности. Мы задали, что форма работает с документом, — и платформа сама знает, что документ записывают и проводят. Описывать эти действия не нужно: что делает «Записать», решает платформа. Показывать ли для команды кнопку, решает разработчик в форме; а вмешаться в само действие можно только кодом — это уже за границей книги.
Теперь — команды, которые заводят у объекта.
3. Команды объекта: живут в дереве, работают в формах
Второй источник — команды, которые разработчик заводит у самого объекта: у справочника или документа в дереве конфигурации есть для них своя ветка. Такая команда принадлежит объекту, а не форме, и поэтому попадает во все формы, где она к месту.
Что значит «к месту», решает её параметр. У команды объекта есть свойство «тип параметра», и документация прямо говорит: оно имеет смысл только для команд, размещаемых в формах. Этим свойством команда и выбирает формы: если тип параметра — ссылка на товар, редактор предложит её в любой форме, где есть реквизит такого типа. Если таких реквизитов несколько, нужный выбирают, когда ставят команду в форму.
| что задал разработчик | что получилось |
|---|---|
| у «Товаров» команда с параметром «ссылка на товар» | она доступна в формах, где есть товар |
| у той же команды — группа размещения | в какую панель формы она встанет |
В редакторе формы такие команды лежат на закладке глобальных, и разделов там два. В параметризуемых — те, у которых задан тип параметра: документация собирает здесь команды, «тип параметра которых совпадает с типом реквизита формы». В независимых — команды без параметра, например открыть список.
Главное для чтения — где их код. У команды объекта свой модуль, модуль команды, и обработчик лежит в нём. В модуле формы искать его бесполезно — хотя сам обработчик, конечно, может обращаться к другим модулям.
Родственник этого источника — общие команды: их заводят не у объекта, а в общей ветке конфигурации. Отдельно разбирать их не будем: для чтения формы правила те же — глобальный раздел в редакторе и свой модуль команды.
4. Команды формы: живут только здесь
Третий источник — команды, заведённые прямо в форме. Их список — на закладке команд формы, и документация называет их «собственно командами формы».
| команда объекта | команда формы | |
|---|---|---|
| где заведена | у объекта в дереве | в форме |
| в каких формах | во всех подходящих | только в этой |
| где код | модуль команды | модуль формы |
| если поменять | изменится везде | изменится только здесь |
Отсюда и выбор, который делает разработчик. Действие нужно в одной форме — заводят команду формы. Нужно везде, где встречается товар, — команду объекта: одна правка, и все формы получают её сразу.
5. Зачем читателю знать источник
Три источника — три разных ответа на вопросы, которые возникают при чтении чужой формы.
| вопрос | стандартная | объекта | формы |
|---|---|---|---|
| где смотреть, что делает | нигде: знает платформа | модуль команды | модуль формы |
| есть ли она в других формах | во всех такого вида | во всех подходящих | нет |
| можно ли убрать из формы | только кнопку | только кнопку | саму команду |
Последняя строка — ловушка для торопливых. Стандартную команду или команду объекта нельзя удалить из одной формы: они не её. Можно лишь не показывать кнопку. А вот команду формы удаляют вместе с кнопками — и тогда действие пропадает по-настоящему.
6. Как узнать источник в чужой форме
Узнают по кнопке: у неё есть свойство с именем команды, и это имя часто подсказывает, откуда команда пришла.
| что видно в имени команды | источник |
|---|---|
| команда из раздела стандартных | платформа |
| имя объекта конфигурации в начале | команда объекта или общая |
| имя из списка команд формы | форма |
Если по имени сразу не ясно, второй шаг простой: найти команду в редакторе. В каком разделе нашлась — тот и источник. А за кодом идут туда, куда указывает последняя колонка таблицы из начала разговора.
7. В Конфигураторе
Разберём по источникам команды формы поступления — только смотрим, ничего не меняем.
- Откройте форму поступления и её список команд. Найдите раздел стандартных: перепишите, какие глаголы платформа дала документу.
-
Перейдите к глобальным командам. Посмотрите раздел независимых и раздел параметризуемых: что там есть и какой у них тип параметра.
-
Найдите в дереве конфигурации документ «ПоступлениеТоваров» и его ветку команд. В «Канцтоварах» она пуста: команд объекта мы не заводили.
-
Вернитесь к форме и посмотрите собственные команды формы — список тоже пуст или почти пуст.
-
Для каждой кнопки командной панели формы определите источник её команды — по имени команды в свойствах кнопки.
Итог опыта: все кнопки нашей формы пришли от платформы. Свою команду мы заведём позже — и тогда в списке собственных команд формы появится первая строка.
Главное в одном абзаце
Команды приходят в форму из трёх источников, и в редакторе у каждого свой раздел. Стандартные никто не заводит: платформа выводит их из того, с чем работает форма, — у документа записать и провести, у таблицы добавить и удалить; что они делают, знает сама платформа. Команды объекта заводит разработчик в дереве конфигурации, и благодаря типу параметра они попадают во все формы, где к месту, — а код у них в модуле команды, не в модуле формы. Команды формы заведены прямо в ней, живут только в ней, и код их в модуле формы. Источник команды — адрес, по которому идут за объяснением: он говорит, где искать код, есть ли команда в других формах и можно ли убрать её из этой. Узнают источник по имени команды у кнопки, а если оно не подсказывает — по разделу редактора, где команда нашлась.
Команда — действие, но пользователь нажимает не на неё. Он нажимает на кнопку, а у кнопки свои свойства: вид, подпись, место. Как кнопка связывается с командой и что будет, если связь оборвать?
Контрольные вопросы
- Назовите три источника команд и скажите, где в каждом случае лежит то, что команда делает.
- Откуда берутся стандартные команды и кто решает, что они делают?
- Почему команда таблицы на форме тоже считается стандартной?
- Как команда объекта попадает в форму и при чём здесь тип её параметра?
- Где искать код команды объекта и почему его нет в модуле формы?
- Какую команду можно удалить из формы, а у какой можно только спрятать кнопку?
- Как по кнопке узнать источник её команды?
Упражнения
По образцу. Разберите по источникам команды формы элемента «Товаров»: какие стандартные, есть ли глобальные, есть ли собственные.
Своё: куда завести. Нужна команда «Распечатать ценник». Она должна быть и в карточке товара, и в строке поступления. Команду формы или команду объекта вы заведёте и почему?
Ловушка: «удалил команду — пропала везде». Разработчик убрал из формы кнопку команды объекта и уверен, что команды в конфигурации больше нет. Что он на самом деле сделал?
Обратный ход. Кнопка в чужой форме что-то делает, но в модуле формы нет ни одной процедуры с похожим именем. Где искать?
На чтение. В форме документа три кнопки: «Провести», «Заполнить по заказу», «Отправить поставщику». О последних двух ничего не известно. Какие предположения об их источнике вы сделаете и как проверите?
Ответы — в конце части.
§ 7.3. Кнопка: элемент, который предлагает команду
Выделите в структуре элементов карточки товара кнопку «Записать» и посмотрите на её свойства. У неё есть вид, заголовок, картинка, видимость — всё как у обычного элемента. И есть одно свойство, которого нет ни у поля, ни у группы: имя команды. Через него кнопка и получает смысл — сама по себе она ничего не умеет, она только предлагает команду.
1. Кнопка для команды — что поле для реквизита
С кнопкой мы уже знакомы: это один из пяти видов элементов формы. Теперь видно, на кого она похожа больше всего.
| поле | кнопка | |
|---|---|---|
| что показывает или предлагает | реквизит | команду |
| чем связано | путь к данным | имя команды |
| сколько на одно | сколько угодно полей на реквизит | сколько угодно кнопок на команду |
| что без него | реквизит есть, но не показан | команда есть, но не предложена |
Параллель не случайна. Реквизит — данные, поле — их показ; команда — действие, кнопка — его предложение. И то и другое держит одна и та же граница: элемент лишь выводит на экран то, что описано в другом месте.
Поле показывает реквизит, кнопка предлагает команду. Уберёте поле — реквизит останется; уберёте кнопку — команда останется.
Строже: кнопка — элемент формы, у которого в свойствах задано имя команды; всё, что происходит при нажатии, описано в этой команде.
2. Как кнопка появляется в форме
Жест тот же, что с полями: перетащить. Документация редактора так и описывает: команды добавляются на форму перетаскиванием из списка команд в структуру элементов.
| что перетащили | что появилось |
|---|---|
| реквизит в структуру | поле, связанное с реквизитом |
| команду в структуру | кнопка, связанная с командой |
Кнопку можно добавить и пустой, через добавление элемента, а команду выбрать потом в её свойствах. Но так или иначе у кнопки, которая что-то делает, свойство с именем команды заполнено.
3. Вид кнопки зависит от места
Видов у кнопки четыре, и какие из них доступны, решает то, где кнопка стоит. Документация ставит это условием прямо в описании каждого вида: обычная кнопка и гиперссылка «недоступны для кнопок, расположенных в командной панели», а два других вида — только для таких кнопок. Командная панель — собственная панель кнопок формы или таблицы; как она устроена, разберём сразу после кнопок.
| где стоит кнопка | какие виды доступны |
|---|---|
| в командной панели | кнопка командной панели, гиперссылка командной панели |
| в любом другом месте формы | обычная кнопка, гиперссылка |
Отсюда простое правило чтения: вид кнопки сразу говорит, где она стоит. Кнопка командной панели не бывает среди полей, обычная кнопка не бывает в панели.
А ещё у кнопки есть свойство отображения — только текст, только картинка или то и другое. Это решение о показе, и на команду оно не влияет.
4. Что кнопка решает сама
Кнопка отвечает за то, как и где команда предложена. Всё, что относится к самому действию, — у команды.
| свойство кнопки | что решает |
|---|---|
| вид | кнопка или гиперссылка |
| отображение | текст, картинка или оба |
| положение в командной панели | в панели, в меню «Ещё», там и там или автоматически |
| кнопка по умолчанию | срабатывает ли по клавише ввода |
| видимость, доступность | видна ли и можно ли нажать |
Положение в командной панели имеет смысл только для кнопок, которые в ней стоят. Значений у него четыре.
| положение | где кнопка |
|---|---|
| в командной панели | на виду, в самой панели |
| в дополнительном подменю | только в меню «Ещё» |
| в панели и в подменю | и там и там |
| авто | решает платформа |
Второе значение стоит запомнить: кнопка в меню «Ещё» есть — просто её не видно, пока меню не раскрыли.
Доступность у кнопки — то же, что у поля: удобство, а не защита. Выключенная кнопка не запрещает действие — она лишь не даёт нажать именно её. Если та же команда предложена где-то ещё, там она сработает. А если это единственная её кнопка на форме, действие здесь недоступно, но не запрещено: команда на месте, и защищают от неё права пользователя, а не свойства кнопки.
5. Когда связь обрывается
Связь между кнопкой и командой держится на одном свойстве, и порваться она может с обеих сторон.
| что случилось | что получилось |
|---|---|
| у команды нет кнопки | действие описано, но не предложено — это допустимо |
| у кнопки пустое имя команды | кнопка есть, но нажатие ничего не делает |
| команду удалили из формы | её кнопкам больше нечего предлагать |
Первая строка — нормальное состояние: команда может ждать своей кнопки или вызываться иначе — например, кодом. Две другие — бесполезные кнопки: своих действий у кнопки нет, всё её поведение приходит от команды. В чужой форме такая кнопка — чаще всего недоделка: её поставили под команду, которую так и не завели или потом удалили.
6. Что читать у кнопки в чужой форме
К каждой кнопке — четыре вопроса, и три из них решаются по её свойствам.
| вопрос | где ответ |
|---|---|
| какую команду предлагает | имя команды |
| откуда эта команда | раздел редактора команд, где она лежит, — как в разговоре об источниках |
| где её видно | место в структуре и положение в панели |
| можно ли нажать | видимость и доступность |
Две ловушки здесь встречаются чаще других. Первая: «кнопки нет — значит, действия нет». Кнопка может лежать в меню «Ещё» или быть скрытой, а команда — предлагаться другой кнопкой в другом месте. Вторая: «кнопка выключена — значит, действие запрещено». Выключена одна кнопка, а не команда, и тем более не право.
7. В Конфигураторе и в Предприятии
Добавим кнопку сами — и убедимся, что одна команда может иметь двух носителей.
- Откройте форму элемента «Товаров». Найдите в списке команд стандартную команду «Записать» и перетащите её в структуру — в группу «Учёт», после полей.
-
Посмотрите свойства новой кнопки: её вид и имя команды. Сравните с кнопкой «Записать» в командной панели.
-
У кнопки «Записать» в командной панели поставьте положение — только в меню «Ещё».
-
Обновите конфигурацию и откройте карточку товара. Сверху «Записать» больше нет, в «Ещё» она есть, а в группе «Учёт», рядом с артикулом и единицей, — ваша кнопка. Поменяйте артикул и нажмите её: запись сработала — команда та же.
-
Верните артикул, удалите свою кнопку и верните кнопке в панели прежнее положение.
Главное в одном абзаце
Кнопка — элемент формы, который предлагает команду: для команды она то же, что поле для реквизита. Связывает их одно свойство кнопки — имя команды, а появляется кнопка тем же жестом, что поле, — перетаскиванием команды в структуру. Видов у кнопки четыре, и место решает, какие доступны: в командной панели — кнопка и гиперссылка командной панели, вне её — обычная кнопка и гиперссылка. Кнопка отвечает за «как и где предложено»: вид, отображение, положение в панели, срабатывание по клавише ввода, видимость и доступность; что произойдёт — решает команда. Команда без кнопки — нормальное состояние, кнопка без команды бесполезна: своих действий у неё нет. В чужой форме у кнопки читают команду и её источник, место и доступность — и помнят две ловушки: кнопки не видно ещё не значит, что действия нет, а выключенная кнопка — не запрет.
Кнопки собираются не россыпью: сверху у формы своя панель, над таблицей — своя, а часть кнопок прячется в «Ещё». Как устроены командные панели и почему одна и та же кнопка может оказаться в разных местах?
Контрольные вопросы
- Чем кнопка похожа на поле и чем отличается?
- Каким свойством кнопка связана с командой?
- Каким жестом кнопку добавляют в форму?
- Какие четыре вида бывают у кнопки и от чего зависит, какие доступны?
- Что кнопка решает сама, а что — команда?
- Почему кнопка с пустым именем команды бесполезна, а команда без кнопки — нормальное состояние?
- Почему выключенная кнопка — не запрет действия?
Упражнения
По образцу. Добавьте в форму поступления обычную кнопку для команды «Провести» рядом с полем «Склад». Проверьте в Предприятии и уберите.
Своё: спрячьте лишнее. В командной панели карточки товара пять кнопок, а кладовщик пользуется двумя. Как оставить на виду две, не удаляя остальные?
Ловушка: «выключил кнопку — запретил». Разработчик сделал недоступной кнопку «Провести» в командной панели и уверен, что провести документ из формы больше нельзя. Что он упустил?
Обратный ход. В форме две кнопки «Записать»: одна в панели, другая внизу формы. Сколько команд за ними и как это проверить?
На чтение. В чужой форме кнопка «Пересчитать» стоит среди полей и выглядит как гиперссылка. Что вы можете сказать о её месте в структуре и о её виде, не открывая свойств?
Ответы — в конце части.
§ 7.4. Командная панель: где собираются кнопки
Откройте в Предприятии поступление № 12 и найдите на нём все места, где есть кнопки. Ряд наверху формы. Ряд над таблицей товаров. Меню «Ещё» в каждом из рядов. И меню, которое выпадает, если щёлкнуть по строке правой кнопкой. Мест четыре, а устройство у них одно: всё это группы, только собирают они не поля, а кнопки. Меню «Ещё» среди них особое — его панель заводит сама.
1. Панель — это группа
Командная панель — не новый вид элемента, а группа, только другого вида, чем «Учёт» или страницы. Среди видов групп документация называет четыре, созданные для кнопок, — им и соответствуют места на экране.
| вид группы | что это | что может содержать |
|---|---|---|
| командная панель | ряд кнопок | кнопки, подменю, группы кнопок |
| подменю | выпадающий список кнопок | кнопки, подменю, группы кнопок |
| группа кнопок | несколько кнопок рядом | кнопки, подменю, группы кнопок |
| контекстное меню | меню по правой кнопке | кнопки, подменю, группы кнопок |
Кнопку может держать и обычная группа — так мы и ставили «Записать» в «Учёт». Но четыре вида из таблицы кнопочные: ничего, кроме кнопок и таких же групп, в них не кладут.
Поэтому основное, что мы знаем о группах, работает и здесь: у панели есть видимость, в ней есть порядок, её можно разобрать на части. А строгая пара к «ряду кнопок» — вид группы «командная панель» в свойствах группы.
Командная панель — полка для кнопок с выдвижным ящиком «Ещё». Строго — группа формы вида «командная панель».
2. Панель формы: автоматическая
Главная панель формы — та, что сверху. Документация называет её автоматической командной панелью формы: платформа сама кладёт в неё кнопки стандартных команд, и мы видели это в каждой автоформе.
| что задано | что получилось |
|---|---|
| ничего | панель со стандартными кнопками наверху |
| положение панели — внизу | та же панель под формой |
| положение панели — нет | панели нет вовсе |
Не спутайте два похожих свойства: у кнопки — «положение в командной панели» (в панели, в «Ещё», там и там или авто), у формы — «положение командной панели», и оно о самой панели.
Положений у панели формы четыре: авто, верх, низ и «нет». Задаются они в свойстве самой формы — положении командной панели, — а не у панели: панель автоматическая, её заводит форма, форма и решает, где ей стоять.
3. Панель таблицы: у каждой своя
Каждая таблица на форме получает свою автоматическую панель — с теми кнопками, что мы видели над товарами: добавить, удалить, передвинуть. Положений у неё те же четыре, только считаются они относительно таблицы.
| чья панель | где задаётся положение | на что действуют кнопки |
|---|---|---|
| формы | в свойствах формы | на всю форму: записать, провести |
| таблицы | в свойствах таблицы | на строки этой таблицы |
У таблицы есть и второе место для кнопок — контекстное меню. Это тоже группа, и предлагает она действия со строкой. Совпадает ли её состав с панелью, зависит от формы — их стоит сравнить глазами. Панель видна, если её не выключили, меню — по правой кнопке.
4. Меню «Ещё» и порядок внутри панели
У командной панели есть меню «Ещё» — дополнительное подменю. Туда попадают кнопки, которым так задано положение, а при положении «авто» — те, что платформа сочтёт нужным убрать с виду. Значения положения мы разбирали в прошлом разговоре: только в панели, только в «Ещё», там и там или авто.
Внутри панели разработчик наводит порядок теми же группами:
| что нужно | чем делается |
|---|---|
| собрать редкие команды в одно меню | подменю |
| поставить несколько кнопок рядом, отдельным блоком | группа кнопок |
Для чтения это значит одно: кнопку, которую не видно на панели, ищут в трёх местах — в меню «Ещё», в подменю этой панели и в контекстном меню.
5. Своя панель в любом месте формы
Автоматические панели есть у формы и у каждой таблицы. Но панель можно поставить и самому: документация разрешает обычной группе содержать группу вида «командная панель». Значит, ряд кнопок может стоять везде, куда можно поставить обычную группу, — например, под полями, рядом с итогом. Положения «авто, верх, низ, нет» у такой панели нет: она стоит там, где её поставили в структуре.
Форма
├── КоманднаяПанель ← автоматическая
├── Шапка
├── Товары ← таблица,
│ своя панель
└── Итоги ← обычная группа
├── СуммаДокумента
└── ПанельИтогов ← своя панель
└── кнопка
В чужой форме такая панель — знак, что автор хотел держать действие рядом с данными, к которым оно относится. Кнопка «Пересчитать» у итога понятнее, чем та же кнопка наверху среди «Записать» и «Провести».
6. Почему одна кнопка бывает в разных местах
Теперь ответ складывается из двух уже известных правил.
| что видим | как это устроено |
|---|---|
| одно действие наверху и над таблицей | одна команда, две кнопки в разных панелях |
| кнопка и на панели, и в «Ещё» | одна кнопка с положением «там и там» |
| действие на панели и в контекстном меню | одна команда, кнопки в разных группах |
Всё сводится к тому, что кнопок на одну команду может быть сколько угодно, а панелей на форме — несколько. Поэтому в чужой форме полезно пройти все панели разом и выписать, какая команда где предложена: иначе одно действие легко посчитать тремя.
7. В Конфигураторе и в Предприятии
Проверим это на форме: передвинем панель таблицы и посмотрим, как меняется экран.
- Откройте форму поступления и найдите в структуре элементов обе автоматические панели: формы и таблицы товаров.
-
У таблицы товаров поставьте положение командной панели — внизу.
-
Обновите конфигурацию и откройте поступление № 12: кнопки добавления и удаления строк теперь под таблицей.
-
Щёлкните по строке правой кнопкой и сравните контекстное меню с кнопками панели.
-
Верните положение панели таблицы как было.
Главное в одном абзаце
Командная панель — не новый элемент, а группа вида «командная панель», и всё известное о группах работает и здесь. Кнопки живут в четырёх видах групп: командной панели, подменю, группе кнопок и контекстном меню. Автоматические панели бывают двух родов: панель формы, которую платформа наполняет стандартными командами, и своя панель у каждой таблицы, чьи кнопки действуют на её строки; положение у обеих — авто, верх, низ или «нет», и задаётся оно в свойствах формы или таблицы. Кнопки, которым нет места на виду, уходят в меню «Ещё»; порядок внутри панели наводят подменю и группами кнопок. Свою панель можно поставить в любую обычную группу — рядом с данными, к которым относится действие. Одна команда встречается в разных местах потому, что кнопок на неё может быть сколько угодно, а панелей несколько; в чужой форме их проходят разом.
Все кнопки, которые мы до сих пор видели, предлагают команды, заведённые не нами: платформой или объектом. Пора завести свою. Что для этого нужно и что появится в форме, если код обработчика оставить пустым?
Контрольные вопросы
- Почему командная панель — это группа, а не отдельный вид элемента?
- Какие четыре вида групп содержат кнопки?
- Чем панель формы отличается от панели таблицы?
- Какие положения бывают у автоматической панели и где их задают?
- Где искать кнопку, которой не видно на панели?
- Зачем ставить свою командную панель в обычную группу?
- Почему одно действие может встретиться в форме в трёх местах?
Упражнения
По образцу. Поставьте командной панели формы поступления положение — внизу. Посмотрите в Предприятии и верните.
Своё: соберите редкое. В панели карточки товара восемь кнопок, из них три нужны раз в месяц. Как собрать их в одно место, не убирая с панели совсем?
Ловушка: «над таблицей пусто — строки не добавить». У таблицы в чужой форме нет панели сверху, и коллега решает, что строки добавлять нельзя. Что стоит проверить?
Обратный ход. В форме кнопка «Пересчитать» стоит под таблицей, рядом с полем итога, а в командной панели формы её нет. Как это, скорее всего, устроено в структуре?
На чтение. В чужой форме у таблицы положение командной панели — «нет», а кнопки добавления строк всё равно есть: прямо над таблицей в обычной группе стоит своя командная панель. Что сделал автор и зачем?
Ответы — в конце части.
§ 7.5. Своя команда формы: «Обновить цены»
Цены товаров в «Канцтоварах» живут не в карточке, а в регистре «ЦеныТоваров»: их меняет приказ об изменении цен. Кладовщику, который смотрит на карточку, пригодилось бы действие «подтянуть последние цены этого товара». Ни платформа, ни объект такого действия не знают, — значит, это работа для третьего источника: команды, заведённой прямо в форме. Заведём её и доведём до кнопки, а код оставим пустым.
1. Четыре шага от замысла до кнопки
Своя команда появляется в форме за четыре шага, и каждый ложится на одно из свойств, которые мы уже разбирали.
| шаг | где | что задаём |
|---|---|---|
| завести | список команд формы, закладка собственных команд | новая строка |
| назвать | свойства команды | имя и заголовок |
| связать с процедурой | свойство «действие» | обработчик-заглушка |
| предложить | структура элементов | кнопка в командной панели |
Первые три шага описывают действие, четвёртый его предлагает. Команда без четвёртого шага уже есть — строкой в списке собственных команд формы, — просто кнопкой её пользователю не показали. Начнём с того, как её назвать.
2. Имя для платформы, заголовок для человека
У новой команды два имени, и они служат разным читателям.
| свойство | значение | кто читает |
|---|---|---|
| имя | ОбновитьЦены | платформа и код |
| заголовок | Обновить цены | пользователь, на кнопке |
Имя пишут слитно, без пробелов, как всё, что читает платформа. Заголовок — обычными словами: его увидит кладовщик. Если заголовок оставить пустым, на кнопке окажется что-то собранное из имени, — лучше не полагаться на это и написать его самим.
3. Действие и пустой обработчик
Третий шаг — связать команду с процедурой. В свойстве «действие» есть кнопка создания обработчика: редактор сам заведёт в модуле формы процедуру и запишет её имя в это свойство.
Перед тем как создать процедуру, редактор спросит, где ей работать. Документация редактора перечисляет три варианта: создать на клиенте; на клиенте и процедуру на сервере; на клиенте и процедуру на сервере без контекста. Все три начинаются с клиента. Это прямое следствие принципа клиента и сервера: кнопку нажимают у пользователя, значит, и обработчик команды начинает работу там же. Выбираем первый, самый простой вариант, — почему бывают другие, расскажет книга о коде.
| что сделал редактор | где это видно |
|---|---|
| завёл процедуру | модуль формы, открылся сам |
| вписал её имя в команду | свойство «действие» |
| тело процедуры | пустое |
Команда хранит только имя процедуры — в свойстве «действие». Сама процедура живёт отдельно, в модуле формы. Удалите процедуру — команда и её кнопки останутся, а свойство будет указывать на имя, которого в модуле больше нет: нажимать есть что, а вызывать нечего.
Здесь мы останавливаемся: процедура остаётся пустой. Что в неё написать, чтобы цены действительно подтянулись из регистра, — это язык 1С, и он за рамками разговора о чтении форм. Нам важно другое: связь «команда — процедура» появилась, и её видно в свойствах команды без единой строки кода.
Команда знает имя процедуры, которую надо позвать. Что процедура сделает, не знает ни команда, ни форма: это дело кода.
Строже: в свойстве «действие» записано имя процедуры модуля формы, а её содержимое в структуру формы не входит.
4. Кнопка и первое нажатие
Остался четвёртый шаг: перетащить команду из списка в командную панель формы. Появится кнопка «Обновить цены» — тем же жестом, каким мы ставили вторую «Записать».
Теперь нажмите её в Предприятии. Ничего не произойдёт — и это правильно. Платформа нашла команду, вызвала процедуру из свойства «действие», процедура выполнилась — и ничего не сделала, потому что пуста. Это ровно тот случай, который мы разбирали как правило чтения: кнопка нажимается, а ничего не происходит, — значит, смотреть надо в команду: связана ли кнопка с той командой, задано ли у команды действие и есть ли что-нибудь в её процедуре.
5. Флажок, который работает без кода
У команды есть свойство, которое меняет поведение формы, не требуя ни строки в обработчике, — «Изменяет сохраняемые данные». Документация говорит, что вызов такой команды ставит форме признак изменённости: после нажатия форма ведёт себя так, будто пользователь правил поле, и при закрытии предложит записать.
| значение | что будет после нажатия |
|---|---|
| выключено | форма считает себя нетронутой, закрывается молча |
| включено | форма считает себя изменённой и при закрытии спросит, записать ли |
Для «Обновить цены» флажок честнее оставить выключенным: карточку товара команда не меняет, цены живут в регистре. Но опыт с ним поучителен: форма ведёт себя по-разному от одного свойства — это та же декларативность, что всюду в книге.
6. Своя команда в чужой форме
С этой стороны команды формы — самое интересное, что есть в чужой форме: стандартные команды одинаковы везде, а собственные рассказывают, зачем эту форму делали.
| что видно | что это значит |
|---|---|
| собственные команды есть | форму открывают ради действий, которых нет у платформы |
| у команды пустое действие | кнопка ничего не сделает — недоделка |
| действие есть, процедура пуста | задумано, но не написано |
| команда без кнопки — ни в панели, ни в меню | действие заготовлено или вызывается кодом |
Две последние строки встречаются в живых конфигурациях чаще, чем хотелось бы. Отличить их от рабочих команд можно, не читая кода целиком: достаточно открыть процедуру и увидеть, есть ли в ней что-нибудь.
7. В Конфигураторе и в Предприятии
Заведём команду «Обновить цены» и доведём её до кнопки.
- Откройте форму элемента «Товаров» и её список собственных команд. Добавьте команду.
-
В свойствах команды задайте имя «ОбновитьЦены» и заголовок «Обновить цены».
-
В свойстве «действие» создайте обработчик, выбрав первый вариант «на клиенте». Посмотрите на модуль формы: там появилась пустая процедура. Ничего в неё не пишите и закройте модуль.
-
Перетащите команду в командную панель формы.
-
Обновите конфигурацию, откройте карточку товара и нажмите «Обновить цены»: ничего не происходит.
-
Включите у команды свойство «Изменяет сохраняемые данные», обновите конфигурацию, нажмите кнопку и закройте карточку: форма спросит, записать ли. Ответьте «нет» и выключите свойство обратно.
Команду «Обновить цены» и её кнопку в карточке товара оставьте: они пригодятся дальше, а код для них — дело языка 1С.
Главное в одном абзаце
Когда нужного действия не знают ни платформа, ни объект, его заводят командой формы — за четыре шага: завести строку в списке собственных команд, дать имя для платформы и заголовок для человека, связать с процедурой через свойство «действие» и предложить кнопкой в панели. Процедуру создаёт редактор, спросив, где ей работать; все варианты начинаются «на клиенте», потому что кнопку нажимают у пользователя. Процедура остаётся пустой: что в неё написать — предмет книги о коде, а для чтения формы важна сама связь команды с процедурой, видная в свойствах. Пустая процедура — причина того, что кнопка нажимается без результата. Одно свойство команды работает и без кода: если она изменяет сохраняемые данные, форма после нажатия считает себя изменённой. В чужой форме собственные команды читают первыми: они говорят, зачем форму делали, а пустые процедуры и команды без кнопок показывают, что недописано.
Своя команда прошла весь путь: строка в списке, имя процедуры, кнопка под пальцем. В чужой форме этот путь проходят в обратную сторону — от готовых кнопок к тому, что за ними стоит. С чего начинают такой разбор и чем он заканчивается?
Контрольные вопросы
- Когда действие заводят командой формы, а не командой объекта?
- Назовите четыре шага от замысла до кнопки.
- Чем имя команды отличается от заголовка и кто их читает?
- Что делает редактор, когда создаёт обработчик из свойства «действие»?
- Почему все варианты создания обработчика команды начинаются «на клиенте»?
- Почему кнопка «Обновить цены» ничего не делает и где это видно?
- Какое свойство команды меняет поведение формы без единой строки кода?
Упражнения
По образцу. В форме документа «Поступление товаров» заведите команду «ЗаполнитьПоЗаказу» с заголовком «Заполнить по заказу», создайте ей пустой обработчик и поставьте кнопку в панель таблицы товаров. Проверьте и удалите команду вместе с кнопкой.
Своё: назовите команды. Придумайте две команды для карточки контрагента. Для каждой запишите имя, заголовок и скажите, будет ли она изменять сохраняемые данные.
Ловушка: «удалил процедуру — команда пропала». Разработчик удалил из модуля формы процедуру «ОбновитьЦены» и уверен, что команды больше нет. Что стало с командой и кнопкой?
Обратный ход. В чужой форме кнопка «Пересчитать скидки» после нажатия делает форму изменённой, хотя видимых изменений в полях нет. Что может быть тому причиной?
На чтение. В чужой форме пять собственных команд, у двух из них пустые процедуры, у одной нет кнопки. Что вы скажете о состоянии этой формы?
Ответы — в конце части.
§ 7.6. Чужая форма: каталог команд
Посчитайте кнопки на незнакомой форме — их бывает два десятка, и от этого кажется, что форма умеет двадцать вещей. Обычно это не так: часть кнопок предлагает одну и ту же команду, часть выключена, часть спрятана в меню. Поэтому разбор начинают не с кнопок, а с команд, и результат у него один — короткий список того, что здесь вообще можно сделать.
1. Что собираем
Каталог команд — табличка из пяти колонок: четыре списывают со свойств, пятую заполняют в конце разбора.
| колонка | откуда берётся |
|---|---|
| команда | список команд формы |
| заголовок | заголовок команды; у кнопки бывает свой, он и виден |
| источник | раздел, где команда нашлась: формы, стандартные, глобальные |
| где предложена | кнопки в структуре элементов |
| что известно о действии | источник плюс процедура, если команда своя |
Источники названы так же, как разделы в редакторе команд: собственные команды формы, стандартные и глобальные — в последних живут команды объектов и общие.
Собираем команды, а не кнопки: кнопка — только место, где действие предложено. Одна строка каталога может иметь три носителя, а может ни одного.
Кнопки отвечают на вопрос «где нажать». Каталог команд отвечает на вопрос, что у этой формы задумано и где из этого предложено человеку.
2. Два прохода: от команд и от кнопок
Обойти форму можно с двух сторон, и надёжнее сделать оба круга.
| проход | что даёт | чего не заметит |
|---|---|---|
| по списку команд | все собственные и стандартные | предложена ли команда хоть где-то |
| по структуре элементов | все кнопки и их места | команду, у которой кнопок нет |
Первый проход — основа каталога: собственные и стандартные команды видны списком целиком. С глобальными иначе: их в редакторе предлагается много, а к этой форме относятся те, у которых здесь есть кнопка, — их добирают вторым проходом.
Второй проход заполняет колонку «где предложена» и заодно показывает пустые строки — команды без единого носителя.
Смотрят при этом не только главную панель: у каждой таблицы своя, у панели есть меню «Ещё», а у таблиц и полей — контекстные меню. Всё это мы разбирали, когда говорили о панелях; здесь это превращается в маршрут обхода.
3. Разбор на примере
Вот команды чужой формы документа «Заявка поставщику» — так, как они лежат в редакторе.
Команды формы
├── ЗаполнитьПоОстаткам
└── ОтправитьПоставщику
Стандартные
├── Записать, Провести, Закрыть
└── у таблицы «Товары»:
добавить, удалить, передвинуть
Глобальные
└── Справочник.Контрагенты:
ПоказатьДолг
И её структура элементов — та часть, где кнопки.
Форма
├── КоманднаяПанель
│ ├── Записать, Провести
│ ├── Заполнить по остаткам
│ └── Показать долг
├── Шапка
├── Товары
│ └── КоманднаяПанель
│ ├── добавить, удалить
│ └── Заполнить по остаткам
└── КонтекстноеМеню таблицы
└── удалить
Каталог получается такой.
| команда | заголовок | источник | где предложена | что известно |
|---|---|---|---|---|
| Записать, Провести | те же | стандартные | панель формы | знает платформа |
| добавить, удалить | те же | стандартные, от таблицы | панель таблицы, меню строки | знает платформа |
| ЗаполнитьПоОстаткам | Заполнить по остаткам | формы | панель формы и панель таблицы | процедура непустая |
| ОтправитьПоставщику | Отправить поставщику | формы | нигде | процедура пуста |
| ПоказатьДолг | Долг контрагента | глобальные, от «Контрагентов» | панель формы | код в модуле команды справочника |
Пять строк вместо десятка кнопок — и сразу три находки. «Заполнить по остаткам» предложена дважды: одна команда, два носителя. «Отправить поставщику» не предложена нигде. «Показать долг» пришла от справочника контрагентов — значит, и код её там, в модуле команды, а не в модуле этой формы.
4. Что каталог говорит о форме
Готовый каталог читается целиком, а не по строкам.
| что видно в каталоге | что это значит |
|---|---|
| только стандартные команды | форму открывают, чтобы посмотреть и поправить запись |
| две-три своих команды | ради них форму и делали |
| десяток своих команд | чаще всего рабочее место, а не карточка |
| команды объекта | действие живёт шире этой формы |
| строка без кнопок | действие заготовлено или вызывается кодом |
| одна команда на трёх кнопках | автор хотел, чтобы её нашли наверняка |
Самая говорящая строка — «без кнопок». Если у команды нет ни одного носителя, а процедура у неё непустая, её скорее всего вызывает код: где-то есть обработчик, который делает это сам. Читать такую форму, не заглядывая в модуль, дальше не получится — и это честный итог разбора.
5. Чего каталог не скажет
Границу полезно знать заранее.
| вопрос | отвечает ли каталог |
|---|---|
| что можно сделать | да |
| где это предложено | да |
| откуда действие и где его код | да |
| что именно код делает | нет |
| безопасно ли нажать | нет |
Две последние строки — не недостаток разбора, а его честная граница. Каталог доводит читателя до двери: вот имя процедуры, вот модуль. Что за дверью — покажет книга о коде.
6. Четыре ловушки
Первая: считать кнопки вместо команд. Двадцать кнопок и восемь команд — обычное дело. Каталог строят по командам, иначе форма покажется сложнее, чем она есть.
Вторая: принять команду объекта за команду формы. Обе видны в форме одинаково, а код у них в разных местах. Час, потраченный на поиск процедуры в модуле формы, — самая частая плата за эту ошибку.
Третья: обойти только главную панель. Кнопки живут ещё на панелях таблиц, в меню «Ещё» и в контекстных меню. Пропустив их, легко записать команду в «нигде не предложена».
Четвёртая: принять серую кнопку за запрет. Чаще всего выключена именно кнопка: команда на месте, и там, где её предлагает другая кнопка, она сработает. Бывает и так, что платформа гасит все носители разом — например, пока действие не имеет смысла для этой записи. Но запрет в любом случае задают права, а не серый цвет.
7. Разбор по шагам
Шесть шагов — и каталог готов.
-
Откройте список команд формы и выпишите все три раздела: собственные, стандартные, глобальные.
-
Пройдите структуру элементов сверху донизу: главная панель, панели таблиц, подменю, контекстные меню. Для каждой кнопки запишите её команду.
-
Сведите оба списка в каталог: команда, заголовок, источник, где предложена.
-
Отметьте строки без кнопок и кнопки, у которых снята видимость или доступность.
-
Заполните последнюю колонку: у своих команд — есть ли что-нибудь в процедуре, у глобальных — от какого объекта команда и где её модуль.
-
Скажите одной фразой, ради чего эту форму открывают.
Шестой шаг — итог разбора, и проверяется он просто: если фраза получилась только про запись и закрытие, перед вами обычная карточка. Если в ней появились свои глаголы — значит, форму делали ради них, и с них начнётся любой разговор о ней.
Главное в одном абзаце
Разбор команд чужой формы даёт каталог: команда, заголовок, источник, где предложена и что известно о действии. Собирают его по командам, а не по кнопкам, — кнопка лишь место, где действие предложено, и на одну команду их может быть сколько угодно. Проходов два: по списку команд, где целиком видны собственные и стандартные, и по структуре элементов, где видно все кнопки — на главной панели, на панелях таблиц, в подменю и в контекстных меню. Готовый каталог читается целиком: только стандартные команды — карточка, десяток своих — рабочее место, строка без кнопок — действие, которое вызывает код. Каталог честно отвечает, что можно сделать, где это предложено и где искать код, — и не отвечает, что этот код делает. Ловушки: считать кнопки вместо команд, спутать команду объекта с командой формы, обойти только главную панель и принять серую кнопку за запрет.
Форму мы теперь читаем целиком: данные, элементы, композицию, списки и команды. Но форма не висит в пустоте — её кто-то открывает. Через что пользователь до неё добирается и почему одни формы видны сразу, а другие приходится искать?
Контрольные вопросы
- Почему каталог строят по командам, а не по кнопкам?
- Из каких колонок состоит каталог команд?
- Какие два прохода делают по форме и что даёт каждый?
- Где искать кнопки, кроме главной командной панели?
- О чём говорит строка каталога, у которой нет ни одной кнопки?
- На какие вопросы каталог не отвечает?
- Назовите четыре ловушки разбора команд.
Упражнения
По образцу. Составьте каталог команд для формы элемента «Товаров», которую вы собирали, — вместе с командой «Обновить цены».
Своё: прочтите замысел. В каталоге чужой формы восемь своих команд и ни одного поля, кроме двух отборов. Что это за форма и для кого её делали?
Ловушка: «кнопок много — форма сложная». Коллега насчитал в форме восемнадцать кнопок и решил, что разбираться в ней придётся неделю. Что вы предложите сделать первым?
Обратный ход. В каталоге есть команда «ПересчитатьСкидки» без единой кнопки, а процедура у неё непустая. Что это значит и где искать продолжение?
На чтение. Две формы одного документа: в каталоге первой — только стандартные команды, во второй — те же плюс четыре своих. Зачем в конфигурации обе и кому какая?
Ответы — в конце части.
Ответы к главе 7
§ 7.1. Команда: действие, которое форма предлагает сделать
К вопросу 1. Ответ. Одна сторона — данные и их показ: реквизиты и элементы. Другая — действия: команды формы. Оба списка живут в редакторе форм, рядом друг с другом.
К вопросу 2. Ответ. Команда описывает действие: имя, заголовок, подсказка, картинка, сочетание клавиш и действие — имя процедуры, которая выполнится.
К вопросу 3. Ответ. Команда — запись в списке команд, её не видно; кнопка — элемент формы в структуре элементов, её видно. Связывает их свойство кнопки с именем команды.
К вопросу 4. Ответ. Да и да. Одну команду могут предлагать несколько кнопок — например, в командной панели формы и рядом с таблицей. Команда без кнопки остаётся в списке, но на экране её никто не предлагает.
К вопросу 5. Ответ. Процедура-обработчик: платформа вызывает её, когда команду вызвали. Кода обработчиков эта книга не пишет — она учит читать форму, а не программировать её.
К вопросу 6. Указание. Кнопка отвечает за «где предложено», а не за «что произойдёт».
Полное решение. Смотреть надо в команду, с которой связана кнопка: на какую процедуру она указывает и есть ли в той процедуре хоть что-нибудь. Пустой обработчик — обычное дело в недописанной конфигурации. Если команда не указывает ни на какую процедуру, нажимать её бесполезно: платформа вызовет нечего.
К вопросу 7. Ответ. Ради каких действий её открывают. Только стандартные команды — форма для просмотра и правки записи; есть свои — форму открывают ради действий; команда без кнопки — действие описано, но на экране не предложено.
К упражнению «По образцу». Ответ. У формы поступления к записи и закрытию добавляется проведение: платформа знает, что документ проводят. У каждой команды в командной панели есть своя кнопка.
К упражнению «Своё: назовите глаголы». Ответ. Например: принять поставку, отметить расхождение, распечатать акт, отложить приёмку. Проверка простая: каждый пункт — глагол, то есть действие, а не данные.
К упражнению «Ловушка: „удалил кнопку — удалил действие"». Ответ. Он убрал носителя, а не действие: команда осталась в списке команд формы. Проверить — открыть этот список: строка на месте. Если кнопку убрали случайно, действие просто перестало быть предложено пользователю.
К упражнению «Обратный ход». Ответ. Либо кнопки нет вовсе — действие описано, но не предложено; либо кнопка есть, но с другим заголовком: подпись берётся из команды только тогда, когда у кнопки не задан свой; либо кнопка скрыта — у неё снята видимость.
К упражнению «На чтение». Ответ. Четыре стандартные говорят, что форма работает с записью — её правят, записывают, закрывают. Две свои — что форму открывают ещё и ради действий, которых у обычной карточки нет. С них и стоит начинать разбор: именно они объясняют, зачем форму делали отдельно.
§ 7.2. Три источника команд: платформа, объект, форма
К вопросу 1. Ответ. Стандартные — что они делают, знает платформа; команды объекта — обработчик в модуле команды; команды формы — в модуле формы.
К вопросу 2. Ответ. Платформа выводит их из вида объекта, с которым работает форма, и из её элементов. Что они делают, решает платформа; вмешаться в действие можно только кодом.
К вопросу 3. Ответ. Её тоже никто не заводил: платформа знает, что со строками таблицы делают, — добавляют, удаляют, двигают, — и сама даёт таблице эти команды.
К вопросу 4. Ответ. Через свойство «тип параметра»: редактор предлагает команду в каждой форме, где есть реквизит подходящего типа. Лежит она там в разделе параметризуемых глобальных команд.
К вопросу 5. Ответ. В модуле команды — у команды объекта свой модуль. Форма команде не хозяйка: команда заведена у объекта и работает во многих формах, поэтому код её не может принадлежать одной из них.
К вопросу 6. Ответ. Удалить можно только команду формы — она её собственная. У стандартной команды и команды объекта можно лишь не показывать кнопку: сами команды форме не принадлежат.
К вопросу 7. Ответ. По имени команды в свойствах кнопки. Если по имени не ясно — найти команду в редакторе команд: раздел, где она нашлась, и есть источник.
К упражнению «По образцу». Ответ. Стандартные — записать и закрыть, их дала платформа для справочника. Глобальные — в разделе независимых команды открытия форм; команд объекта в «Канцтоварах» нет. Собственных команд формы пока нет.
К упражнению «Своё: куда завести». Ответ. Команду объекта у «Товаров» с параметром «ссылка на товар»: она нужна в нескольких формах, и одна команда объекта попадёт во все, где есть товар. Две команды формы пришлось бы вести отдельно и править дважды.
К упражнению «Ловушка: „удалил команду — пропала везде"». Ответ. Он убрал кнопку из одной формы — и только. Команда живёт у объекта в дереве и доступна во всех остальных формах, где была.
К упражнению «Обратный ход». Ответ. Скорее всего, команда не собственная: её обработчик — в модуле команды у объекта или в модуле общей команды. Источник подскажет имя команды в свойствах кнопки.
К упражнению «На чтение». Ответ. «Провести» — стандартная: её дала платформа документу. «Заполнить по заказу» работает с этим документом — скорее всего, команда формы. «Отправить поставщику» может пригодиться во многих формах — возможно, команда объекта или общая. Проверка — имя команды у каждой кнопки и раздел редактора, где она лежит.
§ 7.3. Кнопка: элемент, который предлагает команду
К вопросу 1. Ответ. Похожа тем, что тоже только выводит на экран то, что описано в другом месте, и связана с ним одним свойством; на одно описание может приходиться много элементов. Отличается тем, что поле показывает данные, а кнопка предлагает действие.
К вопросу 2. Ответ. Свойством с именем команды.
К вопросу 3. Ответ. Перетаскиванием команды из списка команд в структуру элементов — тем же жестом, каким поле появляется из реквизита.
К вопросу 4. Ответ. Кнопка командной панели и гиперссылка командной панели — для кнопок в командной панели; обычная кнопка и гиперссылка — для кнопок в любом другом месте. Решает место кнопки.
К вопросу 5. Ответ. Кнопка решает, как и где действие предложено: вид, отображение, положение в панели, срабатывание по клавише ввода, видимость и доступность. Что произойдёт — решает команда.
К вопросу 6. Ответ. Своих действий у кнопки нет: без команды нажатие ничего не делает. Команда же без кнопки остаётся описанным действием, которое можно предложить позже или вызвать иначе.
К вопросу 7. Указание. Что именно выключено — кнопка или команда?
Полное решение. Выключена одна кнопка. Команда на месте: если её предлагает другая кнопка, там она сработает. От действия защищают права пользователя, а не свойства кнопки.
К упражнению «По образцу». Ответ. Команду «Провести» перетаскивают из раздела стандартных в структуру, рядом со складом; кнопка получает вид обычной кнопки. В Предприятии она проводит документ так же, как кнопка в панели.
К упражнению «Своё: спрячьте лишнее». Ответ. У трёх лишних кнопок поставить положение в командной панели — в дополнительном подменю: они уйдут в меню «Ещё», но останутся доступны.
К упражнению «Ловушка: „выключил кнопку — запретил"». Ответ. Выключена одна кнопка, а не команда. Если «Провести» предложена ещё где-то — в меню «Ещё» или второй кнопкой, — провести можно. Запрет задают правами.
К упражнению «Обратный ход». Ответ. Скорее всего, одна команда и два носителя. Проверить — посмотреть у обеих кнопок имя команды: если совпадает, команда одна.
К упражнению «На чтение». Ответ. Кнопка стоит не в командной панели: вид «гиперссылка» доступен только кнопкам вне панели. Значит, в структуре она лежит среди полей или в их группе, и вид у неё — гиперссылка, а не гиперссылка командной панели.
§ 7.4. Командная панель: где собираются кнопки
К вопросу 1. Ответ. Потому что она собирает другие элементы, как любая группа: у неё есть видимость, порядок, вложенность. Отличается она только видом — «командная панель» — и тем, что кладут в неё кнопки.
К вопросу 2. Ответ. Командная панель, подменю, группа кнопок и контекстное меню. Кнопку может держать и обычная группа, но эти четыре вида созданы именно для кнопок.
К вопросу 3. Ответ. Панель формы наполнена стандартными командами формы и действует на всю форму; панель таблицы — у каждой таблицы своя, её кнопки действуют на строки этой таблицы. Положение одной задаётся в свойствах формы, другой — в свойствах таблицы.
К вопросу 4. Ответ. Авто, верх, низ и «нет». У панели формы — в свойстве формы, у панели таблицы — в свойстве таблицы. У панели, поставленной вручную, таких положений нет: она стоит, где её поставили.
К вопросу 5. Ответ. В меню «Ещё», в подменю этой панели и в контекстном меню — а если и там нет, проверить её видимость в структуре.
К вопросу 6. Ответ. Чтобы действие стояло рядом с данными, к которым относится: кнопка у итога понятнее, чем та же кнопка наверху среди общих.
К вопросу 7. Указание. Сколько кнопок может быть у одной команды и сколько панелей на форме?
Полное решение. Кнопок на одну команду может быть сколько угодно, а панелей и меню на форме несколько: панель формы, панель таблицы, контекстное меню. Одна команда, три кнопки в трёх группах — одно действие в трёх местах.
К упражнению «По образцу». Ответ. После обновления кнопки «Записать» и «Провести» оказываются под формой; содержимое панели не меняется, меняется только её место.
К упражнению «Своё: соберите редкое». Ответ. Завести в панели подменю и перенести три редкие кнопки в него; или поставить им положение «только в „Ещё"».
К упражнению «Ловушка: „над таблицей пусто — строки не добавить"». Ответ. Положение панели таблицы — не внизу ли она; контекстное меню строки; своя панель рядом с таблицей; и только потом — разрешено ли таблице изменять состав строк.
К упражнению «Обратный ход». Ответ. Под таблицей стоит обычная группа с полем итога и своей командной панелью, а в ней — кнопка команды «Пересчитать».
К упражнению «На чтение». Ответ. Автор выключил автоматическую панель таблицы и собрал свою — в обычной группе над таблицей. Скорее всего, чтобы выбрать, какие кнопки оставить, поставить рядом другие поля или кнопки и расположить всё иначе, чем умеет автоматическая панель.
§ 7.5. Своя команда формы: «Обновить цены»
К вопросу 1. Ответ. Когда действие нужно только в этой форме. Если оно нужно во многих формах, где встречается тот же объект, заводят команду объекта.
К вопросу 2. Ответ. Завести строку в списке собственных команд формы; дать имя и заголовок; связать с процедурой через свойство «действие»; предложить кнопкой в панели.
К вопросу 3. Ответ. Имя — слитное, для платформы и кода: «ОбновитьЦены». Заголовок — обычными словами, для пользователя: «Обновить цены», его видно на кнопке.
К вопросу 4. Ответ. Заводит в модуле формы пустую процедуру, записывает её имя в свойство «действие» и открывает модуль.
К вопросу 5. Ответ. Кнопку нажимают у пользователя, то есть у клиента, — значит, и обработчик команды начинает работу там же. Это принцип клиента и сервера.
К вопросу 6. Указание. Что платформа делает при нажатии, шаг за шагом?
Полное решение. Платформа находит команду кнопки, вызывает процедуру из свойства «действие», процедура выполняется — и ничего не делает, потому что пуста. Видно это в модуле формы: у процедуры нет тела.
К вопросу 7. Ответ. «Изменяет сохраняемые данные»: после вызова такой команды форма считает себя изменённой и при закрытии предлагает записать.
К упражнению «По образцу». Ответ. Команду заводят на закладке команд формы поступления, кнопку перетаскивают в панель таблицы товаров. В Предприятии кнопка стоит над таблицей и ничего не делает. Удаляют команду — вместе с ней уходит и кнопка, а процедуру из модуля убирают отдельно.
К упражнению «Своё: назовите команды». Ответ. Например: «ПоказатьДолг» — «Показать долг», данные не меняет; «ЗаполнитьРеквизитыПоИНН» — «Заполнить по ИНН», меняет реквизиты карточки, поэтому изменяет сохраняемые данные.
К упражнению «Ловушка: „удалил процедуру — команда пропала"». Ответ. Команда и кнопка на месте: они живут в форме, а процедура — в модуле. Свойство «действие» указывает теперь на имя, которого в модуле нет, и кнопка перестанет работать как задумано.
К упражнению «Обратный ход». Ответ. У команды включено «Изменяет сохраняемые данные»: форма помечает себя изменённой после вызова, даже если процедура ничего видимого не поменяла.
К упражнению «На чтение». Ответ. Форма недописана: ради неё заводили действия, но два из них не реализованы, а одно заготовлено без кнопки или вызывается кодом. Прежде чем на неё полагаться, стоит выяснить, что из этого ждут пользователи.
§ 7.6. Чужая форма: каталог команд
К вопросу 1. Ответ. Кнопка — только место, где действие предложено. На одну команду их может быть несколько, а может не быть вовсе, поэтому по кнопкам форма кажется сложнее, чем она есть.
К вопросу 2. Ответ. Команда, заголовок, источник, где предложена и что известно о действии.
К вопросу 3. Ответ. По списку команд — видны все собственные и стандартные; по структуре элементов — все кнопки и их места, а заодно глобальные команды, у которых в этой форме есть кнопка.
К вопросу 4. Ответ. На панелях таблиц, в меню «Ещё», в подменю панелей и в контекстных меню таблиц и полей.
К вопросу 5. Ответ. Действие описано, но человеку не предложено. Если процедура пуста — это заготовка; если непуста, команду вызывает код.
К вопросу 6. Ответ. Что именно делает код и безопасно ли нажимать. Каталог доводит до имени процедуры и модуля — дальше язык 1С.
К вопросу 7. Ответ. Считать кнопки вместо команд; принять команду объекта за команду формы; обойти только главную панель; принять серую кнопку за запрет.
К упражнению «По образцу». Ответ. Стандартные — записать и закрыть, от платформы; своя — «ОбновитьЦены» с заголовком «Обновить цены», предложена кнопкой в панели формы, процедура пуста. Одной фразой: форму открывают, чтобы посмотреть и поправить товар, а «Обновить цены» пока задумана, но не написана.
К упражнению «Своё: прочтите замысел». Ответ. Это рабочее место: полей нет, зато восемь действий и два отбора — форму делали, чтобы выполнять из неё работу над списком записей, а не править одну.
К упражнению «Ловушка: „кнопок много — форма сложная"». Ответ. Собрать каталог: выписать команды и посмотреть, сколько их на самом деле. Восемнадцать кнопок часто оказываются шестью-семью командами, из которых своих две.
К упражнению «Обратный ход». Ответ. Команду вызывает код: где-то в модуле формы есть обработчик, который делает это сам — например, при открытии или при смене строки. Продолжение — в модуле формы, и это уже книга о коде.
К упражнению «На чтение». Ответ. Первая — обычная карточка для просмотра и правки; вторая — рабочая форма для тех, кто выполняет над документом действия. Скорее всего, основной назначена одна из них, а вторую открывают командой или из своего рабочего места.
§ 8.1. Командный интерфейс: оглавление, которое ведёт к формам
Откройте «Канцтовары» и доберитесь до списка товаров. Пока вы это делаете, форма ещё не открыта: вы идёте к ней — через перечень того, что программа умеет показать. Этот перечень и есть командный интерфейс: не часть формы, а то, что окружает их все. В начале книги мы смотрели на него глазами пользователя, как на оглавление программы. Теперь посмотрим со стороны Конфигуратора — где он задаётся и почему выглядит именно так.
1. Два разных «командных»
Слово «команда» мы весь прошлый разговор употребляли в одном смысле — действие формы. Здесь оно значит другое, и спутать эти два смысла легко.
| командная панель формы | командный интерфейс программы | |
|---|---|---|
| где живёт | внутри одной формы | над всеми формами |
| что предлагает | что сделать с этой записью | какую форму открыть |
| где задан | в структуре элементов формы | в подсистемах и свойствах конфигурации |
| когда виден | пока форма открыта | всегда, пока работает программа |
Разница не в природе команд — открывать формы умеют и те и другие, — а в контексте. Панель формы говорит о записи, которая уже открыта; командный интерфейс — о программе целиком и служит входом в неё.
Командная панель — глаголы одной формы. Командный интерфейс — оглавление, из которого открывают формы.
2. Где оглавление задано
В Предприятии командный интерфейс виден как панель разделов и функции текущего раздела. В Конфигураторе у него три адреса.
| что задаёт | где |
|---|---|
| какие разделы есть | подсистемы в ветке «Общие» |
| какие разделы кому видны | свойство конфигурации «Командный интерфейс» |
| что лежит в разделе «Главное» | свойство «Командный интерфейс основного раздела» |
Подсистемы разберём в следующем разговоре; пока достаточно рабочего правила: подсистема — это будущий раздел и набор объектов, которые в нём окажутся.
Документация описывает эти свойства коротко и точно: первое — «для редактирования видимости подсистем как в целом, так и по каждой роли», второе — для состава команд основного раздела, и правят его тогда, когда не устраивает «автоматически сформированный порядок команд».
Последние два слова — главные. Платформа берёт объекты, включённые в подсистему, и их стандартные команды. Дальше раскладывает эти команды по группам раздела и назначает им видимость по умолчанию. Разработчик перечень не пишет — он правит готовый, если порядок или состав вышли не такими, как нужно.
Пока подсистем нет, раскладывать платформе нечего, и команды конфигурации остаются общим перечнем — тем самым, через который мы открывали списки в начале книги.
3. Откуда берутся строки оглавления
Здесь работает то же правило, что со стандартными командами формы: платформа знает глаголы объекта и предлагает их сама.
| что задано в дереве | что появилось в оглавлении |
|---|---|
| справочник включён в подсистему | команда открыть список |
| он же | команда создать новую запись |
| документ включён в подсистему | команды открыть список и создать |
| отчёт включён в подсистему | команда открыть отчёт |
Значит, чтобы объект появился в разделе, его не нужно описывать дважды: включите в подсистему — остальное платформа соберёт. Условий при этом три. Первое: у объекта есть стандартные команды. Второе: команда не скрыта в редакторе командного интерфейса. Третье: у пользователя есть права на объект. Это та же автогенерация, что строила автоформы: правило задано, перечень собран.
4. Путь от щелчка до формы
Теперь всю цепочку видно целиком — и она замыкает всё, что мы разбирали раньше.
раздел подсистема
↓
команда стандартная команда объекта
↓
форма основная форма списка
↓
элементы то, что мы читали всю книгу
Третье звено стоит проговорить. Команда оглавления открывает не «какую-нибудь» форму, а основную форму того вида, который ей нужен: для команды списка — основную форму списка. Назначение основных форм мы разбирали в разговоре об автоформах; вот где оно срабатывает на практике.
Отсюда полезное следствие для чтения: если из раздела открывается не та форма, которую вы ожидали, смотреть надо не в подсистему, а в основные формы объекта.
Кто управляет этой цепочкой, стоит проговорить отдельно: часть решений принимает разработчик, часть — сам пользователь.
5. Кто что решает
У оглавления два хозяина, и их полномочия разные.
| решение | чьё |
|---|---|
| какие разделы есть и что в них | разработчика |
| какие разделы видны конкретной роли | разработчика |
| какие панели показывать и где | пользователя |
| что вынести в избранное | пользователя |
Так и разбирают жалобу «у меня нет такой команды» — по четырём адресам, в таком порядке: права пользователя, состав подсистемы, видимость в командном интерфейсе, личные настройки панелей. Порядок — не по частоте: застревать на первом адресе не стоит, любой из четырёх объясняет пропажу целиком.
6. Зачем это книге о формах
Командный интерфейс — не отдельная тема, а ответ на вопрос, откуда берутся формы на экране.
| что видит пользователь | что за этим |
|---|---|
| форма открылась из раздела | команда объекта, включённого в подсистему |
| форма открылась из другой формы | команда формы или ссылка в поле |
| форму «нигде не найти» | её не открывает ни одна команда интерфейса |
Последняя строка — частая находка в чужих конфигурациях. Форма есть, она рабочая, но добраться до неё можно только из другой формы или из кода. Это не поломка, но повод спросить, так ли задумано: пользователь ищет глазами по оглавлению, а не по чужим формам.
7. В Предприятии
Посмотрим, как выглядит программа без разделов.
- Откройте «Канцтовары» в Предприятии. Панели разделов нет: разделы берутся из подсистем, а подсистем мы не заводили.
-
Найдите списки товаров и контрагентов через общий перечень команд программы — тот, что платформа показывает, когда разделов нет.
-
Откройте список товаров и посмотрите на окно целиком: слева пусто, сверху нет разделов. Всё, что есть, — сама форма.
-
Запишите, какие разделы вы бы завели для «Канцтоваров» и какие объекты положили бы в каждый. Со следующего разговора мы это и сделаем.
Главное в одном абзаце
Командный интерфейс — оглавление прикладной программы: слой над всеми формами, через который пользователь до них добирается. Его легко спутать с командной панелью формы, но панель предлагает действия с уже открытой записью, а оглавление — какую форму открыть. Задаётся оно в трёх местах: подсистемы в ветке «Общие» дают разделы, свойство конфигурации «Командный интерфейс» решает, кому какие разделы видны, а «Командный интерфейс основного раздела» — что лежит в «Главном». Строки оглавления платформа собирает сама: включили объект в подсистему — появились команды открыть список и создать запись. Цепочка от щелчка до экрана короткая: раздел, команда, основная форма, элементы; поэтому не та форма из раздела — вопрос к основным формам объекта, а не к подсистеме. Разработчик решает, какие разделы есть и кому они видны; пользователь — как расставить панели. И жалобу «нет такой команды» разбирают по четырём адресам: права, состав подсистемы, видимость раздела, личные настройки.
Разделов в «Канцтоварах» пока нет, и оглавление пустует. Появятся они из объектов конфигурации, которых мы ещё не заводили, — из подсистем. Что это такое и почему одна подсистема даёт один раздел?
Контрольные вопросы
- Чем командный интерфейс отличается от командной панели формы?
- Какие три места в Конфигураторе задают оглавление программы?
- Что значит, что порядок команд в разделе формируется автоматически?
- Что нужно сделать, чтобы объект дал команды в разделе?
- Какая форма откроется по команде списка из раздела?
- Что в оглавлении решает разработчик, а что пользователь?
- По каким адресам разбирают жалобу «у меня нет такой команды»?
Упражнения
По образцу. Пройдите путь до списка контрагентов, запишите цепочку — через что вы шли — и посчитайте щелчки.
Своё: набросайте оглавление. Разбейте объекты «Канцтоваров» на два-три раздела и объясните, по какому признаку вы их делили.
Ловушка: «команды нет — значит, объекта нет». Пользователь не нашёл в своём разделе список складов и решил, что справочника в программе нет. Что вы проверите и в каком порядке?
Обратный ход. Из раздела «Закупки» открывается список поступлений, но не тот, что ожидал разработчик: колонки другие. Где искать причину?
На чтение. В чужой конфигурации есть форма, которую не открывает ни одна команда раздела. Как такое бывает и что стоит выяснить?
Ответы — в конце части.
§ 8.2. Подсистемы: из чего складываются разделы
Раскройте в дереве конфигурации ветку «Общие» и найдите в ней «Подсистемы». В «Канцтоварах» там пусто — поэтому программа и открывается без разделов. Подсистема и есть тот объект, из которого получается раздел: заведёте её и положите в неё объекты — появится раздел, назовёте — так он и будет называться в Предприятии.
1. Подсистема — это вид деятельности
Название обманчиво: подсистема — не отдельная программа внутри программы и не папка, куда складывают объекты. Документация говорит о ней иначе: подсистемами «описываются различные виды деятельности, выполняемые с использованием данной конфигурации».
| вид деятельности | подсистема | раздел у пользователя |
|---|---|---|
| закупать товар | Закупки | «Закупки» |
| продавать | Продажи | «Продажи» |
| вести склад | Склад | «Склад» |
Отсюда и ответ на вопрос, почему одна подсистема даёт один раздел: раздел — это и есть место для одного вида работы. Кладовщик заходит в «Склад», а не ищет среди всех документов программы те, что касаются его.
Подсистема — вид работы, записанный в дереве конфигурации. Раздел — та же работа, показанная пользователю.
2. У подсистемы два читателя
Подсистема служит не только пользователю. В Конфигураторе по ней отбирают объекты: в окне конфигурации включают отбор по подсистемам — и в дереве остаются только объекты выбранной подсистемы.
| кто смотрит | что получает |
|---|---|
| пользователь | раздел в программе |
| разработчик | отбор объектов в дереве конфигурации |
Второе дело менее заметное, но в большой конфигурации бесценное: в типовой программе объектов тысячи, и отбор по подсистеме — первый способ не утонуть. Для чтения чужой конфигурации это тоже приём: выбрали подсистему — увидели, из чего состоит один участок работы.
3. Что задают у подсистемы
Свойств немного, и почти все — про то, каким раздел увидит пользователь.
| свойство | что решает |
|---|---|
| имя | как подсистему зовут в конфигурации |
| синоним | название раздела на экране |
| картинка | значок раздела |
| пояснение | строка о назначении подсистемы |
| включать в командный интерфейс | будет ли раздел вообще |
| состав | какие объекты в неё входят |
| подсистемы | вложенные подсистемы |
Свойство «включать в командный интерфейс» стоит запомнить: оно решает, станет ли подсистема разделом. Снимите его — подсистема останется, объекты в ней останутся, отбор в дереве будет работать, а раздел из программы исчезнет.
Такое бывает и нарочно: подсистемой пользуются как группировкой для разработчика, не показывая её пользователю.
4. Объект может жить в двух разделах сразу
Состав подсистемы — список объектов, которые к ней относятся. Один объект может входить в несколько подсистем: документация разрешает это прямо, «допускается указание принадлежности к нескольким подсистемам».
| объект | в каких подсистемах |
|---|---|
| «Поступление товаров» | Закупки |
| «Реализация товаров» | Продажи |
| «Контрагенты» | Закупки и Продажи |
| «Товары» | Закупки, Продажи, Склад |
Для пользователя это значит, что список контрагентов виден из двух разделов — и это один и тот же список, а не две копии. Для читателя чужой конфигурации — что по составу подсистем видно, какие объекты в этой программе общие, а какие принадлежат одному участку работы.
5. Вложенные подсистемы: группы внутри раздела
Подсистемы можно вкладывать друг в друга, и вложенные разделом не становятся — они дают группы команд внутри раздела своего родителя.
Подсистемы
├── Закупки → раздел «Закупки»
│ ├── Заказы → группа в разделе
│ └── Поставщики → группа в разделе
└── Продажи → раздел «Продажи»
Есть у подсистемы и свойство на особый случай — «использовать одну команду». Документация описывает его так: подсистема должна содержать только одну команду, и при выборе такого раздела команда выполняется сразу. Раздел ведёт себя как кнопка: щёлкнули — и сразу открылось то единственное, ради чего он существует. Случай частный, но знать о нём полезно: встретив раздел, который ничего не показывает, а сразу что-то делает, вы теперь знаете, где это задано.
6. Как читать подсистемы в чужой конфигурации
Ветка подсистем — самая короткая дорога к замыслу программы.
| что видно | что это значит |
|---|---|
| три-пять подсистем первого уровня | автор делил программу по видам работы |
| два десятка разделов | делили по объектам, а не по работе — пользователю тяжело |
| подсистема без флажка командного интерфейса | группировка для разработчика |
| объект не входит ни в одну подсистему | до него нет пути по оглавлению |
| объект входит почти во все | он общий: справочник, которым пользуются все |
Последняя строка про объекты вроде контрагентов и товаров. Предпоследняя — частая находка: объект есть, формы есть, а пользователь до них не доберётся, пока кто-нибудь не включит его в подсистему.
7. В Конфигураторе и в Предприятии
Заведём «Канцтоварам» два раздела.
- В ветке «Общие» выделите «Подсистемы» и добавьте подсистему. Задайте имя «Закупки» и синоним «Закупки».
-
Проверьте, что включён флажок командного интерфейса, и задайте пояснение — например, «Приём товара от поставщиков».
-
Так же заведите подсистему «Продажи».
-
Обновите конфигурацию базы данных и откройте «Канцтовары». Посмотрите на левый край окна: подсистемы заведены, но объектов в них нет, и показывать разделу пока нечего.
-
Вернитесь в Конфигуратор и посмотрите у обеих подсистем свойство состава: оно пустое. Наполним его со следующего разговора — тогда и разделы заработают.
Главное в одном абзаце
Подсистема — объект конфигурации из ветки «Общие», которым описывают вид деятельности; одна подсистема первого уровня даёт один раздел программы, и название раздела берётся из её синонима. Служит она двум читателям: пользователю даёт раздел, разработчику — отбор объектов в дереве конфигурации. Главное её свойство для интерфейса — «включать в командный интерфейс»: без него подсистема живёт, а раздела нет. Состав подсистемы — список объектов, и один объект может входить в несколько подсистем: список контрагентов виден из двух разделов и остаётся одним списком. Вложенные подсистемы разделами не становятся — они дают группы команд внутри родительского раздела. В чужой конфигурации по ветке подсистем видно, как автор делил работу, какие объекты общие и до каких нет пути по оглавлению.
Подсистемы заведены, но пока они ни о чём: подсистема сама по себе не знает, какие объекты к ней относятся. Как объект попадает в подсистему и где в Конфигураторе это задаётся — у объекта или у подсистемы?
Контрольные вопросы
- Что описывают подсистемой и почему одна подсистема даёт один раздел?
- Чем подсистема полезна разработчику, кроме раздела?
- Какое свойство решает, станет ли подсистема разделом?
- Откуда берётся название раздела на экране?
- Может ли объект входить в две подсистемы и что это значит для пользователя?
- Чем становятся вложенные подсистемы?
- О чём говорит объект, не входящий ни в одну подсистему?
Упражнения
По образцу. Заведите третью подсистему — «Склад» — с синонимом и пояснением, и убедитесь, что флажок командного интерфейса включён.
Своё: разделите работу. Для магазина с доставкой предложите три-четыре подсистемы и скажите, по какому признаку вы делили.
Ловушка: «убрал из командного интерфейса — удалил подсистему». Разработчик снял флажок у подсистемы «Склад» и говорит, что подсистемы больше нет. Что осталось и что исчезло?
Обратный ход. В чужой конфигурации у справочника «Валюты» не указана ни одна подсистема, а пользователи с ним работают. Как такое возможно?
На чтение. В программе восемнадцать разделов, и в каждом по одной-две команды. Что вы скажете о том, как автор делил работу?
Ответы — в конце части.
§ 8.3. Объект в подсистеме: одна связь, два окна
Откройте в дереве конфигурации документ «Поступление товаров», а в окне его редактирования — закладку с подсистемами: там перечислены подсистемы конфигурации, и у каждой флажок. Теперь откройте подсистему «Закупки» и посмотрите её состав: там перечислены объекты, и у каждого тоже флажок. Это не два разных списка. Это одна и та же связь, показанная с двух сторон, — и задать её можно из любого окна.
1. Связь одна, окна два
Принадлежность объекта подсистеме — не свойство объекта и не свойство подсистемы, а связь между ними; в Конфигураторе её показывают с обеих сторон. Документация говорит, что свойство «Подсистемы» есть «практически у всех объектов конфигурации»: у справочников, документов, отчётов, обработок и регистров закладка с подсистемами есть точно.
| откуда задаём | что видим перед собой | когда удобнее |
|---|---|---|
| из объекта | все подсистемы, куда он может войти | завели объект, раскладываем по разделам |
| из подсистемы | все объекты конфигурации | собираем раздел целиком |
Работают обе одинаково: поставили флажок в одном окне — он появится и в другом.
Объект и подсистема связаны одной ниткой, и концов у неё два. Потянете за любой — связь получится одна и та же.
2. Что появляется в разделе
Как только объект попал в подсистему, платформа по умолчанию даёт разделу его стандартные команды — те, что она заводит объекту сама: открыть список, создать новую запись, открыть отчёт.
| что включили | что появилось в разделе |
|---|---|
| справочник «Товары» | открыть список товаров, создать товар |
| документ «Поступление товаров» | открыть список поступлений, создать поступление |
| отчёт об остатках | открыть отчёт |
Ничего дописывать не нужно: перечень платформа собирает сама. А вот порядок команд и видимость каждой из них — включить или выключить её в этом разделе — правят отдельно, в командном интерфейсе подсистемы; о нём следующий разговор.
3. В подсистему включают объект, а не форму
Для книги о формах это важная оговорка. В составе подсистемы перечислены объекты конфигурации — справочники, документы, отчёты. Форм там нет.
Подсистема «Закупки»
└── Документ «ПоступлениеТоваров»
│
└── команда открыть список
│
└── основная форма списка
Цепочка короткая: подсистема решает, какой объект попадёт в раздел, объект даёт команду, а какая форма откроется, решают основные формы объекта. Поэтому вопрос «почему из раздела открывается не та форма» к составу подсистемы отношения не имеет.
4. Объект в двух подсистемах
Контрагенты нужны и закупщику, и продавцу. Включаем справочник в обе подсистемы — и смотрим, что получилось.
| где | что видит пользователь |
|---|---|
| раздел «Закупки» | команда открыть список контрагентов |
| раздел «Продажи» | та же команда |
| обе команды | открывают одну и ту же форму одного и того же справочника |
Никакого удвоения данных здесь нет: в оглавлении две строки, за ними один объект. Так же, как одну команду формы предлагают две кнопки: носителей несколько, а действие одно.
5. Куда включать: по работе, а не по виду объекта
Соблазн при сборке оглавления — разложить объекты по видам: справочники в один раздел, документы в другой. Сделать так можно, вот только пользоваться этим тяжело.
| как делить | что получится |
|---|---|
| по видам объектов | раздел «Справочники» и раздел «Документы» — оглавление ни о чём |
| по работе человека | «Закупки», «Продажи», «Склад» — каждому своё место |
Проверка простая: прочитайте название раздела и спросите, чья это работа. Если ответ «всех понемногу» — деление выбрано неудачно.
Из этого правила следует и то, как поступать с общими справочниками: товары и контрагенты нужны всем, поэтому их включают в несколько подсистем, а не выносят в отдельный раздел «Справочники».
6. Что видно при чтении чужой конфигурации
Те же правила помогают читать чужую конфигурацию: состав подсистемы — короткий ответ на вопрос, чем занят этот участок работы.
| что видно в составе | что это значит |
|---|---|
| три-четыре объекта, из них один документ | раздел про одно дело |
| двадцать объектов вперемешку | раздел стал свалкой; пользователь ищет глазами |
| документ есть, а его справочники — нет | до справочников доберутся из формы документа |
| объект во всех подсистемах | общий для всей программы |
| объект без подсистем | в оглавлении его нет вовсе |
Третья строка — не ошибка, а решение: не всё, что нужно в работе, обязано стоять в оглавлении. Но если пользователь заводит контрагентов десять раз в день, отдельная команда в разделе сэкономит ему эти десять путей через форму документа.
7. В Конфигураторе и в Предприятии
Наполним разделы «Канцтоваров».
- В ветке «Общие → Подсистемы» откройте «Закупки» и найдите свойство состава. В нём отметьте документ «Поступление товаров», справочники «Товары» и «Контрагенты».
-
Откройте подсистему «Продажи» и отметьте документ «Реализация товаров», те же два справочника.
-
Откройте окно редактирования справочника «Товары» и найдите закладку с подсистемами: обе отмечены. Это тот же флажок, только с другой стороны.
-
Обновите конфигурацию базы данных и откройте «Канцтовары». Зайдите в «Закупки»: список поступлений, списки товаров и контрагентов, команды создания.
-
Откройте из раздела список товаров и сравните с тем, что открывается из «Продаж»: форма одна и та же.
-
Оставьте состав как есть: на нём будут построены следующие разговоры.
Главное в одном абзаце
Принадлежность объекта подсистеме — это связь, у которой две двери: закладка подсистем в окне редактирования объекта и состав подсистемы. Задать её можно с любой стороны, результат один. Как только объект попал в подсистему, платформа сама даёт разделу его стандартные команды: открыть список, создать запись, открыть отчёт. В составе подсистемы перечислены объекты, а не формы, — какая форма откроется, по-прежнему решают основные формы объекта. Один объект входит в несколько подсистем, и тогда в оглавлении две строки, а за ними один и тот же объект. Делить объекты по разделам стоит по работе человека, а не по видам объектов: раздел «Справочники» не отвечает на вопрос, чья это работа. В чужой конфигурации состав подсистемы читают как ответ на вопрос, чем занят участок, а объект без подсистем — как тот, до которого добираются только из других форм.
Состав задан, команды в разделах появились сами. Но порядок у них тот, что выбрала платформа, и видно в разделе всё, что она решила показать. Где менять этот порядок и как убрать из раздела лишнее, не выбрасывая объект из подсистемы?
Контрольные вопросы
- Где задаётся принадлежность объекта подсистеме?
- Что появляется в разделе, когда объект в него включён?
- Что перечислено в составе подсистемы — объекты или формы?
- Какая форма откроется по команде списка и от чего это зависит?
- Что видит пользователь, если объект включён в две подсистемы?
- Почему делить объекты по видам — плохая идея?
- О чём говорит документ в разделе, чьих справочников там нет?
Упражнения
По образцу. Включите в обе подсистемы справочник «Склады» и проверьте, что команда появилась в обоих разделах.
Своё: соберите раздел. Для подсистемы «Склад» перечислите объекты «Канцтоваров», которые вы бы в неё включили, и объясните каждый.
Ловушка: «объект в двух разделах — два объекта». Пользователь завёл контрагента в разделе «Закупки» и не видит его в списке из раздела «Продажи». Что случилось на самом деле?
Обратный ход. В разделе есть команда создания документа, но нет команды открыть его список. Как такое может быть?
На чтение. В чужой конфигурации подсистема «Кадры» содержит один документ и восемь справочников. Что можно предположить о работе, ради которой её собрали?
Ответы — в конце части.
§ 8.4. Командный интерфейс подсистемы: что видно в разделе
Зайдите в «Закупки» и прочитайте раздел сверху вниз. Сначала идут ссылки на списки — поступления, товары, контрагенты. Потом действия: создать поступление, создать товар. Ссылки и действия лежат отдельно друг от друга, и это не случайность: у раздела две панели, и у каждой свои правила. Разбираться с ними будем у подсистемы — в её командном интерфейсе.
1. Две панели раздела
Команды раздела лежат не вперемешку. Документация делит их между двумя панелями, и у каждой свои группы.
| панель | что в ней | стандартные группы |
|---|---|---|
| навигации | команды, открывающие формы списков | «Важное», «Обычное», «См. также» |
| действий | создание записей, отчёты, обработки | «Создать», «Отчёты», «Сервис» |
Группы названы стандартными не случайно: их платформа заводит сама, но ими дело не ограничивается — разработчик может добавить и свои.
Разница между панелями — это разница между «показать» и «сделать». Команды навигации открывают формы списков: щёлкнули — список открылся в рабочей области окна. Команды действий начинают работу: создают новую запись, открывают отчёт, запускают обработку.
Панель навигации — куда пойти. Панель действий — что сделать. Обе собраны платформой и обе правятся в командном интерфейсе подсистемы.
2. Что решает разработчик
Выше мы различали, что в интерфейсе задаёт разработчик, а что настраивает пользователь. Здесь та же граница, только вблизи: посмотрим, что разработчик может сделать с командами раздела. И сразу разведём два слова, которые дальше будут рядом: состав подсистемы — перечень включённых объектов, командный интерфейс подсистемы — набор команд, которые эти объекты дали разделу.
Редактор командного интерфейса открывается из свойств подсистемы и показывает обе панели со всеми такими командами.
| что можно задать | что изменится |
|---|---|
| видимость команды | показывать её в разделе или нет |
| группу | в навигации — «Важное», «Обычное», «См. также»; в действиях — «Создать», «Отчёты», «Сервис» |
| порядок | в каком порядке команды идут внутри группы |
| видимость по роли | кто из пользователей команду увидит |
Группа «Важное» показывается первой и без подписи, «Обычное» — следом, а «См. также» документация описывает как группу для вспомогательных или редко используемых команд; она одна выделена подписью. Значит, распределение по группам — это не украшение, а расстановка приоритетов: что человек увидит первым делом.
3. Убрать из раздела — не значит убрать из программы
Это главное, ради чего стоит различать состав подсистемы и её командный интерфейс.
| что сделали | что стало |
|---|---|
| исключили объект из подсистемы | в разделе нет ни одной его команды |
| выключили команду в интерфейсе | объект в подсистеме, а команды в разделе нет |
| сняли право на объект | команд нет, и сам объект недоступен |
Средняя строка — тонкий случай и частая находка при чтении. Объект в составе есть, формы у него есть, а в разделе пусто: кто-то выключил команду. Искать это надо именно в командном интерфейсе подсистемы — в составе всё будет выглядеть правильно.
4. Что настраивает пользователь
Тот же раздел настраивает под себя и пользователь — своими средствами и в своих пределах.
| кто | что может |
|---|---|
| разработчик | состав команд, группы, порядок, видимость по ролям |
| пользователь | включить и выключить доступные ему команды, поменять порядок |
Документация добавляет две оговорки. Первая: настройка возможна, если у пользователя есть право сохранять свои настройки. Вторая важнее: «доступность команд пользователю определяется правами пользователя и функциональными опциями» — того, что ему не разрешено, он себе не вернёт. Функциональные опции — переключатели возможностей программы, которыми администратор включает и выключает целые куски интерфейса; подробно они за рамками книги, а знать о них стоит: это ещё один адрес, где команда может пропасть.
Отсюда и порядок разбора, знакомый по прошлым разговорам: права пользователя, состав подсистемы, командный интерфейс подсистемы, личные настройки человека.
5. Почему команд в разделе больше, чем объектов
Три объекта дали разделу шесть команд, и это нормально: у каждого объекта их несколько, а у некоторых — и больше, чем две.
Закупки
├── навигация
│ └── Обычное
│ ├── Поступления товаров
│ ├── Товары
│ └── Контрагенты
└── действия
└── Создать
├── Поступление товаров
├── Товар
└── Контрагент
Отсюда и главная работа над разделом: не добавить команды, а убрать лишние. Список поступлений закупщику нужен каждый день, а вот «создать контрагента» он делает раз в месяц — такой команде место в «См. также» или вовсе за пределами раздела.
6. Что читать в чужом разделе
Раздел читается так же, как форма: сначала целиком, потом по строкам.
| что видно | что это значит |
|---|---|
| три-пять команд навигации | раздел собран под одну работу |
| двадцать команд и все в «Обычном» | приоритеты не расставляли |
| «См. также» длиннее «Важного» | раздел вырос и его давно не пересматривали |
| объект в составе, а команды нет | её выключили в командном интерфейсе |
| в разделе одни действия и ни одного списка | работа начинается с создания документа |
Последняя строка встречается в разделах вроде «Касса» или «Приёмка»: человек приходит туда не смотреть, а вводить. Это тоже замысел, и по командному интерфейсу он читается быстрее, чем по формам.
7. В Конфигураторе и в Предприятии
Наведём порядок в разделе «Закупки».
- Откройте подсистему «Закупки» и её командный интерфейс. Посмотрите, какие команды в какие группы попали.
-
Перенесите команду открытия списка поступлений в группу «Важное», а список контрагентов оставьте в «Обычном».
-
Выключите видимость у команды создания контрагента.
-
Обновите конфигурацию и откройте «Закупки»: поступления идут первыми, а создать контрагента из раздела больше нельзя.
-
Убедитесь, что справочник никуда не делся: откройте список контрагентов из раздела и создайте запись кнопкой в форме.
-
Верните видимость команде создания: дальше она понадобится.
Опыт доказывает то, ради чего параграф и писался: команда из раздела исчезла, а объект и его формы остались на месте. Значит, причина была в командном интерфейсе, а не в составе подсистемы.
Главное в одном абзаце
Команды раздела платформа раскладывает по двум панелям: навигации — те, что открывают списки, и действий — создание записей, отчёты, обработки. У панели навигации три группы: «Важное», «Обычное» и «См. также», у панели действий — «Создать», «Отчёты» и «Сервис». Разработчик правит всё это в командном интерфейсе подсистемы: видимость каждой команды, её группу, порядок и видимость по ролям. Выключенная команда — не то же самое, что исключённый из подсистемы объект: объект остаётся, формы работают, а в разделе его не видно, и искать причину надо именно здесь. Пользователь настраивает тот же раздел под себя, но только в пределах того, что ему разрешено правами и функциональными опциями. Команд в разделе всегда больше, чем объектов, поэтому главная работа над разделом — не добавлять, а убирать лишнее и расставлять приоритеты. В чужом разделе по этим приоритетам и читают: что человеку показали первым, а что спрятали в «См. также».
Разделы собраны, команды расставлены. Но программа открывается не на разделе: первое, что видит пользователь, — начальная страница. Кто решает, что на ней показать, и почему туда попадают формы, а не команды?
Контрольные вопросы
- Какие две панели есть у раздела и чем они различаются?
- Какие группы есть у панели навигации и какая из них выделена подписью?
- Что можно задать команде в командном интерфейсе подсистемы?
- Чем «выключить команду» отличается от «исключить объект из подсистемы»?
- Что может настроить в разделе пользователь и чего он сделать не сможет?
- Почему команд в разделе больше, чем объектов?
- О чём говорит раздел, в котором одни действия и ни одного списка?
Упражнения
По образцу. Наведите тот же порядок в разделе «Продажи»: реализации — в «Важное», создание контрагента — выключить.
Своё: расставьте приоритеты. Для раздела «Склад» перечислите команды и распределите их по трём группам, объяснив каждое решение.
Ловушка: «команды нет — значит, объект убрали». В разделе «Закупки» пропала команда открытия списка товаров. Коллега решил, что справочник исключили из подсистемы. Что вы проверите первым делом?
Обратный ход. Пользователь говорит, что у него в разделе видны не те команды, что у соседа, хотя роль одна. Как такое возможно?
На чтение. В чужой конфигурации у раздела в «Важном» пусто, в «Обычном» две команды, а в «См. также» — одиннадцать. Что вы скажете об этом разделе?
Ответы — в конце части.
§ 8.5. Начальная страница: с чего начинается работа
Запустите «Канцтовары» и посмотрите на середину окна. Там пусто: разделы слева есть, а показать при запуске программе нечего. Между тем это самое дорогое место в интерфейсе — то, что человек видит раньше всего остального, ещё до того, как успел выбрать раздел. Называется оно начальной страницей; какие формы на ней могут стоять, решает разработчик, а пользователь выбирает из предложенного.
1. Не команды, а сами формы
Документация определяет начальную страницу как совокупность форм, которые показываются в рабочей области основного окна при начале работы с программой. В этом её главное отличие от раздела.
| раздел | начальная страница | |
|---|---|---|
| что показывает | команды | формы |
| что делает пользователь | выбирает, куда пойти | сразу видит данные |
| сколько за раз | один раздел | несколько форм рядом |
Раздел — это путь к форме, начальная страница — сама форма, уже открытая. Ради этого её и собирают: человеку, который каждое утро смотрит остатки, не нужно каждый раз идти к ним через оглавление.
Раздел отвечает, куда пойти. Начальная страница показывает то, ради чего обычно и приходят.
2. Что на неё ставят
Документация говорит и о том, какие формы туда добавляют: те, «которые содержат наиболее важную для пользователя информацию, и с которых он, как правило, начинает свою работу».
| что ставят | зачем |
|---|---|
| список документов за сегодня | видно, что уже сделано |
| список задач или заказов | с него начинается работа |
| отчёт с остатками | цифра, ради которой открывают программу |
| список справочника | если работа — это ведение справочника |
Выбор здесь не технический, а человеческий: вы решаете, чем человек занят в первую минуту рабочего дня. Поэтому начальная страница — самая говорящая часть конфигурации: по ней видно, кем автор считает своего пользователя.
3. Где это задаётся
У конфигурации есть свойство «Рабочая область начальной страницы». Документация описывает его прямо: открывается окно редактирования рабочей области основного окна приложения при начале работы, и служит оно для настройки форм начальной страницы.
| что задаём | где |
|---|---|
| какие формы показывать | рабочая область начальной страницы |
| как они разложены | там же: формы раскладывают по колонкам |
| кому видна форма | правами на объект — их задают отдельно, в ролях |
Формы в это окно добавляют по имени: из списка форм конфигурации. Значит, на начальную страницу попадает конкретная форма — не объект и не команда, а именно та форма, которую вы выбрали.
4. Формы показываются без щелчка
Формы начальной страницы не открываются отдельными окнами: они встроены в рабочую область основного окна и показываются в ней сразу, как только программа эту область покажет.
| что на странице | что за этим |
|---|---|
| список товаров | форма получает строки и показывает их |
| отчёт | отчёт формируется |
| три формы сразу | три порции работы, которых никто не заказывал щелчком |
Здесь снова виден принцип клиента и сервера: каждая форма — это данные, которые сервер должен отдать, а клиент показать. Отсюда и практическое правило: чем больше и тяжелее формы на начальной странице, тем больше работы приходится на показ этой страницы — и тем заметнее это человеку, который ждёт.
5. Пользователь собирает свою
Состав начальной страницы, как и панели, человек настраивает под себя — но из того, что ему предложили.
| кто | что решает |
|---|---|
| разработчик | список форм, которые вообще можно поставить |
| пользователь | какие из них показывать ему и в каком порядке |
Документация формулирует это так: пользователь формирует персональный состав начальной страницы из списка доступных форм, а сам список «определяется на этапе конфигурирования». Настройка живёт в главном меню, в разделе видов отображения.
Отсюда знакомая пара адресов: «у меня не та начальная страница» — это либо личная настройка человека, либо рабочая область в конфигурации.
6. Что читать по начальной странице
Чтение начальной страницы короткое: картину можно собрать за минуту.
| что видно | что это значит |
|---|---|
| страница пуста | программу открывают ради разных дел, общего начала нет |
| один список документов | работа начинается с него |
| три-четыре формы | у пользователя несколько дел сразу |
| форма, которой нет ни в одном разделе | она задумана только как начало работы |
| страница из отчётов | пользователь — тот, кто смотрит, а не вводит |
Интересный случай — форма на начальной странице, у которой нет команды ни в одном разделе. Единственный путь к ней — вернуться на начальную страницу кнопкой перехода в заголовке окна. Это не поломка, но стоит проверить, что этот путь для пользователя очевиден.
7. В Конфигураторе и в Предприятии
Соберём «Канцтоварам» начало рабочего дня.
- Откройте свойства конфигурации и найдите рабочую область начальной страницы.
-
Добавьте форму списка «Товаров» и форму списка «Контрагентов».
-
Обновите конфигурацию базы данных и запустите «Канцтовары»: обе формы открыты сразу, рядом.
-
Откройте из раздела «Закупки» список поступлений, а потом вернитесь на начальную страницу кнопкой перехода в заголовке окна.
-
Посмотрите настройку начальной страницы в главном меню: там перечислены те же две формы, и любую можно убрать.
-
Оставьте страницу как есть: с неё начинается работа в «Канцтоварах».
Главное в одном абзаце
Начальная страница — это формы, которые платформа показывает в рабочей области сразу при запуске программы: не команды, ведущие к формам, а сами формы, уже открытые. Ставят на неё то, с чего человек начинает работу и что содержит самую важную для него информацию, — поэтому по начальной странице виднее всего, кем автор считает пользователя. Задаётся состав у конфигурации, в рабочей области начальной страницы, и добавляют туда конкретные формы, а не объекты и не команды. Показываются они без щелчка, и каждая просит у сервера свои данные: чем больше и тяжелее формы, тем дороже обходится показ этой страницы. Пользователь собирает свою страницу, но только из того списка, что задал разработчик. При чтении чужой конфигурации начальная страница отвечает на вопрос, ради чего программу открывают каждое утро, а форма, которая есть на ней и которой нет в разделах, — повод проверить, очевиден ли путь к ней.
Разделы, начальная страница, панели — всё это собирает разработчик. Но в окне есть и то, чего он не задавал: главное меню, настройки, служебные окна. Откуда берётся эта часть интерфейса и что в ней стоит знать читателю форм?
Контрольные вопросы
- Чем начальная страница отличается от раздела?
- Какие формы на неё ставят?
- Где в Конфигураторе задаётся её состав?
- Что попадает на начальную страницу — объект, команда или форма?
- Почему от состава начальной страницы зависит, как быстро она покажется?
- Что может настроить пользователь и в каких пределах?
- О чём говорит форма, которая есть на начальной странице, но которой нет ни в одном разделе?
Упражнения
По образцу. Добавьте на начальную страницу отчёт об остатках и посмотрите, что изменилось при запуске.
Своё: начало дня. Для кладовщика «Канцтоваров» соберите начальную страницу из двух форм и объясните выбор.
Ловушка: «убрал форму — сломал начальную страницу». Пользователь убрал обе формы в своей настройке и говорит, что начальная страница исчезла у всех. Что произошло на самом деле?
Обратный ход. Начальная страница стала показываться заметно медленнее, а изменение в конфигурации было одно — в интерфейсе. Что стоит проверить первым?
На чтение. В чужой конфигурации на начальной странице стоят пять отчётов и ни одного списка. Кто этот пользователь и чем он занят?
Ответы — в конце части.
§ 8.6. Главное меню: то, что даёт сама платформа
Нажмите кнопку главного меню в заголовке окна и прочитайте, что там. Работа с файлом, правка, настройка вида, сервис, справка. Ни одного слова про товары и поступления — и это не упущение автора конфигурации. Эту часть интерфейса собрал не он.
1. Что разработчику не принадлежит
Документация говорит об этом прямо: главное меню окон «содержит только общие команды, не имеющие прикладной специфики, и не может быть изменено разработчиком конфигурации».
| часть интерфейса | кто задаёт |
|---|---|
| разделы, команды в них, начальная страница | разработчик |
| главное меню, настройки, служебные окна | платформа |
| расположение панелей, свой состав страницы | пользователь |
Три слоя — и это вся картина интерфейса, которую мы собирали главу. Разработчик отвечает за то, что относится к делу: какие разделы, какие команды, какие формы при запуске. Платформа даёт всё остальное — то, что одинаково в любой программе на 1С.
Оглавление пишет разработчик. Переплёт и закладку даёт платформа — они одинаковы у всех книг, набранных в этой типографии.
2. Что ещё живёт в заголовке окна
Кроме главного меню платформа кладёт в заголовок основного окна несколько инструментов навигации.
| что это | зачем |
|---|---|
| «Вперёд» и «Назад» с историей переходов | вернуться туда, где уже был |
| меню функций | все команды текущего раздела в одном окне |
| избранное | свой список того, что открывают часто |
| стандартная командная панель | общие действия над окном |
История переходов, как говорит документация, живёт только в течение сеанса: закрыли программу — список опустел. А избранное человек собирает сам: это его слой, и держать там формы, которые открываешь по десять раз в день, — нормальный способ работы, даже когда оглавление собрано хорошо.
Часть этих инструментов ведёт в разные окна — а окна платформа различает.
3. Два вида окон
Платформа различает основное окно и вспомогательные, и разница в том, для чего они нужны.
| окно | для чего |
|---|---|
| основное | навигация по конфигурации и вызов команд |
| вспомогательное | работа с объектом: документ, карточка, отчёт |
Для читателя форм это объясняет одну вещь, которую легко списать на случайность: одна и та же форма открывается то в рабочей области основного окна, то отдельным окном. Решает это не форма, а режим открытия форм, заданный для программы.
4. Функции для технического специалиста
Вернёмся к главному меню: в нём прячется служебная команда — «Функции для технического специалиста». Включают её в параметрах, и она открывает перечень всех объектов конфигурации.
Не спутайте её с меню функций из заголовка окна: там собраны команды текущего раздела, то есть часть оглавления. Здесь — перечень вообще всего, что есть в конфигурации, и к оглавлению он отношения не имеет.
| что в перечне | чего в нём нет |
|---|---|
| все справочники, документы, отчёты, обработки | ничего не пропущено |
| объекты, не включённые ни в одну подсистему | — |
| объекты, чьи команды выключены в разделе | — |
Документация формулирует это так: в список включены все объекты метаданных «независимо от настроек включения их в командный интерфейс». Именно этим мы пользовались в начале главы, когда разделов ещё не было.
Отсюда два правила. Первое, полезное: если до формы нет пути по оглавлению, её можно открыть отсюда — и проверить, работает ли она вообще. Второе, важнее: этот перечень — инструмент для того, кто настраивает программу, а не замена оглавления. Если пользователь каждый день ходит к форме через него, значит, оглавление собрано плохо.
5. Стандартные функции
Тем же путём открываются и служебные инструменты платформы — стандартные функции. Они есть в любой программе на 1С и к прикладной задаче отношения не имеют.
| функция | о чём она |
|---|---|
| управление полнотекстовым поиском | обновление поискового индекса |
| служебные окна платформы | сообщения, показатели работы |
Разбирать их в книге о формах незачем — важно знать, что они есть и что это не части конфигурации. Встретив такое окно, не ищите его форму в дереве: её там нет.
6. Три слоя интерфейса
Соберём в одну картину три слоя, которые отметили в начале разговора: это и есть ответ на вопрос, откуда берётся всё, что человек видит на экране.
платформа главное меню, окна,
стандартные функции
│
разработчик разделы, команды,
начальная страница, формы
│
пользователь панели, избранное,
свой состав страницы
Читать интерфейс стоит сверху вниз: сначала понять, что перед вами — часть платформы или часть конфигурации, и только потом искать причину. Половина вопросов «почему это так выглядит» снимается на первом шаге: потому что так устроена платформа, и автор конфигурации к этому не причастен.
7. В Предприятии
Доберёмся до формы, которой нет в оглавлении.
-
Откройте «Канцтовары» и убедитесь, что списка складов нет ни в «Закупках», ни в «Продажах»: справочник мы в подсистемы не включали.
-
Включите режим технического специалиста в параметрах программы и найдите в главном меню команду функций.
-
Найдите в перечне справочник «Склады» и откройте его список.
-
Прикиньте, насколько короче был бы путь, будь у складов команда в разделе: сколько щелчков там и сколько здесь.
-
Решите, стоит ли включать «Склады» в подсистему «Закупки», и запишите свой ответ. К этому решению мы вернёмся, когда будем собирать конфигурацию целиком.
Главное в одном абзаце
Часть интерфейса разработчику не принадлежит: главное меню «содержит только общие команды, не имеющие прикладной специфики, и не может быть изменено разработчиком конфигурации». Платформа даёт главное меню, переходы «вперёд» и «назад» с историей на время сеанса, меню функций, избранное и два вида окон — основное для навигации и вспомогательные для работы с объектами; от режима окон и зависит, откроется форма в рабочей области или отдельным окном. Отдельно стоят функции для технического специалиста: их включают в параметрах, и они дают перечень всех объектов конфигурации независимо от того, включены ли они в командный интерфейс, — это способ добраться до формы без оглавления и проверить её, но не замена оглавлению. Стандартные функции платформы вроде управления полнотекстовым поиском к конфигурации не относятся, и форм их в дереве нет. Вместе с прошлыми разговорами складывается картина из трёх слоёв: платформа, разработчик, пользователь — и читать интерфейс стоит именно в этом порядке.
Командный интерфейс собран, и формы в нём разложены по местам. Но до сих пор мы читали формы одного рода — карточки записей и списки. А ведь бывают и другие: формы выбора, формы отчётов, окна настроек, формы без объекта вовсе. Чем они отличаются и как их читать?
Контрольные вопросы
- Какую часть интерфейса разработчик конфигурации изменить не может?
- Что платформа кладёт в заголовок основного окна?
- Чем основное окно отличается от вспомогательного?
- От чего зависит, откроется форма в рабочей области или отдельным окном?
- Что показывают функции для технического специалиста и чем этот перечень отличается от раздела?
- Почему стандартные функции нельзя найти в дереве конфигурации?
- Из каких трёх слоёв складывается интерфейс программы?
Упражнения
По образцу. Откройте через функции для технического специалиста любой объект «Канцтоваров», которого нет в разделах, и закройте его.
Своё: разложите по слоям. Возьмите пять вещей, которые видит пользователь — кнопку «Записать», раздел «Закупки», историю переходов, начальную страницу, избранное, — и скажите, чей это слой.
Ловушка: «не нашёл в дереве — значит, сломано». Коллега ищет в конфигурации форму окна сообщений и не находит. Что вы объясните?
Обратный ход. Пользователь говорит, что открывает нужный ему список через меню технического специалиста, потому что «иначе никак». Что это говорит о конфигурации?
На чтение. В чужой программе у пользователей включён режим технического специалиста у всех. Чем это неудобно и чем опасно?
Ответы — в конце части.
Ответы к главе 8
§ 8.1. Командный интерфейс: оглавление, которое ведёт к формам
К вопросу 1. Ответ. Командная панель живёт внутри формы и говорит о записи, которая уже открыта. Командный интерфейс живёт над всеми формами и служит входом в программу: через него формы открывают.
К вопросу 2. Ответ. Подсистемы в ветке «Общие» — какие разделы есть; свойство конфигурации «Командный интерфейс» — кому какие разделы видны; «Командный интерфейс основного раздела» — что лежит в «Главном».
К вопросу 3. Ответ. Платформа сама берёт объекты подсистемы, берёт их стандартные команды, раскладывает по группам раздела и назначает видимость по умолчанию. Разработчик правит готовое, а не пишет перечень.
К вопросу 4. Ответ. Включить его в подсистему. Ещё нужно, чтобы у объекта были стандартные команды, команда не была скрыта в редакторе командного интерфейса и у пользователя были права на объект.
К вопросу 5. Ответ. Основная форма списка этого объекта — та, что назначена в окне редактирования объекта.
К вопросу 6. Ответ. Разработчик — какие разделы есть, что в них и кому они видны. Пользователь — какие панели показывать, где их держать и что вынести в избранное.
К вопросу 7. Указание. Четыре адреса, и любой объясняет пропажу целиком.
Полное решение. Права пользователя на объект; состав подсистемы — включён ли объект; видимость команды в командном интерфейсе; личные настройки панелей. Порядок — рабочий, а не по частоте: проверив первый адрес, идут дальше, пока команда не найдётся.
К упражнению «По образцу». Ответ. Пока разделов нет, путь один: общий перечень команд программы, в нём справочники, в них «Контрагенты». Щелчков получается больше, чем в программе с разделами, — это и есть цена отсутствующего оглавления.
К упражнению «Своё: набросайте оглавление». Ответ. Естественное деление — «Закупки» (поступления, контрагенты, склады) и «Продажи» (реализации, контрагенты, товары). Признак деления — работа человека, а не вид объекта: кладовщик и продавец открывают разные документы.
К упражнению «Ловушка: „команды нет — значит, объекта нет"». Ответ. Справочник в программе есть почти наверняка. Проверяют по порядку: права пользователя, включён ли справочник в эту подсистему, не скрыта ли команда в командном интерфейсе, не спрятал ли пользователь панель.
К упражнению «Обратный ход». Ответ. Команда раздела открывает основную форму списка. Значит, основной назначена не та форма, которую ждал разработчик, — смотреть надо в основные формы объекта, а не в подсистему.
К упражнению «На чтение». Ответ. Такая форма открывается только из другой формы или из кода: её не включили ни в одну команду интерфейса. Стоит выяснить, задумано ли это: если форма нужна пользователю сама по себе, до неё нет пути по оглавлению.
§ 8.2. Подсистемы: из чего складываются разделы
К вопросу 1. Ответ. Вид деятельности — работу, которую делают в программе. Раздел и есть место для одного вида работы, поэтому одна подсистема первого уровня даёт один раздел.
К вопросу 2. Ответ. Отбором в дереве конфигурации: включил отбор по подсистеме — видишь только её объекты. В большой конфигурации это первый способ не утонуть.
К вопросу 3. Ответ. «Включать в командный интерфейс». Без него подсистема живёт и работает как группировка, а раздела у пользователя нет.
К вопросу 4. Ответ. Из синонима подсистемы.
К вопросу 5. Ответ. Может. Пользователь увидит один и тот же список из двух разделов — это не две копии, а один объект, показанный в двух местах оглавления.
К вопросу 6. Ответ. Не разделами, а группами команд внутри раздела своего родителя.
К вопросу 7. Указание. Откуда пользователь узнаёт, что объект есть?
Полное решение. Ни из какого раздела он не виден: команд в оглавлении у него нет. Добраться можно только из другой формы, по ссылке или из общего перечня команд. Если объект нужен пользователю сам по себе — это недоделка.
К упражнению «По образцу». Ответ. Подсистема «Склад» с синонимом «Склад» и пояснением вроде «Хранение и остатки»; флажок командного интерфейса включён по умолчанию, и его стоит проверить.
К упражнению «Своё: разделите работу». Ответ. Например: «Закупки», «Продажи», «Доставка», «Справочники». Признак деления — работа человека: закупщик, продавец, курьер открывают разные документы.
К упражнению «Ловушка: „убрал из командного интерфейса — удалил подсистему"». Ответ. Исчез только раздел. Подсистема на месте, её состав тоже, отбор по ней в дереве работает — но пользователь этот участок работы больше не видит.
К упражнению «Обратный ход». Ответ. До «Валют» добираются не из раздела: их открывают из других форм — например, выбором в поле документа, — или из общего перечня команд. Ещё вариант: справочник заполняют один раз при настройке, и отдельный путь к нему не нужен.
К упражнению «На чтение». Ответ. Автор делил программу по объектам, а не по видам работы: получилось восемнадцать разделов вместо трёх-четырёх. Панель разделов у такого оглавления длиннее, чем список команд в каждом из них, и пользователю приходится помнить, в каком разделе что лежит.
§ 8.3. Объект в подсистеме: одна связь, два окна
К вопросу 1. Ответ. В двух местах, и это одна и та же связь: закладка подсистем в окне редактирования объекта и состав подсистемы.
К вопросу 2. Ответ. Стандартные команды объекта: открыть список, создать новую запись, а у отчёта — открыть отчёт.
К вопросу 3. Ответ. Объекты конфигурации. Форм в составе подсистемы нет.
К вопросу 4. Ответ. Основная форма того вида, который нужен команде: для команды списка — основная форма списка. Задаётся она в окне редактирования объекта, а не в подсистеме.
К вопросу 5. Ответ. Команду открыть список в обоих разделах. За двумя строками оглавления стоит один объект и одна форма.
К вопросу 6. Указание. Прочитайте название раздела и спросите, чья это работа.
Полное решение. Раздел — место для одного вида работы. «Справочники» и «Документы» не отвечают на вопрос, чья это работа: закупщику приходится ходить в оба раздела, и оглавление перестаёт помогать. Деление по работе — «Закупки», «Продажи», «Склад» — даёт каждому своё место.
К вопросу 7. Ответ. Что до справочников добираются из формы документа — по ссылке в поле. Это решение, а не ошибка; но если справочник заполняют часто, команду в разделе стоит добавить.
К упражнению «По образцу». Ответ. После включения «Складов» в обе подсистемы команда открыть список складов появляется и в «Закупках», и в «Продажах», а форма у неё одна.
К упражнению «Своё: соберите раздел». Ответ. Для «Склада» — «Товары» (что храним), «Склады» (где храним), отчёт об остатках (сколько лежит). Документы поступления и реализации можно и не включать: кладовщик смотрит остатки, а документы заводят закупщик и продавец.
К упражнению «Ловушка: „объект в двух разделах — два объекта"». Ответ. Ничего не удвоилось: справочник один, форма одна. Скорее всего, список открыт давно и не обновлён, или в нём стоит отбор. Разделы на состав справочника не влияют.
К упражнению «Обратный ход». Ответ. Команду открытия списка выключили в командном интерфейсе подсистемы — объект в разделе остался, а одна из его команд не показывается. Второй вариант: у пользователя нет прав на просмотр списка.
К упражнению «На чтение». Ответ. Работа в этом разделе — ведение справочных данных: один документ и восемь справочников говорят, что раздел собрали вокруг настройки, а не вокруг ежедневной работы с документами.
§ 8.4. Командный интерфейс подсистемы: что видно в разделе
К вопросу 1. Ответ. Панель навигации — команды, открывающие формы списков; панель действий — создание записей, отчёты, обработки. Первая отвечает на вопрос «куда пойти», вторая — «что сделать».
К вопросу 2. Ответ. «Важное», «Обычное» и «См. также»; подписью выделена последняя — в ней вспомогательные и редко используемые команды.
К вопросу 3. Ответ. Видимость команды, группу, порядок внутри группы и видимость по ролям.
К вопросу 4. Указание. Что остаётся в конфигурации в каждом случае?
Полное решение. Исключили объект из подсистемы — раздел теряет все его команды. Выключили команду — объект в подсистеме, формы работают, а этой команды в разделе нет. Отсюда и правило поиска: пропала одна команда — смотрят командный интерфейс, пропали все — состав подсистемы.
К вопросу 5. Ответ. Пользователь включает и выключает доступные ему команды и меняет их порядок, если у него есть право сохранять свои настройки. Вернуть себе команду, закрытую правами или функциональной опцией, он не сможет.
К вопросу 6. Ответ. Каждый объект даёт несколько команд: открыть список, создать запись, а отчёт — открыть отчёт. Три объекта дают шесть команд и больше.
К вопросу 7. Ответ. Что работа в нём начинается с ввода, а не с просмотра: человек приходит туда создавать документы. Так устроены разделы вроде кассы или приёмки.
К упражнению «По образцу». Ответ. В «Продажах» команда списка реализаций переносится в «Важное», команда создания контрагента выключается. В разделе реализации становятся первой строкой.
К упражнению «Своё: расставьте приоритеты». Ответ. «Важное» — остатки товаров, то, ради чего кладовщик открывает раздел. «Обычное» — товары, склады. «См. также» — единицы измерения и прочее, что трогают раз в квартал.
К упражнению «Ловушка: „команды нет — значит, объект убрали"». Ответ. Сначала командный интерфейс подсистемы: не выключена ли видимость именно этой команды. Если объект исключён из подсистемы, пропали бы все его команды разом — и список, и создание.
К упражнению «Обратный ход». Ответ. Пользователи настроили раздел под себя — выключили часть команд в своих настройках. Роль у них одна, а личные настройки разные.
К упражнению «На чтение». Ответ. Раздел собирали долго и не пересматривали: важного в нём не осталось, а всё, что добавляли позже, сваливали в «См. также». Пользователь каждый раз ищет команду глазами в самой длинной группе.
§ 8.5. Начальная страница: с чего начинается работа
К вопросу 1. Ответ. Раздел показывает команды — пути к формам. Начальная страница показывает сами формы, уже готовые, без щелчка.
К вопросу 2. Ответ. Те, что содержат самую важную для человека информацию и с которых он начинает работу: список документов за день, список заказов, отчёт с остатками.
К вопросу 3. Ответ. В свойствах конфигурации — в рабочей области начальной страницы.
К вопросу 4. Ответ. Форма. Не объект и не команда: выбирают конкретную форму из тех, что есть в конфигурации.
К вопросу 5. Указание. Кто и когда добывает данные для каждой формы?
Полное решение. Каждая форма страницы получает свои данные с сервера и показывает их — без всякого щелчка. Две формы — две порции работы, пять — пять. Поэтому тяжёлые отчёты на начальной странице человек ждёт каждый раз, когда её открывает.
К вопросу 6. Ответ. Пользователь собирает свой состав и порядок, но только из списка форм, заданного в конфигурации, и только из того, на что у него есть права.
К вопросу 7. Ответ. Что форма задумана как начало работы и другого пути к ней нет: вернуться к ней можно только на начальную страницу. Стоит проверить, очевиден ли этот путь.
К упражнению «По образцу». Ответ. Отчёт встаёт рядом со списками, и показ страницы становится дольше: отчёт формируется, а не просто показывает готовые строки.
К упражнению «Своё: начало дня». Ответ. Кладовщику — список поступлений (что принять) и отчёт об остатках (что уже лежит). Карточки товаров ему не нужны: он открывает их из документа.
К упражнению «Ловушка: „убрал форму — сломал начальную страницу"». Ответ. Он убрал формы только у себя: личная настройка действует на одного человека. В конфигурации состав прежний, у остальных страница не изменилась.
К упражнению «Обратный ход». Ответ. Что добавили на начальную страницу. Скорее всего, на неё поставили отчёт или тяжёлый список: их данные собираются при каждом показе страницы.
К упражнению «На чтение». Ответ. Этот пользователь смотрит, а не вводит: руководитель или аналитик. Программу он открывает ради цифр, и документы если и заводит, то редко.
§ 8.6. Главное меню: то, что даёт сама платформа
К вопросу 1. Ответ. Главное меню окон: в нём только общие команды, без прикладной специфики, и разработчик конфигурации изменить его не может.
К вопросу 2. Ответ. Переходы «вперёд» и «назад» с историей, меню функций текущего раздела, избранное и стандартную командную панель.
К вопросу 3. Ответ. Основное окно — для навигации по конфигурации и вызова команд; вспомогательное — для работы с объектом: документом, карточкой, отчётом.
К вопросу 4. Ответ. От режима открытия форм, заданного для программы, а не от самой формы.
К вопросу 5. Указание. Что попадает в перечень и по какому признаку?
Полное решение. Перечень показывает все объекты конфигурации независимо от того, включены ли они в командный интерфейс. Раздел показывает только то, что включено в подсистему и не выключено в её командном интерфейсе. Поэтому через этот перечень видно и то, до чего по оглавлению пути нет.
К вопросу 6. Ответ. Они принадлежат платформе, а не конфигурации: их форм в дереве нет и быть не может.
К вопросу 7. Ответ. Платформа, разработчик, пользователь. Платформа даёт окна и общие команды, разработчик — разделы, команды и начальную страницу, пользователь настраивает панели, избранное и свой состав страницы.
К упражнению «По образцу». Ответ. В «Канцтоварах» это склады или единицы измерения: в подсистемы мы их не включали, а через перечень объектов они открываются.
К упражнению «Своё: разложите по слоям». Ответ. Кнопка «Записать» — разработчик (команда объекта, кнопка в форме); раздел «Закупки» — разработчик; история переходов — платформа; начальная страница — разработчик задаёт список, пользователь выбирает своё; избранное — пользователь.
К упражнению «Ловушка: „не нашёл в дереве — значит, сломано"». Ответ. Окно сообщений — часть платформы, а не конфигурации. Его формы в дереве нет и не будет, искать нечего.
К упражнению «Обратный ход». Ответ. Что оглавление собрано плохо: нужного человеку объекта нет ни в одном разделе. Служебный перечень — инструмент того, кто настраивает программу, а не рабочий путь пользователя.
К упражнению «На чтение». Ответ. Неудобно: перечень длинный, в нём все объекты подряд, и человек ищет нужное среди служебного. Опасно тем, что открываются и те формы, которые пользователю не предназначались, — а границу здесь держат только права.
§ 9.1. Форма элемента: одна запись справочника
В окне редактирования справочника «Товары» есть пять строк основных форм: форма объекта, форма группы, форма списка, форма для выбора и форма для выбора группы. Заполнена у нас одна — та карточка, которую мы собирали всю книгу. Остальные пусты, и на их месте платформа строит формы сама. Пять строк — это пять случаев, в которых справочнику нужна форма, и первый из них — разговор об одном элементе.
1. Пять ролей одного справочника
Каждая строка — это роль: случай, в котором платформа позовёт форму.
| роль | когда платформа её зовёт |
|---|---|
| форма объекта | открыть один элемент — карточку товара |
| форма группы | открыть папку, если справочник иерархический |
| форма списка | показать все элементы |
| форма для выбора | выбрать элемент для поля другого объекта |
| форма для выбора группы | выбрать папку |
Документация описывает первую строку так: она задаёт форму, «которая будет вызвана системой для выполнения стандартных действий со справочником», — открыть элемент, записать, закрыть. Если строка пуста, «система генерирует форму по умолчанию» — ту самую автоформу, с которой книга начиналась.
2. Вид формы — это роль, а не клеймо
Форма в дереве объекта не помечена как «форма элемента». Видом её делает назначение: в какую строку основных форм её поставили.
| что бывает | что это значит |
|---|---|
| форма назначена формой объекта | её откроют для одного элемента |
| та же форма назначена и формой выбора | она же откроется при выборе |
| форма не назначена ни в одну строку | сама не откроется: её открывают из кода |
Значит, читаем так: чтобы понять вид чужой формы, мало открыть саму форму. Надо посмотреть, в какой строке объекта она стоит, — там и написано, кем её считает платформа.
Сама форма ролью не помечена. Вид формы — это роль, в которой её вызывают, и назначают её у объекта, а не у формы.
Рядом с основными у справочника есть и дополнительные формы — запасной случай: документация говорит, что такая форма вызывается, «если основная форма не установлена или не может быть использована».
3. Что делает форму формой элемента
Роль ролью, но и устроена такая форма узнаваемо. Признаков три, и все мы уже разбирали по отдельности.
| признак | где смотреть |
|---|---|
| основной реквизит типа «объект справочника» | список реквизитов формы |
| стандартные команды записи и закрытия | список команд |
| поля, связанные с реквизитами записи | пути к данным элементов |
Первый признак — главный: тип основного реквизита говорит, что форма об одной записи. Второй следует из первого: раз есть запись, её можно записать.
4. Что есть в карточке всегда
Часть содержимого карточки задана не нами, а видом объекта: у любого справочника есть стандартные реквизиты.
| реквизит | что это |
|---|---|
| код | номер элемента в справочнике |
| наименование | как элемент называется |
| пометка удаления | помечен ли на удаление |
| родитель | в какой группе лежит, если справочник иерархический |
Поэтому карточка любого справочника в любой конфигурации выглядит похоже: сверху код и наименование, дальше свои реквизиты. Это не традиция, а следствие того, что у справочников общий набор стандартных реквизитов.
5. Форма элемента и форма группы
Из этого общего ядра вырастает и отличие группы: у неё обычно остаётся только оно. Элемент и группа в иерархическом справочнике — разные вещи, поэтому и формы у них разные.
| элемент | группа | |
|---|---|---|
| что это | товар | папка «Бумага» |
| какие реквизиты | все свои: артикул, единица | обычно только код и наименование |
| какая роль | форма объекта | форма группы |
Отсюда и знакомая ловушка: разработчик собрал красивую карточку товара, а пользователь открывает папку и видит автоформу. Причина не в ошибке, а в ролях: для группы назначена другая строка, и она пуста.
6. Как читать форму элемента в чужой конфигурации
Разбор короткий, потому что вид задаёт ожидания.
| что проверяем | что узнаём |
|---|---|
| тип основного реквизита | о какой записи разговор |
| строку основных форм у объекта | в какой роли форма назначена |
| есть ли форма группы | что увидит пользователь, открыв папку |
| состав полей против реквизитов объекта | что показано, а что скрыто |
Последняя строка — привычка из главы о данных: сравнить список реквизитов объекта с полями формы и увидеть, чего на экране нет. Не выводят при этом и стандартные реквизиты: код на форме бывает лишним не реже, чем свои поля.
И правило на будущее, когда роли раздаёте вы: пока хватает автоформы, своей формы не делают; её назначают там, где нужны свои поля, свой порядок или свои команды. Для карточки это самый частый источник вопросов «а где артикул».
7. В Конфигураторе
Посмотрим на роли, не меняя ничего.
- Откройте окно редактирования справочника «Товары» и найдите строки основных форм. Перепишите, какие заполнены.
-
Проверьте строку формы объекта: в ней должна стоять наша карточка. Остальные строки пусты.
-
Откройте в Предприятии группу товаров — например, «Бумага». Это автоформа группы: строка формы группы пуста.
-
Вернитесь в Конфигуратор и посмотрите на список форм справочника: форма одна, а ролей пять. Роли раздаются здесь, в окне объекта.
-
Ничего не меняйте: формы выбора и группы понадобятся в следующих разговорах.
Главное в одном абзаце
У справочника пять ролей для форм: форма объекта, группы, списка, выбора и выбора группы; в каждой строке указывают форму, а если строка пуста, платформа строит форму сама. Вид формы — это роль, в которой её назначили, а не свойство самой формы: одна форма может стоять в двух ролях, а форма, не назначенная никуда, откроется только командой. Рядом живут дополнительные формы — их вызывают, когда основная не задана или не подходит. Форму элемента узнают по трём признакам: основной реквизит типа объекта справочника, стандартные команды записи и закрытия, поля с путями к реквизитам записи. Часть карточки задана не разработчиком, а видом объекта: код, наименование, пометка удаления, родитель — поэтому карточки справочников всюду похожи. У иерархического справочника элемент и группа — разные роли, и если форма группы не назначена, пользователь увидит автоформу. В чужой конфигурации читают тип основного реквизита, строки основных форм и состав полей против реквизитов объекта.
Карточка говорит об одной записи. Но тот же справочник умеет показывать себя и целиком — списком, и мы такую форму уже собирали. Что в ней устроено иначе и почему список живёт по другим правилам?
Контрольные вопросы
- Какие пять ролей для форм есть у справочника?
- Что происходит, если строка основной формы пуста?
- Почему вид формы — это роль, а не свойство самой формы?
- Зачем нужны дополнительные формы?
- По каким трём признакам узнают форму элемента?
- Откуда в карточке берутся код и наименование?
- Почему пользователь может увидеть автоформу, хотя карточка в конфигурации собрана?
Упражнения
По образцу. Посмотрите строки основных форм у справочника «Контрагенты» и скажите, что откроется при выборе контрагента в документе.
Своё: раздайте роли. Для справочника «Склады» решите, какие формы вы бы сделали своими, а какие оставили платформе, и объясните почему.
Ловушка: «сделал форму — она и откроется». Разработчик собрал форму элемента, но не назначил её. Что увидит пользователь и почему?
Обратный ход. В чужой конфигурации у справочника одна форма, а заполнены две строки основных форм. Как это работает?
На чтение. В карточке товара чужой конфигурации нет поля «Код», хотя реквизит стандартный. Какие объяснения возможны?
Ответы — в конце части.
§ 9.2. Форма списка: разговор о многих записях
Карточка говорит об одной записи — её можно поправить и записать. Список говорит о многих, и поправить в нём нечего: он показывает то, что уже лежит в базе. От этой разницы и растут все остальные: какие команды у формы, что значит «текущая», кто её открывает и чем она заканчивается.
1. Что меняется, когда записей много
Сравним два разговора по одним и тем же вопросам.
| вопрос | карточка | список |
|---|---|---|
| о чём разговор | об одной записи | о наборе записей |
| что в основном реквизите | объект справочника или документа | динамический список |
| что можно записать | эту запись | ничего |
| если своей формы нет | платформа строит автоформу | платформа строит автоформу |
| что такое «сейчас» | открытая запись | текущая строка |
| чем заканчивается | записью или отказом | переходом к записи |
Последняя строка — самая важная. Список почти всегда не конец пути, а развилка: из него открывают карточку, начинают новый документ, выбирают значение для другого поля.
Карточка — разговор об одном. Список — разговор о многих, который обычно заканчивается тем, что из него выходят к одному.
2. Роль списка у разных объектов
Роль «форма списка» есть почти у каждого объекта, но набор ролей у них разный.
| объект | какие роли для форм |
|---|---|
| справочник | объекта, группы, списка, выбора, выбора группы |
| документ | объекта, списка, выбора |
| регистр сведений | записи и списка |
Разница объяснима. У документов нет групп — значит, нет и форм группы. У регистра сведений единица хранения называется записью, поэтому и роль зовётся формой записи; по смыслу это та же роль, что форма объекта у справочника, — работа с одной единицей. А форма списка есть у всех трёх: показывать множество умеет каждый из них.
3. Кто открывает список
У карточки один обычный вход — из списка. У списка входов несколько, и это делает его точкой сборки.
| откуда | что произошло |
|---|---|
| команда раздела | пользователь выбрал «Товары» в оглавлении |
| начальная страница | список открыт при запуске |
| поле другого объекта | список открылся для выбора значения |
| перечень объектов конфигурации | служебный путь без оглавления |
Три первых входа мы разбирали в разговорах о командном интерфейсе. Третий вход особый: когда список открывают ради выбора, платформа зовёт не эту форму, а форму выбора.
4. Текущая строка вместо записи
В карточке всё, что делают кнопки, относится к открытой записи. В списке предмет действия — текущая строка.
| команда списка | к чему относится |
|---|---|
| открыть | к текущей строке |
| пометить на удаление | к текущей строке |
| скопировать | к текущей строке |
| создать | ни к чему: заводит новую запись |
Практическое следствие: команда в форме списка почти всегда означает «сделать что-то с той записью, на которой стоит курсор». Если команда должна работать с несколькими строками сразу, это отдельное решение разработчика, и написано оно кодом.
5. Чего у списка нет
Список не умеет того, что для карточки естественно, — и это не упущение.
| чего нет | почему |
|---|---|
| команды «Записать» | записывать нечего: строки принадлежат базе |
| команды «Провести» | проводят документ, а не список |
| проверки заполнения | она срабатывает при записи, а записи здесь нет |
| признака изменённости | список не меняют, его показывают |
Всё это следствия одного: в основном реквизите формы списка лежит не запись, а динамический список — основная таблица, отбор, порядок. Записывать в нём нечего, и всё, что связано с записью, отпадает разом. Мы разбирали это, когда говорили о динамическом списке; здесь важно, что из этого выходит для вида формы в целом.
6. Что список говорит о работе
Форма списка — короткий рассказ о том, как с этими записями работают.
| что видно | что это значит |
|---|---|
| колонок три-четыре | список для поиска записи, а не для чтения данных |
| колонок пятнадцать | по списку работают, не открывая карточек |
| отбор в настройках | показывают не всё: часть записей не для этих глаз |
| кнопок нет, кроме поиска | список только для просмотра и выбора |
| своя команда в панели | из списка делают что-то ещё, кроме открытия карточки |
Последняя строка — повод для вопроса, который часто оказывается главным: зачем человеку этот список. Если в нём есть свои команды, значит, работа идёт прямо здесь, а карточка нужна не всегда.
7. В Конфигураторе и в Предприятии
Сравним два списка и убедимся, что разница — в объекте, а не в форме.
- Откройте в Предприятии список товаров и список поступлений. Сравните колонки и кнопки.
-
Найдите в списке поступлений команды, которых нет у товаров. Объясните каждую видом объекта.
-
В Конфигураторе откройте окна редактирования справочника «Товары» и документа «Поступление товаров». Сравните строки основных форм: у справочника их пять, у документа три.
-
Встаньте в списке товаров на строку и нажмите пометку на удаление — потом снимите её. Действие относилось к текущей строке.
-
Верните список в исходное состояние: помеченных на удаление товаров быть не должно.
Главное в одном абзаце
Форма списка — разговор о многих записях, и от этого меняется всё: в основном реквизите не запись, а динамический список; записывать нечего; вместо открытой записи есть текущая строка, к которой относятся почти все команды. Роль «форма списка» есть почти у каждого объекта, но набор ролей разный: у справочника пять, у документа три, у регистра сведений две — групп у документов нет, а вместо объекта у регистра запись. Открывают список из оглавления, с начальной страницы или служебным перечнем, а при выборе значения платформа зовёт не его, а форму выбора. Команд «Записать», «Провести» и проверки заполнения у списка нет — это следствия того, что строки принадлежат базе, а не форме. Читают список по составу колонок, отборам и командам: он рассказывает, ищут по нему запись или работают прямо в нём.
Список показывает записи, чтобы человек нашёл нужную. Но когда список открывают из поля документа, задача другая: не посмотреть, а выбрать одну запись и вернуть её в поле. Что меняется в форме, когда её зовут для выбора?
Контрольные вопросы
- Чем разговор о многих записях отличается от разговора об одной?
- Почему у формы списка нет команды «Записать»?
- Какие роли для форм есть у документа и почему их меньше, чем у справочника?
- Как называется роль формы для одной записи регистра сведений?
- К чему относятся команды формы списка?
- Откуда пользователь может попасть в список?
- О чём говорит список с пятнадцатью колонками?
Упражнения
По образцу. Сравните списки контрагентов и реализаций: колонки, кнопки, роли форм у объектов.
Своё: спроектируйте список. Какие колонки вы бы вывели в список поступлений для закупщика и почему именно их?
Ловушка: «удалил строку — удалил запись». В списке товаров пользователь нажал пометку на удаление и говорит, что товар исчез из базы. Что вы объясните?
Обратный ход. В чужой конфигурации у документа заполнена только строка формы списка, а формы объекта нет. Что увидит пользователь, открыв документ из списка?
На чтение. В списке справочника есть своя команда «Объединить дубли» и нет команды создания. Что это за список и как с ним работают?
Ответы — в конце части.
§ 9.3. Форма выбора: вернуть одно значение в поле
Откройте поступление и нажмите кнопку выбора рядом с полем «Контрагент». Откроется список контрагентов — похожий на тот, что открывается из раздела, но ведёт он себя иначе: двойной щелчок не открывает карточку, а закрывает окно и подставляет выбранного контрагента в поле. Это не список. Это форма выбора — и отличает её не устройство, а задача.
1. Роль, в которой зовут эту форму
У справочника есть отдельная строка основных форм — форма для выбора. Документация описывает её так: это форма, «которая будет вызвана системой для выполнения стандартных действий для выбора элемента или группы справочника».
| что происходит | какую роль зовёт платформа |
|---|---|
| пользователь открыл список из раздела | форму списка |
| пользователь нажал выбор в поле | форму для выбора |
| выбирают папку, а не элемент | форму для выбора группы |
Если строка формы выбора пуста, платформа строит автоформу — такую же, как для списка, только в режиме выбора. Поэтому они и похожи: собраны по одним правилам, а вызваны с разными целями.
2. Что меняется в режиме выбора
Задача другая — и поведение формы меняется, хотя элементы те же.
| список | выбор | |
|---|---|---|
| зачем открыли | найти и посмотреть | вернуть значение в поле |
| двойной щелчок | открывает карточку | подставляет значение и закрывает окно |
| чем заканчивается | переходом к записи | возвратом в поле, из которого позвали |
| кто ждёт результата | никто | поле документа |
У таблицы для этого есть свойство — режим выбора. Включает его не разработчик: документация помечает, что на клиенте оно доступно только для чтения, — режим ставит платформа, когда открывает форму для выбора.
Список отвечает на вопрос «что тут есть». Форма выбора отвечает на вопрос «какое из этих значений вы имели в виду».
3. Закрываться или остаться
У формы есть свойство «закрывать при выборе». Документация говорит о нём прямо: это признак того, что форму нужно закрывать после выбора, по умолчанию он включён, а если выключить, «можно использовать форму для выбора нескольких позиций или элементов».
| значение | как ведёт себя форма |
|---|---|
| включено, по умолчанию | выбрали одно значение — окно закрылось |
| выключено | окно остаётся, можно выбирать ещё |
Вторая строка — это и есть форма подбора, знакомая всем, кто работал с торговыми программами: выбрали товар, он встал строкой в документ, окно осталось открытым — выбирайте следующий. Правило чтения простое: форма выбора не закрылась — проверьте это свойство. Чаще всего её задумали для подбора.
4. Когда формы выбора не будет вовсе
Иногда выбор происходит без всякого окна: щёлкнули по полю — выпал короткий список значений. Решает это свойство справочника — способ выбора.
| способ выбора | что увидит пользователь |
|---|---|
| из формы | откроется форма выбора |
| быстрый выбор | выпадающий список прямо в поле |
| обоими способами | доступно и то и другое; что показать сразу, решает отдельный флажок быстрого выбора |
Рабочее правило: коротким справочникам быстрый выбор к месту — единиц измерения пять, и окно для них лишний шаг. Длинным он не годится: выпадающий список на тысячу строк бесполезен, там нужна форма с поиском и отбором.
Есть и третий путь к значению. Начните печатать «бум» прямо в поле — платформа сама найдёт бумагу; формы при этом не открывается вовсе. Называется это вводом по строке, а поля, по которым так искать, задают у объекта списком.
5. Откуда у формы выбора отбор
Форма выбора часто показывает не всё. Причина — в поле, из которого её позвали: вместе с просьбой выбрать платформа передаёт форме ограничения.
| что видно | откуда это |
|---|---|
| в списке только часть записей | отбор, заданный у поля в форме, откуда позвали |
| выбрать можно только элемент, но не папку | так задано у поля |
| список уже позиционирован на значении | в поле уже было значение |
Для читателя это важный поворот: странности формы выбора объясняются не в ней самой. Увидели в форме выбора половину справочника — смотрите свойства того поля, из которого её вызвали: отбор задан там.
6. Как узнать форму выбора в чужой конфигурации
Признаки читаются по роли и свойствам.
| признак | что значит |
|---|---|
| форма стоит в строке «основная форма для выбора» | её зовут при выборе |
| у таблицы включён режим выбора | форма работает на возврат значения |
| свойство «закрывать при выборе» выключено | это подбор, а не одиночный выбор |
| в форме есть свои команды вроде «Подобрать» | работа идёт прямо здесь |
Последняя строка — частый случай в торговых конфигурациях: форма выбора разрастается до рабочего места, где человек набирает корзину. Про «одно значение» это уже не разговор, и к таким формам мы ещё вернёмся в этой главе.
7. В Конфигураторе и в Предприятии
Посмотрим на три пути к значению.
-
Откройте поступление и нажмите выбор у поля «Контрагент»: открылась автоформа выбора. Выберите контрагента — окно закрылось, значение в поле.
-
В том же поле напечатайте первые буквы названия контрагента. Платформа подставит значение без всякой формы — это ввод по строке.
-
В Конфигураторе откройте справочник «Единицы измерения» и задайте ему быстрый выбор.
-
Обновите конфигурацию и откройте карточку товара: в поле единицы измерения теперь выпадающий список, а не окно.
-
Оставьте это как есть, а «Товарам» быстрый выбор не задавайте.
Главное в одном абзаце
Форма выбора — это не отдельное устройство, а роль: платформа зовёт её, когда значение надо вернуть в поле. Строка «основная форма для выбора» указывает, какую форму взять; если строка пуста, строится автоформа, поэтому список и выбор так похожи. В режиме выбора форма ведёт себя иначе: двойной щелчок подставляет значение и закрывает окно, а режим выбора у таблицы включает сама платформа. Свойство «закрывать при выборе» решает, закроется окно после первого значения или останется для подбора нескольких. Иногда формы выбора не будет вовсе: короткому справочнику задают быстрый выбор — выпадающий список прямо в поле, а ввод по строке находит запись по набранным буквам. Отбор, с которым открылась форма выбора, приходит из поля, откуда её позвали, — там и надо искать причину, если показана только часть записей.
Справочник и документ мы читали рядом, как будто это одно и то же. Но у документа есть дата, номер и проведение, а у справочника их нет. Чем формы документа отличаются от форм справочника и что из этого следует для чтения?
Контрольные вопросы
- В какой роли платформа зовёт форму выбора?
- Почему форма выбора так похожа на форму списка?
- Что меняется в поведении формы, когда её открыли для выбора?
- Кто включает режим выбора у таблицы?
- Что делает свойство «закрывать при выборе» и для чего его выключают?
- В каких случаях формы выбора не будет вовсе?
- Где искать причину, если форма выбора показывает только часть записей?
Упражнения
По образцу. Нажмите выбор у поля «Склад» в поступлении и скажите, какая форма открылась и почему именно она.
Своё: кому быстрый выбор. Пройдите по справочникам «Канцтоваров» и решите, какому из них стоит задать быстрый выбор, а какому нет. Объясните каждое решение.
Ловушка: «выбрал товар — окно закрылось, а надо десять». Кладовщик жалуется, что набирать десять товаров в документ неудобно. Что можно изменить и где?
Обратный ход. В чужой конфигурации форма выбора контрагентов показывает только покупателей, хотя в справочнике есть и поставщики. Где искать причину?
На чтение. В форме выбора товаров есть таблица остатков по складам и своя команда «Подобрать». Что это за форма и зачем её такой сделали?
Ответы — в конце части.
§ 9.4. Документ и справочник: одна запись, разные правила
Поставьте рядом карточку товара и форму поступления. Устроены они одинаково: основной реквизит, поля с путями к данным, группы, командная панель. А кнопки разные — у поступления есть «Провести», которой у товара нет и быть не может. Разница не в формах, а в том, что за записью стоит.
1. Что у них общего
Общего больше, чем различий, и всё это мы читали в прошлых главах.
| что одинаково | и там, и там |
|---|---|
| о чём разговор | об одной записи |
| что в основном реквизите | объект: справочника или документа |
| как живут данные формы | пришли копией, уходят при записи |
| из чего собрана форма | те же пять видов элементов |
| что будет без своей формы | платформа построит автоформу |
Поэтому всё, чему книга учила до сих пор, работает в обеих формах без оговорок. Различия начинаются там, где начинается смысл записи.
2. Справочник хранит, документ отмечает
Справочник отвечает на вопрос «что у нас есть»: товары, склады, контрагенты. Документ отвечает на вопрос «что произошло»: поступил товар, отгрузили покупателю, изменили цены.
| справочник | документ | |
|---|---|---|
| о чём запись | о вещи или лице | о событии |
| ключевые стандартные реквизиты | код, наименование | номер, дата |
| бывает ли иерархия | бывает: группы и элементы | не бывает |
| что с записью потом | правят, когда вещь изменилась | не правят: событие уже случилось |
Отсюда и разные стандартные реквизиты. Вещи нужен код и название; событию — номер и дата, потому что события выстраиваются во времени, и порядок у них важен.
Справочник говорит: «вот это у нас есть». Документ говорит: «вот это у нас произошло, такого-то числа».
Из этой разницы вырастает и то, чего у справочника нет вовсе, — проведение.
3. Проведение: то, чего у справочника нет
У документа есть свойство «Проведение». Документация описывает его коротко: оно «определяет, разрешено ли проведение документа при записи». Если разрешено, у документа появляется второе действие после записи — провести.
| действие | что делает |
|---|---|
| записать | сохраняет саму запись |
| провести | записывает движения по регистрам |
| отменить проведение | снимает признак проведённости и удаляет сделанные движения |
Движение — это запись в регистре: приход на склад, расход со склада, новая цена. Куда документ пишет такие записи, задано у него списком регистров; документация так и говорит: это «те регистры, по которым документ может выполнять движения». Поступление пишет приход, реализация — расход; справочнику писать некуда, у него движений нет.
У проведения бывает и срок. Оперативным называют проведение «сейчас» — когда документ проводят текущей датой, по горячим следам события; разрешено оно или нет, задано отдельным свойством документа. Задним числом документ проводится по другим правилам, и отсюда предупреждения, знакомые каждому пользователю: «дата документа меньше текущей» — значит, проведение уже не оперативное.
4. Что из этого видно в форме
Различия в данных дают различия на экране — и все они читаются сразу.
| что видно в форме документа | откуда это |
|---|---|
| кнопки «Провести» и «Провести и закрыть» | проведение разрешено у документа |
| признак проведённости в заголовке или поле | стандартный реквизит документа |
| «Отменить проведение» в меню | обратное действие к проведению |
| предупреждение о дате | правила оперативного проведения |
Рабочее правило: есть «Провести» — перед вами документ с разрешённым проведением, и его данные идут дальше, в регистры. Нет — либо справочник, либо документ, которому проведение запретили; тогда смотрят на номер и дату.
5. Как читают форму документа
Карточку справочника читают по вопросу «что это за вещь». Форму документа — по вопросу «что это за событие», и вопрос раскладывается на четыре.
| что смотрим | что узнаём |
|---|---|
| номер и дата | когда событие случилось |
| поля шапки | кто и где участвовал: контрагент, склад |
| табличную часть | что именно и сколько |
| итоги и проведение | чем это кончилось для учёта |
Порядок не случаен: шапка отвечает на «кто, когда, где», строки — на «что», проведение — на «что из этого следует». Так же, кстати, читают и бумажный документ: подписи и дата сверху, перечень в середине.
6. Чем формы различаются в чужой конфигурации
Признаков хватает, чтобы определить вид объекта, не заглядывая в дерево.
| признак в форме | вид объекта |
|---|---|
| поля «Код» и «Наименование» | справочник |
| поля «Номер» и «Дата» | документ |
| кнопка «Провести» | документ с разрешённым проведением |
| таблица со строками товаров | чаще документ; у справочника тоже бывает — например, контактные лица у контрагента |
| форма группы в ролях объекта | иерархический справочник |
Четвёртая строка — напоминание, что признаки не абсолютны: табличная часть бывает и у справочника. Решают первые три, а надёжнее всего — номер с датой: они есть только у документа.
7. В Конфигураторе и в Предприятии
Проверим эти признаки вживую — сначала в Предприятии, потом в дереве конфигурации.
- Откройте в Предприятии карточку товара и поступление № 12. Выпишите кнопки каждой формы и отметьте те, что есть только у документа.
-
В Конфигураторе откройте документ «Поступление товаров» и найдите свойство проведения и список движений.
-
Сравните со справочником «Товары»: ни того, ни другого у него нет.
-
В Предприятии проведите поступление № 12 и посмотрите отчёт об остатках. Потом отмените проведение и посмотрите снова.
-
Проведите документ обратно: база серии должна остаться проведённой.
Главное в одном абзаце
Форма документа и форма элемента справочника устроены одинаково: обе — разговор об одной записи, с объектом в основном реквизите, копией данных в форме и теми же элементами. Различия идут от смысла записи: справочник хранит то, что есть, и получает код с наименованием; документ отмечает то, что произошло, и получает номер с датой, а иерархии у него не бывает. Главное различие — проведение: свойство документа решает, разрешено ли оно при записи, а список движений говорит, по каким регистрам документ пишет. Отсюда и кнопки «Провести», «Отменить проведение», и предупреждения о дате, которых у справочника нет. Правило чтения короткое: есть «Провести» — это документ, и его данные идут дальше в учёт; нет — запись заканчивается собой. Карточку читают по вопросу «что это за вещь», форму документа — по вопросу «что это за событие»: номер и дата, шапка, строки, проведение.
Запись, список, выбор, документ — всё это формы о данных, которые в базе лежат. Но есть формы, которые показывают то, чего в базе нет: отчёт. Его цифры собираются в момент, когда их просят. Как устроена такая форма?
Контрольные вопросы
- Что общего у формы документа и формы элемента справочника?
- На какие разные вопросы отвечают справочник и документ?
- Почему у документа номер и дата, а у справочника код и наименование?
- Что делает проведение и где задано, куда идут движения?
- Что такое оперативное проведение и как оно даёт себя знать в форме?
- Какое правило позволяет отличить форму документа от формы справочника?
- В каком порядке читают форму документа?
Упражнения
По образцу. Сравните форму реализации и карточку контрагента: реквизиты, команды, что из этого следует.
Своё: придумайте документ. Для «Канцтоваров» предложите документ, которого ещё нет, и скажите в общих словах, какие движения он должен делать: что приходит, что расходуется, где это должно отразиться.
Ловушка: «записал — значит, учтено». Кладовщик записал поступление и удивляется, что остатки не изменились. Что вы объясните?
Обратный ход. В чужой конфигурации у формы есть номер и дата, но нет кнопки «Провести». Какие объяснения возможны?
На чтение. В чужой форме справочника есть табличная часть и кнопка «Провести». Что здесь не так и как проверить?
Ответы — в конце части.
§ 9.5. Форма отчёта: вопрос сверху, ответ снизу
Откройте отчёт об остатках товаров. Середина окна пуста: ни строк, ни цифр — сверху только настройки и кнопка «Сформировать». Нажали — появилась таблица с остатками. Закрыли окно — таблица исчезла, и никто её не записывал. Так и устроена форма отчёта: сверху вопрос, снизу ответ, и ответ этот живёт, пока открыто окно.
1. Две части одной формы
Форма отчёта делится на две части, и у каждой своя работа.
| часть | что в ней | кто её заполняет |
|---|---|---|
| настройки | период, отбор, группировки | пользователь |
| результат | таблица с цифрами | платформа, когда нажали «Сформировать» |
Между ними отношение «вопрос — ответ»: настройки задают вопрос к базе, результат показывает, что вышло. Пока вопрос не задан, ответа нет — поэтому место под него и пустует.
Карточка показывает то, что в базе лежит. Отчёт показывает то, что из базы получилось в ответ на вопрос.
2. Чем это отличается от карточки
Разница не в оформлении, а в том, откуда берутся данные и что с ними потом.
| карточка записи | форма отчёта | |
|---|---|---|
| данные при открытии | уже есть | их ещё нет |
| откуда берутся | из записи в базе | собираются запросом по настройкам |
| можно ли править | да, в полях | нет, результат только читают |
| что при закрытии | предложит записать | ничего: записывать нечего |
| что остаётся в базе | изменённая запись | ничего |
Последние две строки — главное. У отчёта нет записи, значит, нет и записи как действия: ни кнопки «Записать», ни вопроса при закрытии, ни признака изменённости. Всё, что он делает, — спрашивает и показывает.
3. Результат — это поле
Результат не какой-то особый экран, а обычный элемент формы: поле вида «поле табличного документа». Таких видов у поля двадцать, и мы уже встречали несколько — ввода, флажка, надписи, картинки.
| что видим | что это в структуре элементов |
|---|---|
| таблица с остатками | поле вида «поле табличного документа» |
| путь этого поля | реквизит формы, а не реквизит записи |
| кнопка «Сформировать» | команда, которая заполняет этот реквизит |
Отсюда и ответ на вопрос, который напрашивается: результат — данные формы, а не данные базы. Он живёт, пока открыто окно, и исчезает вместе с ним — как таблица значений, чьи строки тоже лежат в форме, а не в записи.
4. Три роли форм у отчёта
Строк основных форм у отчёта тоже несколько, и роли другие, чем у справочника.
| роль | когда её зовут |
|---|---|
| основная форма | открыть отчёт |
| основная форма настроек | открыть настройки отдельным окном |
| основная форма варианта | открыть сохранённый вариант отчёта |
Документация про вторую говорит, что это форма «для выполнения стандартных действий с настройками отчёта». Отдельное окно настроек нужно, когда настроек много: в самой форме оставляют две-три главные, а за остальными человек идёт в это окно — настроил, закрыл, вернулся к результату.
А варианты — это уже работа пользователя: у отчёта есть хранилище вариантов, и документация прямо называет его хранилищем «вариантов отчётов, создаваемых в режиме Предприятие». Настроил человек отчёт под себя, сохранил вариант — и открывает его потом как готовый вопрос.
5. Откуда берутся настройки
Самое непривычное в форме отчёта: настройки в ней чаще всего не заданы полями. Их показывает платформа — по схеме компоновки данных, которая лежит у отчёта макетом.
| что задал разработчик | что увидел пользователь |
|---|---|
| схему компоновки с полями и отборами | список настроек в форме |
| ничего в форме не размещал | настройки всё равно на месте |
Язык компоновки данных — отдельная большая тема, и в книге о формах мы её не разбираем. Для чтения формы довольно одного правила: если в форме отчёта нет ни одного поля настроек, а на экране они есть, искать их надо не в форме, а в схеме компоновки.
6. Как читать форму отчёта
Разбор идёт в другом порядке, чем у карточки: сначала вопрос, потом ответ.
| что смотрим | что узнаём |
|---|---|
| есть ли своя форма у отчёта | своя или автоформа |
| что в настройках | какой вопрос человек может задать |
| что в результате | что он получит в ответ |
| есть ли форма настроек | много ли настроек и куда их убрали |
| есть ли варианты | как отчётом пользуются на деле |
Последняя строка часто оказывается самой говорящей. Пять сохранённых вариантов у одного отчёта значат, что людям нужны пять разных вопросов, — и, может быть, стоило сделать пять отчётов или один с понятными настройками.
7. В Конфигураторе и в Предприятии
Применим этот порядок на живой форме: посмотрим её в Предприятии и найдём в Конфигураторе, где что задано.
-
Откройте в Предприятии отчёт об остатках товаров. Окно пустое: вопрос ещё не задан.
-
Нажмите «Сформировать». Появился результат. Поменяйте период или отбор и сформируйте снова — ответ другой.
-
Закройте окно. Форма не спросила, записывать ли: записывать нечего.
-
В Конфигураторе откройте отчёт и посмотрите строки основных форм: все пусты, значит, работает автоформа.
-
Найдите у отчёта схему компоновки данных. Внутрь не углубляйтесь — достаточно увидеть, что настройки живут там.
Главное в одном абзаце
Форма отчёта устроена как вопрос и ответ: сверху настройки, которые задаёт пользователь, снизу результат, который платформа собирает по нажатию «Сформировать». Данных при открытии нет, править результат нельзя, записывать нечего — поэтому ни кнопки записи, ни вопроса при закрытии у такой формы не бывает. Результат — обычный элемент формы, поле вида «поле табличного документа», и путь его ведёт к реквизиту формы: он живёт, пока открыто окно. Ролей у форм отчёта три: основная форма, форма настроек для случая, когда настроек много, и форма варианта — варианты пользователь создаёт сам, и для них есть хранилище. Сами настройки чаще всего не заданы полями: их показывает платформа по схеме компоновки данных, которая лежит у отчёта макетом, — туда и надо идти, если настройки на экране есть, а в форме их нет. Читают форму отчёта от вопроса к ответу: какие настройки, что в результате, есть ли отдельное окно настроек и сколько вариантов сохранили пользователи.
У отчёта предмет особый: не запись, а посчитанная цифра. Но бывают окна, в которых и спрашивать не о чем, — там держатся не на предмете, а на деле: набрать, разослать, свести расхождения. Чем держится такое окно и как его читать?
Контрольные вопросы
- Из каких двух частей состоит форма отчёта и кто заполняет каждую?
- Почему окно отчёта открывается пустым?
- Почему у формы отчёта нет кнопки «Записать»?
- Что такое результат с точки зрения структуры элементов?
- Какие три роли форм есть у отчёта и зачем нужна форма настроек?
- Откуда берутся настройки, если в форме нет полей для них?
- О чём говорят несколько сохранённых вариантов одного отчёта?
Упражнения
По образцу. Сформируйте отчёт об остатках дважды с разными настройками и опишите, чем отличаются ответы.
Своё: задайте вопрос. Сформулируйте три вопроса к базе «Канцтоваров», которые стоило бы задавать отчётом, и скажите, какие настройки для каждого нужны.
Ловушка: «сформировал — значит, сохранил». Пользователь сформировал отчёт, закрыл окно и не может найти результат. Что вы объясните?
Обратный ход. В чужой конфигурации у отчёта заполнена строка формы настроек, а основная форма пуста. Что это значит?
На чтение. В чужой форме есть поле табличного документа, кнопка «Сформировать» и ещё таблица со списком документов. Почему это уже не чистая форма отчёта и что вы спросите у того, кто её собирал?
Ответы — в конце части.
§ 9.6. Формы без предмета: когда главное — задача
В самом начале книги мы условились: форма — это реплика системы об одном предмете. Карточка говорит о товаре, список — о множестве товаров, отчёт — о цифре, которую посчитали. Условие работало восемь глав, и пора признать его границу. Бывают формы, у которых предмета нет. Человек открывает такое окно не ради записи, а ради дела: подобрать товары, разослать письма, свести расхождения по складу. Предмет такой формы — задача.
1. Где кончается «разговор об одном»
Сравним два окна, которые выглядят похоже и устроены по-разному.
| форма о записи | форма о задаче | |
|---|---|---|
| что в основном реквизите | объект справочника или документа | объект обработки или ничего |
| что записывает | эту запись | ничего или записи других объектов |
| чем заканчивается | записью | выполненным делом |
| как читать | «о какой записи речь» | «какую задачу здесь делают» |
Граница метафоры не отменяет её: формы о записи — большинство, и всё, чему книга учила, к ним относится прямо. Но, встретив окно без предмета, не нужно искать запись, которой нет.
Форма о записи отвечает на вопрос «о чём мы говорим». Форма о задаче — на вопрос «что мы сейчас делаем».
2. Откуда берутся такие формы
Их два источника, и оба в дереве конфигурации.
| откуда | что это |
|---|---|
| обработка | объект без хранения: у него есть реквизиты, формы и модуль, но нет записей в базе |
| общая форма | форма, которая не принадлежит ни одному объекту |
Про общие формы документация говорит прямо: это «формы, доступные из любого модуля конфигурации». Они живут в ветке общих объектов, основного реквизита-объекта у них нет, и ни о каком справочнике или документе они не рассказывают. Открывают такую форму командой или кодом — просто окно, которое кому-то понадобилось.
У обработки ролей для форм меньше, чем у справочника: основная форма и дополнительная — на случай, если основная не задана. Роли «форма списка» у неё нет вовсе, и это понятно: списка обработок у пользователя не бывает.
3. Чем такая форма устроена иначе
Различий ровно три, и все мы уже умеем читать по отдельности.
| что смотрим | у формы о записи | у формы о задаче |
|---|---|---|
| основной реквизит | объект из базы | объект обработки или его нет |
| реквизиты формы | дополнение к записи | главное содержимое: параметры и промежуточные данные |
| команды | записать, провести, закрыть | выполнить, подобрать, перенести |
Вторая строка — самое важное для чтения. В карточке реквизиты формы были подспорьем; здесь они несут всё: выбранный склад, период, набранная таблица товаров. Данные эти в базе не лежат — они живут, пока открыто окно, как мы разбирали, говоря о таблице значений.
4. Что остаётся прежним
Хорошая новость: читать такие формы нечем новым. Кирпичи те же.
| что не меняется |
|---|
| пять видов элементов: поля, группы, таблицы, кнопки, декорации |
| пути к данным: элемент показывает реквизит |
| панели и команды: кнопка предлагает команду |
| автоформа, если своя форма не назначена |
Поэтому форма-организатор не требует отдельного метода разбора — только другого первого вопроса. Не «о какой записи речь», а «какую задачу человек здесь решает».
5. Как читать форму о задаче
Разбор идёт по пути самой задачи: что на входе, что происходит, что на выходе.
| шаг | что искать |
|---|---|
| вход | реквизиты-параметры и поля для них: склад, период, контрагент |
| середина | таблицы с промежуточными данными и команды, которые их наполняют |
| выход | куда уходит результат: в документ, в регистр, в файл, в печать |
| след | остаётся ли что-нибудь после закрытия окна |
Последний шаг — проверка, знакомая по главе о данных: если после закрытия не остаётся ничего, значит, задача не доведена до конца, и где-то должна быть команда, которая переносит набранное в базу. Нет такой команды — перед вами заготовка: окно без того шага, который переносит результат в базу.
6. Чем опасны такие формы
Свобода от предмета — это и риск: такому окну легко стать складом разных дел.
| находка | о чём говорит |
|---|---|
| задачу не удаётся назвать одной фразой | в окне смешали несколько дел |
| пятнадцать реквизитов формы и три таблицы | работа сложнее, чем помещается в одно окно |
| ни одной команды, кроме закрытия | окно только показывает: это скорее отчёт |
| команды есть, а куда уходит результат — непонятно | придётся читать код, формой тут не объяснить |
Первая строка — та же проверка, что для группы элементов в главе о композиции: если назначение не укладывается в одну фразу, его, скорее всего, не продумывали. Для окна целиком это ещё важнее, чем для группы полей.
7. В Конфигураторе
Проверим этот способ чтения на живом окне. В «Канцтоварах» обработок нет — и это само по себе ответ: учебная конфигурация собрана вокруг записей. Форму о задаче посмотрим в наборе чужих форм.
-
Откройте в дереве конфигурации ветку обработок «Канцтоваров»: она пуста. Записывать задачам нечего, и в нашей базе их не завели.
-
Откройте форму подбора товаров из набора чужих форм. Найдите основной реквизит: его либо нет, либо это объект обработки.
-
Выпишите реквизиты формы и разделите их на две группы: параметры задачи и промежуточные данные.
-
Найдите команды формы и для каждой скажите, что она делает по названию.
-
Ответьте одной фразой: какую задачу человек решает в этом окне и что остаётся после его закрытия.
Главное в одном абзаце
Большинство форм — разговор об одной записи, но есть и такие, у которых предмета нет: человек открывает их ради дела. Приходят они из двух мест — от обработки, объекта без хранения, у которого есть реквизиты, формы и модуль, но нет записей в базе, и от общей формы, которая не принадлежит ни одному объекту и доступна из любого места конфигурации. Устроены они иначе в трёх местах: в основном реквизите либо объект обработки, либо ничего; реквизиты формы несут главное содержимое — параметры и промежуточные данные; команды не записывают, а выполняют. Всё остальное прежнее: те же пять видов элементов, те же пути к данным, те же панели и автоформа, если своя не назначена. Читают такую форму по пути задачи: вход, середина, выход и след — остаётся ли что-нибудь после закрытия окна. А первая проверка простая: если задачу окна не удаётся назвать одной фразой, в нём смешали несколько дел.
Реквизиты и элементы, композиция и списки, команды и панели, виды форм и их роли — всё это теперь есть. Сложится ли это в один цельный разбор и что покажет самая сложная чужая форма — та, где есть и данные, и задача?
Контрольные вопросы
- Где кончается правило «форма — разговор об одном предмете»?
- Из каких двух мест конфигурации приходят формы о задаче?
- Что такое обработка и почему роль для форм у неё одна?
- Что такое общая форма?
- Чем реквизиты формы в форме о задаче отличаются от реквизитов формы в карточке?
- В каком порядке читают форму о задаче?
- О чём говорит окно, задачу которого не удаётся назвать одной фразой?
Упражнения
По образцу. Прочитайте форму подбора из набора чужих форм по четырём шагам: вход, середина, выход, след.
Своё: придумайте задачу. Какую форму о задаче вы бы завели для «Канцтоваров» и что в ней было бы на входе и на выходе?
Ловушка: «набрал товары — значит, они в документе». Пользователь набрал в форме подбора десять товаров, закрыл окно и не нашёл их в поступлении. Что произошло?
Обратный ход. В чужой форме нет основного реквизита, зато восемь реквизитов формы и четыре команды. Что это за форма и с чего начать разбор?
На чтение. В окне есть две таблицы, период, склад и кнопка «Выполнить». Как понять, что это форма о задаче, а не отчёт?
Ответы — в конце части.
§ 9.7. Чужая форма: полная карта
Разборы чужих форм шли через всю книгу по частям: сначала реквизиты, потом поля, потом композиция, таблицы, команды. Каждый давал свой лист. Сложим их в одну карту и сверим её на форме подбора товаров — самой непростой из набора: в ней есть и данные, и задача.
1. Что у нас уже есть
Пять разборов — пять готовых листов.
| что разбирали | что получали на выходе |
|---|---|
| реквизиты формы | о чём разговор: основной реквизит и его тип |
| поля и их свойства | что показано из данных и что скрыто |
| композицию | скетч экрана и замысел автора |
| таблицы | откуда строки у каждой: запись, форма, запрос |
| команды | каталог: что можно сделать и где искать код |
Каждый лист отвечал на свой вопрос и ни на чей больше. Карта — это те же листы, сложенные в один порядок, где каждый следующий опирается на предыдущий.
Пять разборов отвечали на пять вопросов. Карта отвечает на один: как эта форма устроена и зачем её открывают.
2. Шесть слоёв: пять рабочих и проверочный
Пять слоёв идут от предмета к действию, шестой проверяет остальные. А над картой стоит её шапка — задача формы, названная одной фразой.
| слой | что выписываем |
|---|---|
| роль | какого вида форма и в какой строке объекта назначена |
| данные | основной реквизит, реквизиты формы, откуда что берётся |
| показ | поля и прочие элементы: что показано, что скрыто |
| композиция | группы, страницы, панели — как это выглядит на экране |
| действия | команды, их источники, куда уходит результат |
| след | что остаётся в базе после закрытия окна |
Шестой слой стоит особняком: он не добавляет нового, а проверяет остальные. Если по карте не видно, что останется после закрытия, значит, какой-то слой прочитан не до конца.
3. Почему порядок именно такой
Каждый слой снимает вопросы следующего.
| слой | что он объясняет в следующем |
|---|---|
| роль | чего вообще ждать от формы: записи, выбора, отчёта, задачи |
| данные | что могут показывать элементы |
| показ | что именно человек видит и чего не видит |
| композиция | в каком порядке он это встречает |
| действия | что он с этим сделает |
Пойти в обратную сторону — с кнопок — заманчиво: они на виду. Но тогда каждая кнопка вызывает вопрос «а к чему она относится», и ответ приходится искать в слоях, которые ещё не прочитаны.
4. Карта формы подбора
Вот что лежит в этой форме — реквизиты, элементы и команды.
Реквизиты формы
├── Склад СправочникСсылка.Склады
├── ПодобранныеТовары ТаблицаЗначений
└── (основного нет)
Элементы
├── Шапка
│ └── Склад
├── Подобранные таблица
│ ├── Товар, Количество
│ └── КоманднаяПанель
│ └── Добавить, Удалить
└── КоманднаяПанель формы
├── Подобрать по остаткам
└── Перенести в документ
Команды формы
├── ПодобратьПоОстаткам
└── ПеренестиВДокумент
Теперь та же форма картой.
| слой | что вышло |
|---|---|
| роль | форма обработки, основная; предмета-записи нет |
| данные | склад — параметр, подобранные товары — таблица значений в форме |
| показ | поле склада, таблица с двумя колонками; остатков на экране нет |
| композиция | параметр сверху, таблица под ним, две панели |
| действия | две своих команды: наполнить таблицу и перенести в документ |
| след | без «Перенести в документ» не остаётся ничего |
Карта сразу показывает и устройство, и замысел: человек выбирает склад, набирает товары и переносит их в документ. Всё, что в форме есть, служит этим трём шагам — и ничего лишнего в ней нет.
5. Что считать находкой
На примере видно, как слои собираются в одно. Теперь — о том, что такая карта находит чаще всего: находки у каждого слоя свои, и за книгу их накопилось немало. Вот те, что встречаются чаще прочих.
| слой | частая находка |
|---|---|
| роль | форма собрана, но не назначена ни в одну строку |
| данные | реквизит формы есть, а поля для него нет |
| показ | поле скрыто или закрыто для правки, и непонятно, кем |
| композиция | обязательное поле на дальней закладке |
| действия | команда без кнопки или с пустой процедурой |
| след | набранное в форме некуда перенести |
Любая из этих строк — повод не для вывода, а для вопроса. Половина объясняется замыслом, о котором знает автор или пользователь, и спросить дешевле, чем догадываться.
6. Чего карта не покажет
И чтобы не ждать от карты лишнего, зафиксируем её границы — знать их стоит так же твёрдо, как и сам разбор.
| вопрос | отвечает ли карта |
|---|---|
| как форма устроена | да |
| зачем её открывают | да, если задачу удаётся назвать одной фразой |
| что делает код | нет: видно только, где он лежит |
| кому форма доступна | нет: это права и функциональные опции |
| почему автор сделал так | нет: это разговор с автором |
Три «нет» — не слабость карты, а её честная рамка. Она доводит читателя до границы, за которой начинается другой разговор: язык 1С, администрирование, люди.
7. Разбор по шагам
Семь шагов, и все они уже знакомы по отдельности.
-
Найдите форму в дереве объекта и посмотрите, в какой строке основных форм она стоит. Если ни в одной — запомните это.
-
Выпишите реквизиты формы: основной и остальные, с типами. Отделите параметры от промежуточных данных.
-
Пройдите структуру элементов и выпишите элементы с путями к данным. Сравните с реквизитами: чего на экране нет.
-
Нарисуйте скетч экрана по группам и страницам.
-
Соберите каталог команд: источник, носитель, что известно о действии.
-
Напишите шапку карты: одной фразой, какую задачу человек решает в этом окне.
-
Ответьте на проверочный вопрос: что останется в базе, когда окно закроют.
Седьмой шаг — последняя проверка всего разбора. Форма, после которой не остаётся ничего и не может остаться, — либо отчёт, либо заготовка; и то и другое стоит знать до того, как на неё положились.
Главное в одном абзаце
Полная карта формы складывается из пяти разборов, которые шли через всю книгу, и читается слоями: роль — какого вида форма и назначена ли она; данные — основной реквизит и реквизиты формы; показ — что выведено на экран и что скрыто; композиция — группы, страницы и панели; действия — команды, их источники и то, куда уходит результат. Шестой слой проверочный: что остаётся в базе после закрытия окна. Над картой — её шапка: задача формы в одной фразе. Порядок не случаен: каждый слой снимает вопросы следующего. Поэтому начинать с кнопок невыгодно. Находки у каждого слоя свои: форма, не назначенная ни в одну роль; реквизит без поля; скрытое поле; обязательное поле на дальней закладке; команда без кнопки; набранное, которое некуда перенести. Любая из них — повод спросить, а не вывод. И у карты есть честная граница: она показывает устройство и назначение, но не объясняет ни кода, ни прав, ни решений автора.
Книга почти пройдена: мы научились читать форму целиком, от реквизитов до команд. Осталось превратить это умение в привычку — короткий набор вопросов, который держат в голове, и несколько правил, которые пригодятся, когда форму придётся не читать, а собирать. С чего начинается чтение любой формы?
Контрольные вопросы
- Из каких слоёв состоит полная карта формы?
- Почему разбор начинают с роли формы, а не с кнопок?
- Зачем нужен проверочный слой и какой у него вопрос?
- Что даёт сравнение реквизитов формы с элементами?
- Назовите по одной частой находке для слоя данных и слоя действий.
- На какие вопросы карта не отвечает?
- Что можно сказать о форме, после которой в базе ничего не остаётся?
Упражнения
По образцу. Составьте карту формы поступления, которую вы собирали: все шесть слоёв, по одной строке на слой.
Своё: карта своей формы. Составьте карту карточки товара и честно отметьте, какие находки в ней есть.
Ловушка: «начну с кнопок». Коллега разбирает чужую форму, начиная с командной панели, и застревает на третьей кнопке. Что ему посоветовать?
Обратный ход. Дана карта: роль — форма обработки, данные — три параметра и таблица, действий — одна команда «Выполнить», след — записи в регистре. Нарисуйте правдоподобное дерево элементов такой формы.
На чтение. В карте чужой формы слой «след» пуст, а в слое «действия» три команды с непустыми процедурами. О чём это говорит и что вы проверите?
Ответы — в конце части.
Ответы к главе 9
§ 9.1. Форма элемента: одна запись справочника
К вопросу 1. Ответ. Форма объекта, форма группы, форма списка, форма для выбора и форма для выбора группы.
К вопросу 2. Ответ. Платформа строит форму сама — открывается автоформа нужного вида.
К вопросу 3. Ответ. Потому что в самой форме такой пометки нет. Видом её делает строка у объекта, в которую её поставили: одна и та же форма может стоять в двух ролях.
К вопросу 4. Ответ. Дополнительная форма — запасной случай: её вызывают, если основная не задана или не может быть использована.
К вопросу 5. Ответ. Основной реквизит типа объекта справочника, стандартные команды записи и закрытия, поля с путями к реквизитам записи.
К вопросу 6. Ответ. Это стандартные реквизиты справочника: их задаёт вид объекта, а не разработчик.
К вопросу 7. Указание. Одна форма — пять ролей.
Полное решение. Собранная форма могла быть не назначена ни в одну строку, и тогда платформа строит автоформу. Или назначена не в ту роль: карточка стоит в форме объекта, а пользователь открыл группу, для которой строка пуста.
К упражнению «По образцу». Ответ. У «Контрагентов» своих форм нет — все строки пусты. При выборе контрагента в документе откроется автоформа выбора.
К упражнению «Своё: раздайте роли». Ответ. Складов немного, реквизитов у них мало — автоформы хватает и для карточки, и для списка. Свою форму заводят, когда нужны свои поля, свой порядок или свои команды.
К упражнению «Ловушка: „сделал форму — она и откроется"». Ответ. Пользователь увидит автоформу: платформа зовёт ту форму, что назначена в строке основных форм, а не ту, что просто существует в дереве.
К упражнению «Обратный ход». Ответ. Одна и та же форма назначена в две роли — например, и формой объекта, и формой группы. Так делают, когда состав полей для обоих случаев подходит.
К упражнению «На чтение». Ответ. Код не вывели на форму: стандартный реквизит существует и хранится, но показывать его необязательно. Так делают, когда код нумеруется автоматически и человеку не нужен.
§ 9.2. Форма списка: разговор о многих записях
К вопросу 1. Ответ. В карточке предмет разговора — одна запись, её правят и записывают. В списке предмет — набор записей: записывать нечего, есть текущая строка, и заканчивается разговор обычно переходом к одной записи.
К вопросу 2. Ответ. Потому что строки принадлежат базе, а не форме: в основном реквизите лежит динамический список, а не запись.
К вопросу 3. Ответ. Форма объекта, форма списка и форма для выбора. Групп у документов не бывает, поэтому нет и форм группы.
К вопросу 4. Ответ. Форма записи. По смыслу это та же роль, что форма объекта у справочника: работа с одной единицей хранения.
К вопросу 5. Ответ. К текущей строке — той, на которой стоит курсор. Исключение — создание: оно заводит новую запись и ни к какой строке не относится.
К вопросу 6. Ответ. Из команды раздела, с начальной страницы, из служебного перечня объектов. При выборе значения для поля откроется не он, а форма выбора.
К вопросу 7. Ответ. Что по списку работают, не открывая карточек: человеку нужны данные прямо в строках, а не переход к записи.
К упражнению «По образцу». Ответ. У контрагентов список короткий: наименование, ИНН. У реализаций — номер, дата, контрагент, сумма и команда проведения. Ролей у справочника пять, у документа три.
К упражнению «Своё: спроектируйте список». Ответ. Дата, номер, контрагент, склад, сумма. Дата и контрагент — чтобы найти нужное поступление; сумма — чтобы не открывать карточку ради проверки.
К упражнению «Ловушка: „удалил строку — удалил запись"». Ответ. Пометка на удаление — это признак у записи, а не удаление. Запись на месте, показывать её список может по-прежнему; удаляют помеченное отдельной служебной операцией.
К упражнению «Обратный ход». Ответ. Автоформу документа: своей формы объекта нет, и платформа строит её сама по реквизитам документа.
К упражнению «На чтение». Ответ. Это список, с которым работают прямо в нём: записи не создают вручную (они приходят иначе), а наводят порядок — ищут и объединяют дубли. Карточка здесь нужна для просмотра, а не для ввода.
§ 9.3. Форма выбора: вернуть одно значение в поле
К вопросу 1. Ответ. В роли формы для выбора: её строка есть у объекта рядом с формами объекта и списка. Для выбора папки есть отдельная роль — форма для выбора группы.
К вопросу 2. Ответ. Если своей формы выбора нет, платформа строит автоформу по тем же правилам, что и для списка, только в режиме выбора.
К вопросу 3. Ответ. Двойной щелчок не открывает карточку, а подставляет значение в поле и закрывает окно. Форма заканчивается возвратом значения тому, кто её позвал.
К вопросу 4. Ответ. Платформа. Режим выбора у таблицы на клиенте доступен только для чтения: его выставляет сама платформа, открывая форму для выбора.
К вопросу 5. Ответ. Решает, закроется ли окно после выбора. По умолчанию включено. Выключают его, чтобы форма работала подбором: значение уходит в документ, а окно остаётся.
К вопросу 6. Ответ. Когда у справочника задан быстрый выбор — значения выпадают списком прямо в поле. И когда человек набирает значение прямо в поле: работает ввод по строке.
К вопросу 7. Указание. Кто её позвал?
Полное решение. В поле, из которого форму вызвали: там задан отбор. Форма выбора получает ограничения вместе с просьбой выбрать, поэтому в ней самой причины нет.
К упражнению «По образцу». Ответ. Автоформа выбора складов: своей формы выбора у справочника нет, строка пуста, и платформа строит форму сама.
К упражнению «Своё: кому быстрый выбор». Ответ. «Единицам измерения» — да, их пять. «Складам» — можно, их немного. «Товарам» и «Контрагентам» — нет: записей много, нужен поиск и отбор в форме.
К упражнению «Ловушка: „выбрал товар — окно закрылось, а надо десять"». Ответ. Выключить у формы выбора свойство «закрывать при выборе»: окно останется открытым, и товары можно набирать один за другим. Это и есть подбор.
К упражнению «Обратный ход». Ответ. В свойствах поля «Контрагент» задан отбор — например, по признаку покупателя. Сама форма выбора тут ни при чём: она показывает то, что ей разрешили показать.
К упражнению «На чтение». Ответ. Это форма подбора, выросшая в рабочее место: человек видит остатки и набирает товары, не выходя из окна. Сделали её такой, чтобы весь выбор шёл в одном месте — с остатками перед глазами.
§ 9.4. Документ и справочник: одна запись, разные правила
К вопросу 1. Ответ. Обе — разговор об одной записи: объект в основном реквизите, данные приходят копией и уходят при записи, форма собрана из тех же видов элементов, а без своей формы работает автоформа.
К вопросу 2. Ответ. Справочник — «что у нас есть», документ — «что произошло».
К вопросу 3. Ответ. Вещь узнают по названию, а событие — по времени: события выстраиваются в порядке, поэтому документу нужны номер и дата.
К вопросу 4. Ответ. Проведение записывает движения — записи в регистрах: приход, расход, новая цена. Куда именно писать, задано у документа списком регистров.
К вопросу 5. Ответ. Оперативное — это проведение «сейчас», текущей датой. Разрешено оно или нет, задано свойством документа; если дата документа меньше текущей, проведение уже не оперативное — отсюда предупреждения в форме.
К вопросу 6. Указание. Что даёт кнопка, а что — реквизиты?
Полное решение. Есть «Провести» — документ с разрешённым проведением. Нет — либо справочник, либо документ, которому проведение запретили. Надёжнее всего смотреть на реквизиты: номер и дата есть только у документа, код и наименование — у справочника.
К вопросу 7. Ответ. Номер и дата — когда; шапка — кто и где; табличная часть — что и сколько; итоги и проведение — что из этого следует для учёта.
К упражнению «По образцу». Ответ. У реализации номер, дата, контрагент, склад, товары, кнопки записи и проведения. У контрагента — код, наименование, ИНН, кнопки записи и закрытия. Реализация отмечает событие и пишет движения, контрагент просто хранится.
К упражнению «Своё: придумайте документ». Ответ. Например, «Списание товаров»: что списали и в каком количестве; движение — расход со склада, остаток уменьшается. Или «Инвентаризация»: движений может не делать вовсе, только фиксировать расхождения.
К упражнению «Ловушка: „записал — значит, учтено"». Ответ. Запись сохраняет документ, но движений не делает: остатки меняет проведение. Пока документ не проведён, для учёта события не было.
К упражнению «Обратный ход». Ответ. Либо проведение у документа запрещено — он только фиксирует событие, не затрагивая регистры; либо у пользователя нет права проводить; либо кнопку убрали из формы, а команда осталась.
К упражнению «На чтение». Ответ. Табличная часть у справочника — дело обычное. А вот «Провести» у справочника быть не может: скорее всего, это форма документа, а не справочника, либо кнопка связана со своей командой формы, которая лишь называется похоже. Проверяют по типу основного реквизита.
§ 9.5. Форма отчёта: вопрос сверху, ответ снизу
К вопросу 1. Ответ. Настройки — их заполняет пользователь; результат — его собирает платформа, когда нажали «Сформировать».
К вопросу 2. Ответ. Пока вопрос не задан, отвечать нечего: результат появляется только после формирования.
К вопросу 3. Ответ. Записывать нечего: у отчёта нет записи. Результат — данные формы, он исчезает вместе с окном.
К вопросу 4. Ответ. Элемент формы — поле вида «поле табличного документа», и путь его ведёт к реквизиту формы.
К вопросу 5. Ответ. Основная форма, форма настроек и форма варианта. Форма настроек нужна, когда настроек много: главные остаются в форме, остальные уходят в отдельное окно.
К вопросу 6. Указание. Где у отчёта лежит описание того, что он считает?
Полное решение. В схеме компоновки данных — она лежит у отчёта макетом. По ней платформа и показывает настройки: поля, отборы, группировки. Если настроек в форме нет, а на экране они есть, искать надо в схеме.
К вопросу 7. Ответ. Что людям нужны разные вопросы к одним данным. Иногда это знак, что настройки непонятны и каждый сохранил себе рабочий набор.
К упражнению «По образцу». Ответ. Разные периоды или отборы дают разные наборы строк: тот же отчёт отвечает на другой вопрос. Данные в базе при этом не менялись.
К упражнению «Своё: задайте вопрос». Ответ. Например: сколько товара осталось на складе (настройки — склад, дата); на какую сумму приняли товар за месяц (период, контрагент); какие товары не продавались (период, товар).
К упражнению «Ловушка: „сформировал — значит, сохранил"». Ответ. Результат нигде не хранится: он собрался в форме и исчез с окном. Чтобы остался, его сохраняют файлом или печатают; а чтобы повторить — сохраняют вариант отчёта с теми же настройками.
К упражнению «Обратный ход». Ответ. Открывать отчёт будет автоформа, а настройки — своя форма настроек. Так делают, когда настроек много и важна именно их раскладка, а результат устраивает стандартный.
К упражнению «На чтение». Ответ. Это уже не чистая форма отчёта: кроме вопроса и ответа в ней есть список документов — значит, из неё что-то делают, а не только смотрят. Спросить стоит, какую задачу человек решает в этом окне целиком: возможно, перед вами рабочее место.
§ 9.6. Формы без предмета: когда главное — задача
К вопросу 1. Ответ. Там, где у формы нет предмета разговора: человек открывает окно не ради записи, а ради дела — подобрать, разослать, свести расхождения.
К вопросу 2. Ответ. От обработки — объекта без хранения — и от общей формы, которая не принадлежит ни одному объекту.
К вопросу 3. Ответ. Обработка — объект, у которого есть реквизиты, формы, макеты и модуль, но нет записей в базе. Ролей для форм у неё меньше: основная и дополнительная; формы списка нет, потому что списка обработок у пользователя не бывает.
К вопросу 4. Ответ. Форма, не привязанная к объекту метаданных: по документации она доступна из любого модуля конфигурации, а открывают её командой или кодом.
К вопросу 5. Ответ. В карточке они были дополнением к записи, здесь несут всё: параметры задачи и промежуточные данные. В базе эти данные не лежат — они живут, пока открыто окно.
К вопросу 6. Указание. Идите по пути самой задачи.
Полное решение. Вход — реквизиты-параметры и поля для них. Середина — таблицы промежуточных данных и команды, которые их наполняют. Выход — куда уходит результат: в документ, в регистр, в файл, на печать. След — остаётся ли что-нибудь после закрытия окна.
К вопросу 7. Ответ. Что в нём смешали несколько дел. Та же проверка, что для группы элементов: не укладывается в одну фразу — значит, назначение не продумывали.
К упражнению «По образцу». Ответ. Вход — склад и, возможно, период. Середина — таблица подобранных строк и команды подбора. Выход — перенос строк в документ. След — после закрытия без переноса не остаётся ничего.
К упражнению «Своё: придумайте задачу». Ответ. Например, «Переоценка»: на входе склад и процент, в середине таблица товаров с новыми ценами, на выходе приказ об изменении цен. Или «Сверка остатков»: на входе склад, в середине расхождения, на выходе документ списания.
К упражнению «Ловушка: „набрал товары — значит, они в документе"». Ответ. Набранное лежало в данных формы и исчезло с окном. Строки попадают в документ только командой переноса; если такой команды нет, подбор — заготовка.
К упражнению «Обратный ход». Ответ. Форма о задаче — общая форма или форма обработки. Начинать разбор надо с реквизитов формы: разделить их на параметры и промежуточные данные, а потом прочитать команды.
К упражнению «На чтение». Ответ. По команде и по следу. У отчёта кнопка собирает результат для чтения и ничего не меняет; «Выполнить» в форме о задаче что-то делает с данными базы. Проверяют по тому, остаётся ли след после закрытия окна.
§ 9.7. Чужая форма: полная карта
К вопросу 1. Ответ. Пять рабочих слоёв — роль, данные, показ, композиция, действия — и шестой проверочный: след. Над картой стоит шапка: задача формы в одной фразе.
К вопросу 2. Ответ. Потому что каждый слой снимает вопросы следующего. Начав с кнопок, к каждой придётся искать, к чему она относится, а ответы лежат в непрочитанных слоях.
К вопросу 3. Ответ. Он проверяет остальные: что останется в базе, когда окно закроют. Не выходит ответить — какой-то слой прочитан не до конца.
К вопросу 4. Ответ. Видно, чего на экране нет: реквизит есть, а поля для него не вывели.
К вопросу 5. Ответ. В данных — реквизит без поля; в действиях — команда без кнопки или с пустой процедурой.
К вопросу 6. Ответ. Что делает код, кому форма доступна и почему автор сделал именно так. Первое — язык 1С, второе — права и функциональные опции, третье — разговор с автором.
К вопросу 7. Указание. Два объяснения, и оба стоит проверить.
Полное решение. Либо это форма для просмотра — отчёт или рабочее окно, которое ничего не меняет. Либо заготовка: действия задуманы, а шага, переносящего результат в базу, нет. Проверяют по командам: есть ли среди них та, что пишет в базу, и не пуста ли её процедура.
К упражнению «По образцу». Ответ. Роль — форма объекта документа. Данные — основной реквизит «Объект» с табличной частью. Показ — поля шапки и таблица товаров. Композиция — две закладки. Действия — стандартные команды записи и проведения. След — записанный и проведённый документ, движения в регистрах. Шапка карты: «оформить приём товара от поставщика».
К упражнению «Своё: карта своей формы». Ответ. Находки будут: в карточке товара есть группа «Учёт» с декорацией-пояснением, а команда «Обновить цены» — со пустой процедурой. Последнее и есть честная находка слоя действий.
К упражнению «Ловушка: „начну с кнопок"». Ответ. Посоветовать начать с роли и данных: тогда к третьей кнопке будет ясно, к какой записи она относится и что сделает. Разбор от кнопок требует держать в голове то, чего ещё не прочитал.
К упражнению «Обратный ход». Ответ. Правдоподобно так: группа с тремя полями параметров сверху, под ней таблица, в командной панели формы одна кнопка «Выполнить». Основного реквизита-объекта нет.
К упражнению «На чтение». Ответ. Либо форма ничего не записывает и действия только показывают — тогда «след» пуст по праву. Либо команды пишут в базу, а вы этого не увидели: проверьте, куда уходят их результаты, и загляните в процедуры.
§ 10.1. Пять вопросов к любой форме
Полная карта хороша, когда есть время и лист бумаги. Но чаще форму открывают между делом: коллега просит посмотреть, пользователь прислал снимок экрана, вы сами попали в незнакомое окно. Для таких случаев карту сворачивают в пять вопросов, которые держат в голове и задают по порядку. Ответы на них — это и есть понимание формы.
1. Пять вопросов
Вот они. Ответ на каждый обычно короткий — слово или фраза.
| вопрос | где ответ |
|---|---|
| чья это форма? | дерево конфигурации: у какого объекта она лежит |
| о чём она? | основной реквизит и его тип — или его отсутствие |
| откуда данные? | реквизиты формы: запись, динамический список, таблица значений |
| как сложено? | группы, страницы, панели |
| что можно сделать? | команды и их источники |
Порядок тот же, что у карты: от предмета к действию. Каждый следующий ответ опирается на предыдущий, поэтому вопросы не переставляют — иначе придётся возвращаться. Оборвать набор можно в любом месте, а вот начать с середины — нельзя.
К пяти вопросам есть ещё и проверка; до неё дойдём, когда с самими вопросами разберёмся.
Карта — для разбора на бумаге. Пять вопросов — для чтения на ходу. Разницы в логике нет, разница во времени: карта пишется, вопросы задаются.
2. Что даёт каждый ответ
Ответы складываются в картину, и каждый убирает целый класс недоумений.
| ответ | что становится понятно |
|---|---|
| чья форма | чего от неё ожидать: карточка, список, отчёт, задача |
| о чём | есть ли запись и будет ли что записывать |
| откуда данные | что живёт в базе, а что исчезнет с окном |
| как сложено | что человек увидит первым, а что найдёт не сразу |
| что можно сделать | зачем эту форму открывают |
Последняя строка — обычно и есть то, за чем шли. Остальные четыре нужны, чтобы ответ на пятый не оказался выдумкой.
Из всех пяти особенно много развилок снимает первый.
3. Первый вопрос решает больше всех
«Чья это форма» кажется формальностью, но именно он задаёт все ожидания.
| что выяснили | чего ждать дальше |
|---|---|
| форма справочника | код, наименование, запись, закрытие |
| форма документа | номер, дата, проведение, движения |
| форма отчёта | настройки, результат, ничего не записывается |
| форма обработки | предмета нет, главное — задача |
| общая форма | не принадлежит объекту; ведёт тоже задача |
Не ответив на первый, легко потратить остальные четыре зря: искать запись там, где её нет, или ждать проведения от справочника. Поэтому с него и начинают — даже когда кажется, что и так всё ясно.
4. Когда хватает двух
В жизни полный набор нужен не всегда. Чаще всего задают первые два или три вопроса, и этого довольно.
| задача | сколько вопросов нужно |
|---|---|
| понять, о чём окно на снимке экрана | два: чья форма и о чём |
| объяснить, почему поля нет на экране | три: добавить «откуда данные» |
| объяснить, почему кнопка не работает | первый, а дальше сразу пятый — ответ выйдет грубее, но его хватит |
| разобрать форму целиком | все пять, а лучше карту |
Правило простое: задавайте вопросы, пока ответы не перестанут что-то менять. Если уже на третьем понятно, что делать, четвёртый и пятый подождут.
5. Проверка к пяти вопросам
Та самая проверка, обещанная выше. Вслух её не задают, а держат про себя: что останется, когда окно закроют.
| что остаётся | о какой форме речь |
|---|---|
| изменённая запись | карточка справочника или документа |
| записи в регистрах | проведённый документ |
| ничего из данных | отчёт — так и задумано; сохранённый вариант настроек при этом остаётся |
| ничего, хотя человек работал | задача не доведена до базы: ищите команду переноса |
Эта проверка поймала за книгу больше всего находок. Она же лучше всего проверяет сам разбор: не можете ответить — значит, какой-то из пяти ответов неполон.
6. Что делать с ответами
Разбор заканчивается одним из трёх исходов, и все три нормальны.
| исход | что дальше |
|---|---|
| форма понятна | можно работать: объяснять, править, собирать похожую |
| нашлась находка | спросить автора или пользователя: половина объясняется замыслом |
| упёрлись в границу | дальше код, права или история системы — и это другой разговор |
Третий исход не поражение. Прочитать форму до границы — уже много: вы знаете, где лежит ответ, даже если не можете его прочесть. Это и отличает чтение от угадывания.
7. В Конфигураторе и в Предприятии
Прочитаем три формы по пяти вопросам и посмотрим, как это выглядит на бумаге.
-
Возьмите карточку товара, форму списка поступлений и отчёт об остатках.
-
На каждую дайте пять ответов, по одной строке.
-
Для каждой добавьте проверку: что останется после закрытия окна.
-
Откройте любую форму из набора чужих форм и проделайте то же. Сравните, где ответы дались труднее.
-
Выпишите вопросы на листок и держите его под рукой первое время — пока порядок не ляжет в память.
Главное в одном абзаце
Полная карта нужна для разбора на бумаге, а на ходу форму читают пятью вопросами: чья это форма, о чём она, откуда у неё данные, как сложены элементы и что можно сделать. Порядок тот же, что у карты, — от предмета к действию, и менять его невыгодно: каждый ответ опирается на предыдущий. Первый вопрос решает больше остальных: он задаёт ожидания, и без него легко искать запись там, где её нет. Полный набор нужен не всегда — обычно хватает двух-трёх вопросов, и спрашивать стоит, пока ответы что-то меняют. Проверкой держат вопрос «что останется, когда окно закроют»: он и находки приносит, и показывает, что какой-то ответ неполон. Заканчивается чтение одним из трёх: форма понятна, нашлась находка — и тогда спрашивают людей, или разбор дошёл до границы, за которой код и права. Последнее — не поражение: знать, где лежит ответ, уже значит читать, а не угадывать.
Пять вопросов проверены на формах, которые собирали мы или собирали для нас. Выдержат ли они окно, которое никто не готовил к разбору?
Контрольные вопросы
- Назовите пять вопросов в их порядке.
- Чем пять вопросов отличаются от полной карты?
- Почему первый вопрос решает больше остальных?
- Что становится понятно из ответа «откуда данные»?
- Когда можно остановиться, не задав все пять?
- Какую проверку держат про себя и зачем?
- Какими тремя исходами заканчивается чтение формы?
Упражнения
По образцу. Ответьте на пять вопросов по форме элемента «Контрагентов» и засеките время: на знакомую форму уходит меньше минуты.
Своё: пять ответов по памяти. Выберите форму, которую видели, но не разбирали, и дайте пять ответов, не открывая Конфигуратор. Потом проверьте.
Ловушка: «сразу к кнопкам». Коллега начинает разбор с командной панели и спрашивает, почему «Провести» неактивна. Какой вопрос он пропустил?
Обратный ход. Даны ответы: форма обработки; основного реквизита нет; данные — два параметра и таблица значений; сложено в одну группу; одна команда «Выполнить». Что это за форма и что останется после закрытия окна?
На чтение. Пользователь прислал снимок экрана без пояснений. На какие из пяти вопросов можно ответить по одному снимку, а на какие нет?
Ответы — в конце части.
§ 10.2. Контрольная задача: форма из рабочей системы
Все формы в этой книге были учебными. «Канцтовары» мы собрали сами, чужие формы кто-то собрал для разбора — там ровно столько сложности, сколько нужно уроку. Теперь откроем форму из типовой конфигурации: её делали для работы, и о читателе никто не думал. Задача — прочитать её по пяти вопросам и не утонуть.
1. Чем рабочая форма отличается от учебной
Разница не в устройстве — в масштабе и происхождении.
| учебная форма | форма из типовой | |
|---|---|---|
| сколько реквизитов | пять-десять | десятки |
| сколько страниц | одна-две | пять и больше |
| сколько авторов | один | много, в разные годы |
| зачем сделана | чтобы объяснить | чтобы в ней работали |
| что в ней непонятного | ничего | то, что нужно было когда-то или нужно не здесь |
Последняя строка — самое непривычное. В учебной форме каждый элемент на своём месте, потому что его туда поставили нарочно. В рабочей часть элементов осталась от прежних задач, часть служит механизмам, которых не видно, — и объяснить их «из логики формы» не получится. Как с этим быть, скажем в конце параграфа.
2. Какую форму взять
Выбор важнее, чем кажется: с неудачной формы начинать больно.
| что брать | почему |
|---|---|
| форму документа, который часто заводят | она хорошо продумана, в ней работают каждый день |
| форму с табличной частью | есть и шапка, и строки — всё, что мы разбирали |
| форму средней величины | на пять страниц и сто реквизитов уйдёт вечер |
| не брать формы настроек и служебные | там меньше смысла и больше механики |
Где взять базу: у типовых конфигураций есть демонстрационные — те же конфигурации, но с придуманными данными, собранными специально для показа и обучения. Их ставят рядом с рабочей и не боятся в них ходить: портить там нечего. А вот разбирать чужую рабочую базу для учёбы не стоит — там живые данные и живые люди.
3. Пять вопросов, когда реквизитов сто
Вопросы те же, меняется только глубина ответа. На большой форме отвечают крупно — иначе разбор не кончится.
| вопрос | ответ на учебной форме | ответ на большой |
|---|---|---|
| чья форма | имя объекта | имя объекта |
| о чём | основной реквизит и тип | то же: он один |
| откуда данные | перечислить все реквизиты | назвать группы: запись, списки, служебные |
| как сложено | скетч экрана | перечислить страницы и что на каждой |
| что можно сделать | каталог команд | свои команды, стандартные — одной строкой |
Главный приём — отвечать на уровне групп. Не «тридцать реквизитов формы», а «реквизиты записи, три динамических списка и десяток служебных флажков». Такой ответ короче и полезнее: он показывает устройство, а не перечень.
На учебной форме читают всё. На рабочей читают слоями и останавливаются там, где картина уже сложилась.
4. Три ловушки большой формы
Первая: тонуть в деталях. Сто реквизитов можно читать день, и к вечеру не останется сил на выводы. Отвечайте крупно и возвращайтесь за подробностями только там, где они нужны.
Вторая: ждать, что всё будет как в книге. Будет похоже — те же пять видов элементов, те же пути, те же роли форм. Но рядом окажется то, чего мы не разбирали: общие механизмы библиотек, реквизиты с непонятными именами и элементы, которых в структуре формы нет — их добавляет код при открытии. Платформа умеет не только собирать форму по описанию, но и доверить часть сборки коду; для нас это значит одно: не всё, что на экране, найдётся в дереве. Модель от этого не становится неверной.
Третья: объяснять всё замыслом. В рабочей форме часть решений — следы истории, а не умысла. Отличить одно от другого по форме нельзя; можно только отметить и спросить людей.
5. Что считать выполненной задачей
Задача не в том, чтобы понять форму целиком. Критерии скромнее и честнее.
| что должно получиться |
|---|
| пять ответов, каждый в одну-две строки |
| проверка: что останется, когда окно закроют |
| две-три находки с пометкой «спросить» |
| одна фраза: зачем эту форму открывают |
Последняя строка — главная, и вырастает она из пятого ответа: что в форме можно сделать. Если после разбора вы можете сказать, зачем люди открывают это окно, задача выполнена — даже если половина реквизитов осталась непрочитанной.
6. Чего в такой форме точно не будет
Не будет простоты, и это нормально. А вот чего не будет совсем:
| чего не ждать | почему |
|---|---|
| что все элементы объяснимы из данных | часть добавлена кодом при открытии |
| что имена говорящие | имена пришли из разных лет и разных рук |
| что форма отвечает за всё | в типовых много работы делают библиотеки |
| что разбор даст полную картину | за кодом придётся идти в другую книгу |
Третья строка про то, что в типовых конфигурациях рядом с формой живут общие механизмы. Вы увидите их след: реквизит с незнакомым именем, кнопка, которой нет в списке команд объекта. Отметить и идти дальше — верное решение.
7. Контрольная задача
Разберите одну форму из типовой конфигурации по пяти вопросам.
-
Разверните демонстрационную базу типовой конфигурации рядом с «Канцтоварами». В рабочую базу не ходите.
-
Выберите форму документа, который заводят часто, с табличной частью. Запишите, почему выбрали именно её.
-
Ответьте на пять вопросов крупно — по одной-две строки на каждый.
-
Добавьте проверку: что останется в базе, когда окно закроют.
-
Выпишите две-три находки — то, что хочется спросить у автора или пользователя.
-
Напишите одну фразу: зачем люди открывают эту форму.
-
Сравните свои ощущения с разбором учебной формы: где было труднее и почему.
Главное в одном абзаце
Рабочая форма из типовой конфигурации отличается от учебной не устройством, а масштабом и происхождением: десятки реквизитов, несколько страниц, много авторов и годы истории, от которой осталось то, что когда-то было нужно. Разбирать такую форму стоит на демонстрационной базе, а не на рабочей, и выбирать документ, который заводят каждый день. Пять вопросов работают те же, меняется глубина: отвечать надо крупно, на уровне групп, — не перечислять тридцать реквизитов, а назвать, из чего они. Три ловушки — утонуть в деталях, ждать книжной аккуратности и объяснять всё замыслом автора. Задача считается выполненной, если получились пять коротких ответов, проверка, две-три находки и одна фраза о том, зачем люди открывают это окно. Полной картины не будет: часть элементов добавлена кодом, часть работы делают библиотеки, и за этим придётся идти дальше.
Разбор настоящей формы оставляет странное чувство: модель вроде верна, а в форме то и это ей не подчиняется. Чувство знакомое и объяснимое — и о нём стоит поговорить прямо, чтобы оно не превратилось в разочарование.
Контрольные вопросы
- Чем форма из типовой конфигурации отличается от учебной?
- Какую форму стоит выбрать для первого разбора и какую не стоит?
- Почему разбирают на демонстрационной базе?
- Что значит «отвечать крупно» и в каком вопросе это важнее всего?
- Назовите три ловушки большой формы.
- По каким признакам считать контрольную задачу выполненной?
- Чего в типовой форме не стоит ожидать?
Упражнения
По образцу. Проделайте разбор ещё раз — на форме списка того же документа. Ответы будут короче: сравните, насколько.
Своё: выберите форму. Пройдите по списку документов типовой конфигурации и выберите три формы, подходящие для учебного разбора. Объясните выбор.
Ловушка: «прочитаю всё». Коллега разбирает форму заказа третий час и дошёл до середины реквизитов. Что ему посоветовать?
Обратный ход. В разборе получилось пять ответов, но фраза «зачем открывают эту форму» не складывается. Какой вопрос стоит перечитать?
На чтение. В форме типовой конфигурации есть кнопка, которой нет ни в командах формы, ни в командах объекта. Какие объяснения возможны?
Ответы — в конце части.
§ 10.3. Живая система: модель и слой истории
Разобрав настоящую форму, почти каждый ловит себя на одной мысли: вроде всё понятно, а три вещи в модель не укладываются. Поле, которое никто не заполняет. Реквизит с именем, которое ни о чём не говорит. Страница, на которую никогда не заходят. Мысль эта правильная — и объяснение у неё не про вас и не про модель.
1. Откуда берутся «странности»
Типовая конфигурация — не чертёж, а постройка, которую много лет достраивали.
| источник различий | что от него остаётся в формах |
|---|---|
| годы платформы | решения, принятые, когда платформа была другой |
| много авторов | разные привычки в именах и раскладке |
| библиотеки | общие механизмы, которых в самой конфигурации нет |
| доработки под заказчика | элементы, нужные одному предприятию |
Ни один из этих источников не ошибка. Каждый — след решения, которое в своё время было верным: тогда платформа не умела иначе, тогда так было принято, тогда заказчику это было нужно.
Три странности из начала разговора раскладываются по этой же таблице. Имя, которое ни о чём не говорит, — обычно след библиотеки. Страница, куда не заходят, — остаток прежней задачи. Поле, которое никто не заполняет, — чаще всего доработка под одно предприятие.
Модель описывает, как устроена платформа. Типовая конфигурация показывает, как ею пользовались двадцать лет. Между ними лежит слой истории.
2. Платформа и сама носит историю
Это не упрёк конфигурациям: историю видно и в самой платформе.
| где видно | что это значит |
|---|---|
| режим совместимости | конфигурация может работать по правилам старой версии |
| обычные формы рядом с управляемыми | старый способ описания форм никуда не делся |
| свойства, которые видно не всегда | часть из них показывается только в старом режиме |
Список режимов совместимости в платформе длинный: от версии 8.1 до нынешних. Каждая строка — обещание платформы вести себя по правилам того года. Для форм это значит вот что: многое из того, что мы разбирали, появилось не сразу, и в старом режиме части свойств и возможностей просто нет. А кое-что платформа показывает только в старом режиме: у корня конфигурации есть свойство состава, и документация прямо оговаривает — оно видно, лишь когда выбран режим совместимости с версией 8.1.
Отсюда первое практическое следствие: прежде чем удивляться форме, посмотрите, по правилам какого года живёт конфигурация.
3. Библиотеки: то, чего в конфигурации нет
Второй источник из той же таблицы — библиотеки. В типовых рядом с прикладными объектами работают общие механизмы: готовые наборы подсистем, которые ставят во многие конфигурации сразу — работу с файлами, печать, обмен данными. В дереве конфигурации они есть, но лежат не там, где форма, которую вы читаете.
| что видит читатель формы | что за этим |
|---|---|
| реквизит с незнакомым префиксом в имени | имя из библиотеки, не из этой конфигурации |
| кнопка, которой нет в командах объекта | команда из общего механизма |
| элемент, появившийся при открытии | его добавил код библиотеки |
Нам библиотеки мешают одним: они нарушают ожидание, что всё, что на экране, найдётся в дереве этой формы. Правило для таких случаев простое: отметить как «не из формы» и идти дальше. Разбирать библиотеку — отдельная работа и отдельная книга.
4. Доработки: своё и заимствованное
Типовую конфигурацию почти всегда дорабатывают под предприятие, и делают это по-разному: правят саму конфигурацию или накладывают расширение — отдельный слой, который живёт рядом и меняет её, не трогая исходных объектов. Платформа умеет показывать, где чьё: у объекта есть свойство принадлежности, и документация описывает его так — оно определяет, «относится ли объект к данной конфигурации или был заимствован из расширяемой конфигурации».
| что видно | что это значит |
|---|---|
| объект собственный | его завели здесь |
| объект заимствованный | он пришёл из конфигурации, которую расширяют |
| форма изменена не в конфигурации | правки лежат в расширении |
Отсюда второе следствие для чтения: если форма ведёт себя не так, как написано в её дереве, причина может лежать вне конфигурации — в расширении. Искать объяснение в самой форме тогда бесполезно.
5. Якорное правило
Главное, с чем стоит закрыть эту главу, формулируется одной фразой.
Если в реальной форме что-то не вписывается в модель — это не повод отказаться от модели. Это повод спросить, что именно не вписывается и почему.
Дальше действуют по трём шагам.
| шаг | что делаем |
|---|---|
| описать | что именно не укладывается: элемент, имя, поведение |
| датировать | когда это могло появиться: режим совместимости, библиотека, доработка |
| спросить | у автора, у пользователя, в истории правок |
Третий шаг решает чаще всего. «Почему здесь это поле» — вопрос не к платформе, а к людям, и ответ обычно звучит как «так было нужно в таком-то году».
6. Чего не стоит делать
Три реакции на «странности» выглядят естественно и портят дело.
| реакция | почему плохо |
|---|---|
| решить, что модель неверна | модель описывает правила платформы, а не то, как ими пользовались двадцать лет |
| решить, что вы не поняли | вы поняли; просто перед вами ещё и история |
| переделать чужую форму «по модели» | за каждым решением могут стоять причины, которых вы не знаете |
Третья — самая дорогая. Чужая форма, приведённая «в порядок» без разговора с теми, кто в ней работает, обычно возвращается жалобами: убранное поле кому-то было нужно раз в квартал, но очень нужно.
7. В Конфигураторе
Найдём в живой системе следы истории, а потом применим к своей находке трёхшаговый приём.
- Откройте демонстрационную базу типовой конфигурации и посмотрите в свойствах конфигурации режим совместимости. Запишите, какой год указан.
-
Поищите в дереве обычные формы — те, что описаны старым способом, без структуры элементов. Если нашлись, посмотрите, у каких объектов они остались.
-
Найдите реквизит или команду с префиксом в имени — след библиотеки. Отметьте как «не из этой формы».
-
Выберите одну «странность» из своего разбора прошлого параграфа и пройдите по трём шагам: описать, датировать, сформулировать вопрос.
-
Запишите вопрос так, чтобы его можно было задать человеку: коротко и без упрёка.
Главное в одном абзаце
Разбирая живую систему, вы встретите то, что в чистую модель не укладывается, и это нормально: типовую конфигурацию много лет достраивали разные люди, в разные годы, под разные задачи. Историю носит и сама платформа — режим совместимости позволяет конфигурации жить по правилам старой версии, обычные формы соседствуют с управляемыми, а часть свойств видна только в старом режиме. Рядом работают библиотеки: их реквизиты и команды видны в форме, но в дереве этой формы их не найти. А доработки видно по принадлежности объекта — собственный он или заимствованный из расширяемой конфигурации; правки формы могут лежать вообще в расширении. Якорное правило: если что-то не вписывается в модель, это не повод отказаться от модели, а повод спросить, что именно не вписывается и почему, — и дальше описать, датировать и спросить у людей. Чего делать не стоит: считать модель неверной, считать себя непонявшим и приводить чужую форму «в порядок» без разговора с теми, кто в ней работает.
Разбор чужого — половина умения. Вторая половина обратная: придумать окно для работы, которой в программе пока нет. Чем её придумывают — и почему не мышкой?
Контрольные вопросы
- Назовите четыре источника различий между моделью и живой системой.
- Что такое режим совместимости и как он объясняет странности в формах?
- Почему не всё, что видно в форме, находится в её дереве?
- Что говорит о доработках принадлежность объекта?
- Сформулируйте якорное правило.
- Какие три шага делают со «странностью»?
- Почему опасно приводить чужую форму «в порядок по модели»?
Упражнения
По образцу. Найдите в демонстрационной базе три реквизита с префиксами в именах и предположите, из какой они области.
Своё: три вопроса. Возьмите три находки из своих разборов и превратите каждую в вопрос к человеку — коротко и без упрёка.
Ловушка: «значит, модель неверна». Коллега разобрал форму заказа и говорит, что книжная модель не работает. Что вы ответите и о чём спросите?
Обратный ход. Форма ведёт себя не так, как написано в её дереве: кнопка делает то, чего в командах нет. Где искать причину?
На чтение. В конфигурации указан режим совместимости десятилетней давности. Что это говорит о её формах и о том, чего в них ждать?
Ответы — в конце части.
§ 10.4. Своя задача: прокат велосипедов
Читать формы мы научились. Теперь обратная работа: спроектировать формы для задачи, которой нет ни в одной конфигурации. Задача знакомая — прокат велосипедов, тот самый, что мы начинали в книге о дереве метаданных. Там были заведены объекты: справочник велосипедов, документ выдачи и отчёт о прокате за период. Здесь у них появятся формы. И первый инструмент здесь не Конфигуратор, а лист бумаги.
1. Почему сначала бумага
Конфигуратор — хороший сборщик и плохой советчик. Стоит его открыть, и работа начинается раньше решения: перетащили реквизиты, получили столбец полей, дальше правим то, что вышло.
| с чего начали | что получается |
|---|---|
| с Конфигуратора | форма собирается из того, что подвернулось |
| с бумаги | форма собирается из того, что решили |
На бумаге дешевле всё: переставить поля, передумать насчёт закладок, выбросить половину. В Конфигураторе каждая переделка стоит времени, а главное — жалко выбрасывать то, что уже собрано.
Конфигуратор отвечает на вопрос «как это собрать». Бумага — на вопрос «что именно собирать».
2. Три решения до Конфигуратора
На каждую форму принимают три решения, и все — словами, без мышки.
| решение | как звучит |
|---|---|
| о чём форма | об одной записи, о множестве, о задаче |
| что показать | какие реквизиты нужны этому человеку, а какие нет |
| как сложить | что рядом, что на отдельной странице, что в панели |
Это те же вопросы, которыми мы читали чужие формы, только заданные себе. И отвечать на них лучше в том же порядке: решив «о чём», вы уже знаете, какие стандартные команды придут сами.
3. Порядок проектирования
Проектируют не от данных, а от работы человека.
| шаг | что делаем |
|---|---|
| 1 | описать работу: кто, что делает, в каком порядке |
| 2 | выписать, какие сведения ему нужны на экране |
| 3 | нарисовать скетч: что где лежит |
| 4 | перевести скетч в дерево элементов |
| 5 | только теперь — Конфигуратор |
Первый шаг важнее остальных. «Приёмщик выдаёт велосипед: находит клиента, выбирает велосипед, ставит срок, берёт залог» — из такой фразы форма вырастает почти сама. А из фразы «нужна форма документа выдачи» не вырастает ничего.
4. Три объекта проката и их формы
В задаче три объекта, а форм выходит четыре: у справочника их две.
| объект | какие формы нужны | что на них главное |
|---|---|---|
| велосипеды | карточка и список | что это за велосипед и свободен ли он |
| выдача | форма документа | кто взял, что взял, на какой срок |
| прокат за период | форма отчёта | сколько выдач и на какую сумму |
Обратите внимание на третью колонку: в ней сказано, что человек должен увидеть первым. Это и есть ответ на вопрос «что показать» — и он же решает, какие поля окажутся в верхней части формы, а какие уйдут вниз или на вторую страницу.
5. Приёмы, которые экономят время
Четыре правила, выведенные из того, что мы читали всю книгу.
| приём | зачем |
|---|---|
| начните с автоформы | платформа соберёт черновик, и станет видно, чего не хватает |
| не начинайте со страниц | страницы нужны, когда полей много; сперва проверьте, что их много |
| называйте по-человечески | заголовок увидит приёмщик, а не вы |
| не прячьте нужное | скрытое поле — частая находка в чужих формах; не создавайте её сами |
Первый приём стоит пояснить. Автоформа — не соперник вашему замыслу, а бесплатный черновик: откройте её, положите рядом скетч и отметьте расхождения. Там, где расхождений нет, своя форма и не нужна.
6. Как сравнить замысел и результат
Самое полезное в этой работе — сравнение того, что задумано, с тем, что получилось.
| что проверяем | о чём говорит расхождение |
|---|---|
| появилось то, чего не было в скетче | платформа решила за вас или вы передумали на ходу |
| исчезло то, что было в скетче | в Конфигураторе это оказалось неудобно или невозможно |
| порядок полей поменялся | скетч не учитывал, как платформа размещает элементы |
| команд больше, чем планировали | стандартные команды пришли от объекта |
Последняя строка — не ошибка, а норма: стандартные команды платформа даёт сама, и в скетче их обычно не рисуют. А вот первые три стоит разобрать: каждая — что-то, чего вы не знали о формах до этой сборки.
7. В Конфигураторе и в Предприятии
Проверим всё это на деле: пройдём путь от скетча до формы и сравним результат. Это замыкающее задание книги, и половина его — без Конфигуратора; точечные упражнения идут ниже отдельно.
-
Опишите одной фразой работу приёмщика: что он делает, когда выдаёт велосипед.
-
Нарисуйте на бумаге четыре скетча: карточка велосипеда, список велосипедов, форма выдачи, форма отчёта. Поля, группы, кнопки — всё словами и рамками.
-
Переведите каждый скетч в дерево элементов. Проверьте по нему: все ли поля имеют путь к данным, все ли кнопки — команду.
-
Откройте Конфигуратор и сначала посмотрите автоформы — все четыре, по своим скетчам. Отметьте, где они совпали со скетчем.
-
Соберите формы по своим скетчам. Начните с той, где расхождений с автоформой больше всего.
-
Откройте Предприятие и проведите одну выдачу от начала до конца, как это делал бы приёмщик.
-
Сравните замысел и результат по четырём строкам из таблицы выше. Запишите, что узнали.
Главное в одном абзаце
Проектирование начинают не в Конфигураторе, а на бумаге: там дешевле передумать, а в собранной форме жалко выбрасывать сделанное. На каждую форму принимают три решения словами: о чём она, что показать, как сложить — те же вопросы, которыми читают чужие формы, только заданные себе. Идти стоит от работы человека: описать, кто что делает, выписать нужные ему сведения, нарисовать скетч, перевести в дерево элементов и только потом открыть Конфигуратор. В задаче проката три объекта и четыре формы: карточка велосипеда и список — свободен ли он; документ выдачи — кто, что и на какой срок; отчёт за период — сколько и на какую сумму. Экономят время четыре приёма: начать с автоформы как с черновика, не начинать со страниц, называть по-человечески, не прятать нужное. А главная польза — в сравнении замысла с результатом: что появилось, что исчезло, что платформа разместила иначе. Каждое расхождение — это то, чего вы не знали о формах до сборки.
Велосипеды выдаются, отчёт считает. И всё же собранное молчит там, где должно было бы действовать: обработчики остались пустыми. Чем занято это место и как оно называется?
Контрольные вопросы
- Почему проектирование начинают не в Конфигураторе?
- Какие три решения принимают до сборки формы?
- С чего начинают проектирование и почему именно с этого?
- Какие формы нужны задаче проката и что на каждой главное?
- Зачем смотреть автоформу, если форма всё равно будет своя?
- Почему не стоит начинать с разбиения на страницы?
- Что даёт сравнение скетча с собранной формой?
Упражнения
По образцу. Нарисуйте скетч и дерево элементов для формы списка велосипедов — так, чтобы приёмщик видел, какие свободны.
Своё: ещё один документ. Прокату нужен документ возврата. Опишите работу одной фразой и нарисуйте скетч его формы.
Ловушка: «соберу сразу в Конфигураторе». Коллега собрал форму выдачи за полчаса, а потом два часа её переделывал. Что он пропустил?
Обратный ход. Дан скетч: сверху клиент и велосипед, ниже срок и залог, внизу кнопка «Выдать». Какой это объект и какие стандартные команды появятся сами?
На чтение. В собранной форме выдачи оказалось пять кнопок, а в скетче было две. Как объяснить разницу, не считая это ошибкой?
Ответы — в конце части.
§ 10.5. Где здесь код: события и обработчики
Книга обошлась без единой строки кода — и это не фокус: описание формы живёт в дереве, и прочитать его можно, не открывая модуль. А вот то, что делает код, по описанию не прочитаешь. Но в каждой форме есть места, куда код приходит, и мы их видели: пустые процедуры за командами. Пора назвать эти места и слова, которыми их зовут. Разбирать код мы не станем — но знать, где он живёт, входит в умение читать форму.
1. Три места, где форма оживает
Код не разлит по форме ровным слоем. Он приходит в заранее заданные точки.
| место | когда срабатывает |
|---|---|
| действие команды | пользователь вызвал команду |
| событие формы | форма создаётся, открывается, записывается, закрывается |
| событие элемента | человек поменял значение в поле, перешёл по строке |
Первое мы уже заводили сами: свойство «действие» у команды и пустая процедура, которую создал редактор. Два других — то же самое, только поводом служит не нажатие, а момент в жизни формы.
Форма описана правилами. Код отзывается на моменты, которые эти правила предусмотрели, — и работает по тем же правилам, даже когда что-то добавляет.
2. Событие и обработчик
Два слова, которые дальше встретятся на каждом шагу.
| слово | что значит |
|---|---|
| событие | момент, о котором платформа сообщает: форма открылась, поле изменилось |
| обработчик | процедура, которую платформа вызывает в этот момент |
У формы событий много, и названия у них говорящие. «Возникает на сервере при создании формы», «возникает на клиенте при открытии формы, до показа окна пользователю» — так описаны два самых частых. Рядом живут закрытие формы и проверка заполнения, а у поля — изменение значения.
3. Имена событий уже всё объясняют
Прочитайте названия внимательно — в них виден тот самый принцип клиента и сервера, с которым мы ходили всю книгу.
| событие | где происходит |
|---|---|
| при создании на сервере | на сервере: форма ещё собирается |
| при открытии | на клиенте: окно сейчас покажут человеку |
| при изменении поля | на клиенте: человек только что что-то ввёл |
| перед записью | на клиенте: до того, как данные уйдут на сервер |
Из этой же границы вырастают служебные пометки в модуле: перед именем процедуры стоит слово о том, где ей работать — «на клиенте» или «на сервере». Эти пометки и называют директивами компиляции. Они говорят, где процедуре работать. Разбирать их — дело книги о коде; нам довольно знать, что такие пометки есть и зачем они нужны.
4. Что в поведении формы объясняется кодом
Читая форму, полезно заранее знать, какие симптомы к коду и ведут.
| что видит пользователь | где искать |
|---|---|
| поле заполнилось само | сначала проверьте правила объекта, потом обработчик формы или поля |
| сумма пересчиталась при вводе количества | событие изменения поля |
| при закрытии появился вопрос о записи | обычное поведение платформы: форма считает себя изменённой |
| вопрос при закрытии нестандартный | обработчик закрытия: он может спросить своё или отменить закрытие |
| часть полей появилась не сразу | код, который меняет видимость |
| кнопка не делает ничего | процедура команды пуста |
Правило, которое мы вывели ещё в главе о командах, здесь получает общий вид: если что-то в форме происходит само, причин три — правило в дереве, встроенное поведение платформы или обработчик в модуле. Ищут в этом же порядке: первые две видны без кода.
5. Чего код не отменяет
Код может многое, но не всё — и границы эти для читателя важнее возможностей.
| что код может | чего не может |
|---|---|
| заполнить реквизит, пересчитать, спрятать поле | отменить связь поля с реквизитом |
| добавить элементы при открытии | отменить роли форм и состав подсистем |
| запретить закрытие, спросить подтверждение | записать то, чего нет в данных записи |
Код может добавлять элементы при открытии — вот почему в типовых формах встречаются элементы, которых нет в дереве. Но и такой элемент живёт по общим правилам: он лежит в группе, и если показывает данные, то через путь к ним, а если предлагает действие — через команду. Правила остаются, меняется только то, кто их применил — редактор или код.
6. Как читать форму с кодом, не читая кода
Список обработчиков — это карта мест, где форма оживает, и прочитать её можно, не открывая ни одной процедуры.
| что смотрим | что узнаём |
|---|---|
| у каких событий формы есть обработчики | что происходит при открытии и записи |
| у каких полей есть обработчики изменения | какие значения влияют на другие |
| есть ли обработчики у команд | какие действия написаны, а какие заготовлены |
| сколько обработчиков всего | насколько форма «живая» |
Последняя строка — грубая, но полезная мерка. Форма без обработчиков целиком описана правилами: прочитали дерево — знаете всё. Форма с двумя десятками обработчиков живёт своей жизнью, и без модуля в ней не разобраться.
7. В Конфигураторе
Посмотрим на места для кода в своих формах и в чужих.
- Откройте форму элемента «Товаров» и найдите в палитре свойств список событий формы. Обработчиков там нет: мы их не заводили.
-
Найдите у команды «Обновить цены» свойство действия и убедитесь, что процедура на месте и пуста.
-
Выделите поле артикула и посмотрите его события. Запишите, какие из них сработали бы, если бы человек поменял значение.
-
Откройте в демонстрационной базе типовой конфигурации форму документа и посмотрите тот же список событий. Посчитайте, у скольких есть обработчики.
-
Сравните две формы по последней мерке: насколько каждая «живая» и что из этого следует для чтения.
Главное в одном абзаце
Код приходит в форму не везде, а в заданные места: действие команды, события формы и события элементов. Событие — момент, о котором платформа сообщает; обработчик — процедура, которую она в этот момент вызывает. Имена событий сами объясняют клиент-серверную границу: создание формы происходит на сервере, открытие и изменение поля — на клиенте; рядом в модуле стоят директивы компиляции — пометки «на клиенте» и «на сервере», которые говорят, где процедуре работать. Эта книга их не разбирает — она показывает, где они живут. Поведение формы, которое «происходит само», объясняется одним из двух: правилом в дереве или обработчиком в модуле, и сначала ищут правило. Код не отменяет правил: он заполняет, пересчитывает, прячет и даже добавляет элементы, но связь поля с реквизитом, роли форм и состав подсистем остаются за описанием. А прочитать форму с кодом можно и не читая кода: список обработчиков показывает, где она оживает, и насколько она вообще «живая».
Место для кода названо. Но за этой границей лежит не одна тропа, а развилка, и у шагов есть разумная очередь. Какая?
Контрольные вопросы
- В какие три места в форме приходит код?
- Что такое событие и что такое обработчик?
- Как по имени события понять, где оно происходит?
- Что такое директивы компиляции и зачем о них знать читателю форм?
- Какие симптомы в поведении формы ведут к коду?
- Чего код не отменяет?
- Что можно узнать по списку обработчиков, не открывая процедуры?
Упражнения
По образцу. Выпишите для формы поступления все места, куда мог бы прийти код: команды, события формы, события полей.
Своё: предскажите обработчик. В форме выдачи велосипеда сумма залога должна зависеть от типа велосипеда. К какому событию и какого элемента привязали бы обработчик?
Ловушка: «само заполнилось — значит, магия». Пользователь говорит, что склад в документе подставляется сам. Какие два объяснения вы проверите и в каком порядке?
Обратный ход. В форме десять обработчиков, из них восемь — у событий полей. Что это говорит о форме?
На чтение. В чужой форме есть элемент, которого нет в дереве. Как он туда попал и подчиняется ли он общим правилам?
Ответы — в конце части.
§ 10.6. Маршрут дальше
Формы вы теперь читаете. Это значит, что любое окно 1С перестало быть непрозрачным: вы знаете, где у него данные, где показ, где действия, и где кончается описание и начинается код. Дальше дорог несколько, и они расходятся в разные стороны. Эта глава — последняя, и разговор в ней один: куда идти и в каком порядке.
1. Что вы умеете теперь
Стоит перечислить — не ради похвалы, а чтобы увидеть границы умения.
| что умеете | на чём это держится |
|---|---|
| читать незнакомую форму | пять вопросов и карта из шести слоёв |
| отличать данные записи от данных формы | путь к данным и типы реквизитов |
| видеть, что собрала платформа, а что человек | автоформы и правила сборки |
| понимать, куда ведёт каждая кнопка | команды, их источники и носители |
| находить, где форму открывают | подсистемы, разделы, начальная страница |
| проектировать форму на бумаге | скетч, дерево элементов, работа человека |
Границу тоже видно: всё это — про описание. Что происходит внутри процедур, как собираются цифры отчёта, как хранятся данные под вопрос — другие темы.
2. Четыре дороги
Вот куда ведут ближайшие шаги.
| дорога | что она даёт | когда нужна |
|---|---|---|
| события и код формы | форма начинает отзываться: считать, проверять, подсказывать | как только вам захочется, чтобы форма что-то делала сама |
| запросы и компоновка данных | списки и отчёты перестают быть чёрными ящиками | когда работаете со списками и отчётами |
| программное создание форм | форма собирается кодом целиком | редко: типовые решения, библиотеки, нестандартные задачи |
| мобильный интерфейс | те же формы на телефоне, с другими правилами показа | если есть мобильная задача |
Первые две — дороги, по которым пойдут почти все. Третья и четвёртая — по необходимости, и браться за них раньше времени невыгодно.
3. Что раньше, что потом
Порядок не произволен: каждый следующий шаг опирается на предыдущий.
| очередь | шаг | почему именно здесь |
|---|---|---|
| первая | события и обработчики | вы уже видели, где они живут: осталось заполнить пустые процедуры |
| вторая | запросы, а за ними компоновка данных | за каждым списком и отчётом стоит запрос; компоновка — то, как его результат показывают |
| дальше | программные формы и мобильный интерфейс | по задаче, а не по порядку |
Очередь эта — общая рекомендация, а не закон: тот, кто пришёл сюда из книги о дереве метаданных, разумно начнёт с запросов, а тот, кто уже пишет код, — с событий. Первая очередь короткая и даёт самый быстрый результат: вы уже знаете, куда писать, — осталось узнать, что именно. Вторая длиннее, зато без неё не прочитать ни динамический список, ни отчёт; внутри неё порядок тоже ясен — сначала язык запросов, потом компоновка.
Дороги расходятся, но у первых двух очередь есть, и менять её невыгодно.
Книга о формах кончается там, где формы перестают быть описанием. Следующая дорога начинается в тех же пустых процедурах, которые мы оставили нетронутыми.
4. Где это рядом с нами
Эти дороги не в воздухе: в серии им соответствуют свои книги, и выстроена она по той же логике — от данных к вопросу.
| книга серии | о чём |
|---|---|
| о чтении кода | как читать модули и процедуры |
| о дереве метаданных | из чего собрана конфигурация |
| о формах | эта книга: как устроено окно |
| о регистрах | как данные укладывают под будущий вопрос |
| о запросах | как задают вопрос базе |
Если вы пришли сюда из книги о дереве метаданных, естественное продолжение — запросы: без них списки и отчёты остаются полупрочитанными. Если вас привела работа с кодом — начните с событий формы: это самый короткий путь от чтения к делу.
5. Как учиться дальше
Приёмы из этой книги работают и на том, чего она не разбирала.
| приём | как применять |
|---|---|
| читать чужое | открывать незнакомые формы и отвечать на пять вопросов |
| называть одной фразой | после разбора говорить вслух, зачем это окно |
| вести список находок | записывать «странности» и возвращаться к ним через месяц |
| спрашивать людей | половина объяснений живёт не в конфигурации |
Третий приём недооценивают. Список находок через полгода читается как дневник: половина вопросов отвечена, часть оказалась ерундой, а два-три выросли в понимание, которого не было.
6. Чего не ждать от следующих шагов
Три ожидания, которые стоит отпустить заранее.
| ожидание | как на самом деле |
|---|---|
| выучу код — и формы станут полностью понятны | код объясняет поведение, но не замысел |
| прочитаю про СКД — и отчёты станут простыми | отчёты станут читаемыми; простыми они не бывают |
| освою всё и перестану встречать непонятное | непонятное будет всегда; изменится скорость разбора |
Третья строка — не пессимизм, а мерка роста. Раньше незнакомая форма отнимала вечер, теперь — пять вопросов и пару минут. Это и есть результат, который стоило получить.
7. Последняя практика
Чтобы выбор дороги не остался добрым намерением, оформим его коротким планом — на бумаге.
-
Выпишите три формы из своей работы, которые до сих пор кажутся вам непонятными.
-
Для каждой ответьте на пять вопросов. Отметьте, где упёрлись в границу: код, запрос, права.
-
Посчитайте, какая граница встретилась чаще. Это и есть ваш следующий шаг.
-
Запишите маршрут на три месяца: первый шаг, второй и то, что подождёт.
-
Положите список находок туда, где его видно. Через месяц перечитайте.
Главное в одном абзаце
Умение, с которым вы заканчиваете книгу, — читать описание формы: данные, показ, композицию, команды и место, откуда её открывают. Дальше четыре дороги: события и код формы, запросы с компоновкой данных, программное создание форм и мобильный интерфейс. Первые две нужны почти всем, и порядок у них ясный: сначала события — вы уже знаете, где живут пустые процедуры, — потом запросы, без которых списки и отчёты читаются наполовину, а за ними компоновка данных. Программные формы и мобильный интерфейс берут по задаче, а не по порядку. Учиться дальше стоит теми же приёмами: читать чужое, называть замысел одной фразой, вести список находок и спрашивать людей. И три ожидания лучше отпустить заранее: код не объяснит замысла, отчёты не станут простыми, а непонятное будет встречаться всегда — изменится только скорость, с которой вы с ним справляетесь.
На этом разговор о формах закончен. Книга началась с того, что форма — реплика системы об одном предмете, и прошла путь до карты, по которой читается любое окно. Предмет разговора, его данные, их показ, сложение на экране, действия и граница, за которой начинается код, — всё это теперь ваш рабочий инструмент.
Открывайте незнакомые формы. Они больше не молчат.
Контрольные вопросы
- Что из умений этой книги держится на описании, а не на коде?
- Назовите четыре дороги дальше.
- Какие две из них нужны почти всем?
- Почему события стоят первыми в очереди?
- Почему без языка запросов половина форм читается наполовину?
- Какие приёмы из книги работают и дальше?
- Какие три ожидания стоит отпустить заранее?
Упражнения
По образцу. Составьте маршрут на три месяца по шагам из практики.
Своё: три непонятные формы. Выпишите три формы из своей работы и доведите разбор каждой до границы. Назовите эти границы.
Ловушка: «сначала выучу всё». Коллега решил не трогать формы, пока не освоит код, запросы и компоновку данных. Что вы ему скажете?
Обратный ход. Человек умеет писать обработчики, но не читает формы. Какие главы этой книги ему нужны и в каком порядке?
На чтение. Через месяц перечитайте свой список находок. Сколько из них объяснились сами, сколько потребовали вопроса человеку, сколько ждут кода?
Ответы — в конце части.
Ответы к главе 10
§ 10.1. Пять вопросов к любой форме
К вопросу 1. Ответ. Чья это форма; о чём она; откуда у неё данные; как сложены элементы; что можно сделать.
К вопросу 2. Ответ. Логика одна, разное время и место: карту пишут на бумаге при разборе, вопросы задают на ходу и держат в голове.
К вопросу 3. Ответ. Он задаёт ожидания: от карточки справочника ждут записи, от документа — проведения, от отчёта — настроек и результата, от формы обработки — задачи. Без него легко искать запись там, где её нет.
К вопросу 4. Ответ. Что живёт в базе, а что исчезнет вместе с окном: данные записи, строки запроса или таблица значений в форме.
К вопросу 5. Ответ. Когда очередной ответ уже ничего не меняет в том, что вы собираетесь делать.
К вопросу 6. Указание. Она не о форме, а о последствиях.
Полное решение. Проверка «что останется, когда окно закроют». Она приносит находки — например, задачу, которую некуда перенести, — и показывает, что какой-то из пяти ответов неполон: не можете ответить, значит, что-то прочитано не до конца.
К вопросу 7. Ответ. Форма понятна; нашлась находка и нужно спросить людей; разбор дошёл до границы — дальше код, права или история системы.
К упражнению «По образцу». Ответ. Форма справочника «Контрагенты»; об одной записи, основной реквизит — объект справочника; данные из записи; сложено без страниц, одной группой; команды стандартные — записать и закрыть. После закрытия остаётся изменённая запись, если её записали.
К упражнению «Своё: пять ответов по памяти». Ответ. Проверять стоит не точность формулировок, а то, какой вопрос дался труднее всего: обычно это третий — откуда данные.
К упражнению «Ловушка: „сразу к кнопкам"». Ответ. Первый: чья это форма. Если форма справочника, «Провести» в ней быть не может вовсе; если документа — кнопка неактивна по состоянию записи или по правам.
К упражнению «Обратный ход». Ответ. Форма о задаче — обработка. После закрытия не останется ничего, если «Выполнить» не пишет в базу; если пишет — останутся записи, которые она сделала. Проверять надо именно это.
К упражнению «На чтение». Ответ. По снимку обычно видно, как сложено и что можно сделать, иногда — о чём форма. А вот чья она и откуда данные, по снимку не узнать: за этим нужно дерево конфигурации.
§ 10.2. Контрольная задача: форма из рабочей системы
К вопросу 1. Ответ. Масштабом и происхождением: десятки реквизитов, несколько страниц, много авторов и годы истории. Устройство то же — те же виды элементов, пути, роли форм.
К вопросу 2. Ответ. Форму документа, который заводят часто, с табличной частью и средней величины. Не стоит начинать с форм настроек и служебных: в них меньше смысла и больше механики.
К вопросу 3. Ответ. В демонстрационной базе придуманные данные и портить там нечего. В чужой рабочей базе живые данные и живые люди.
К вопросу 4. Ответ. Отвечать на уровне групп, а не перечнем. Важнее всего в третьем вопросе: не «тридцать реквизитов», а «реквизиты записи, три динамических списка и десяток служебных флажков».
К вопросу 5. Ответ. Утонуть в деталях; ждать книжной аккуратности; объяснять замыслом то, что осталось от истории.
К вопросу 6. Указание. Критериев четыре, и последний главный.
Полное решение. Пять коротких ответов; проверка, что останется после закрытия окна; две-три находки с пометкой «спросить»; и одна фраза о том, зачем люди открывают это окно. Последняя вырастает из пятого ответа — что в форме можно сделать.
К вопросу 7. Ответ. Что все элементы объяснимы из данных, что имена говорящие, что форма отвечает за всё и что разбор даст полную картину.
К упражнению «По образцу». Ответ. У формы списка ответы короче: основной реквизит — динамический список, данных из записи нет, команд меньше, а проверка даёт «ничего»: список ничего не записывает.
К упражнению «Своё: выберите форму». Ответ. Подходят формы документов, которые заводят ежедневно: реализация, поступление, заказ. Не подходят формы обработок, настроек и регистров — там либо механика, либо слишком мало смысла.
К упражнению «Ловушка: „прочитаю всё"». Ответ. Остановиться и ответить крупно: не перечислять реквизиты, а назвать их группы. Полное прочтение формы не цель — цель в том, чтобы сказать, зачем её открывают.
К упражнению «Обратный ход». Ответ. Пятый: что можно сделать. Фраза о назначении формы вырастает из команд; если их не прочитали, назначение не собирается.
К упражнению «На чтение». Ответ. Либо команда пришла от другого объекта или из библиотеки — глобальная команда; либо кнопку добавил код при открытии формы. И то и другое — обычное дело в типовых; отметить и идти дальше.
§ 10.3. Живая система: модель и слой истории
К вопросу 1. Ответ. Годы платформы, много авторов, библиотеки и доработки под заказчика.
К вопросу 2. Ответ. Это обещание платформы вести себя по правилам выбранной версии. В старом режиме части свойств и возможностей форм нет, а кое-что показывается только в нём.
К вопросу 3. Ответ. Потому что рядом работают библиотеки: их реквизиты и команды видны на экране, но лежат не в этой форме, а часть элементов добавляет код при открытии.
К вопросу 4. Ответ. Собственный объект завели в этой конфигурации; заимствованный пришёл из расширяемой. Значит, правки могут лежать в расширении — отдельном слое рядом с конфигурацией.
К вопросу 5. Ответ. Если в реальной форме что-то не вписывается в модель — это не повод отказаться от модели, а повод спросить, что именно не вписывается и почему.
К вопросу 6. Указание. Последний шаг — не про программу.
Полное решение. Описать: что именно не укладывается — элемент, имя, поведение. Датировать: откуда это могло взяться — режим совместимости, библиотека, доработка. Спросить: у автора, у пользователя, в истории правок. Третий шаг решает чаще всего.
К вопросу 7. Ответ. За каждым решением могут стоять причины, которых вы не знаете. Убранное поле кому-то нужно раз в квартал — и очень нужно.
К упражнению «По образцу». Ответ. Префиксы обычно указывают на область: работа с файлами, обмен данными, печать, дополнительные свойства. Проверить можно по тому, в какой подсистеме лежат объекты с тем же префиксом.
К упражнению «Своё: три вопроса». Ответ. Хорошие вопросы звучат так: «для чего это поле заполняют?», «кто пользуется этой закладкой?», «что будет, если убрать?». Плохие — «зачем здесь этот мусор?».
К упражнению «Ловушка: „значит, модель неверна"». Ответ. Модель описывает правила платформы, и они не изменились. Спросить стоит, что именно не сошлось: скорее всего, он встретил след библиотеки, доработки или старого режима совместимости.
К упражнению «Обратный ход». Ответ. В расширении: оно меняет форму, не трогая исходных объектов. Либо кнопку добавил код при открытии формы. В самой форме объяснения не будет.
К упражнению «На чтение». Ответ. Что её формы живут по правилам того года: части свойств и возможностей в них нет, могут остаться обычные формы, а привычные приёмы местами не работают. Обновление режима — отдельная работа, и формы после него придётся пересматривать.
§ 10.4. Своя задача: прокат велосипедов
К вопросу 1. Ответ. В Конфигураторе работа начинается раньше решения, и переделывать собранное дороже и жальче, чем перечеркнуть лист.
К вопросу 2. Ответ. О чём форма, что показать и как сложить. Те же вопросы, которыми читают чужие формы, только заданные себе.
К вопросу 3. Ответ. С описания работы человека: кто что делает и в каком порядке. Из такой фразы форма вырастает почти сама, а из «нужна форма документа» не вырастает ничего.
К вопросу 4. Ответ. Карточка велосипеда и список — что это за велосипед и свободен ли он; форма выдачи — кто взял, что взял, на какой срок; форма отчёта — сколько выдач и на какую сумму.
К вопросу 5. Ответ. Автоформа — бесплатный черновик: она показывает, чего не хватает, и где расхождений со скетчем нет, своя форма не нужна.
К вопросу 6. Указание. Сколько полей нужно, чтобы страницы оправдались?
Полное решение. Страницы нужны, когда полей много и их приходится делить по смыслу. Начав с них, легко получить три полупустые закладки вместо одной понятной формы — а заодно спрятать от человека то, что он ищет каждый день.
К вопросу 7. Ответ. Расхождения: что появилось, чего не стало, что платформа разместила иначе. Каждое — то, чего вы не знали о формах до сборки.
К упражнению «По образцу». Ответ. В списке нужны наименование, тип велосипеда и признак занятости — чтобы приёмщик с одного взгляда видел свободные. Остальное открывают в карточке.
К упражнению «Своё: ещё один документ». Ответ. «Приёмщик принимает велосипед: находит выдачу, отмечает возврат, считает доплату за просрочку». На скетче — ссылка на выдачу, дата возврата, состояние, доплата и кнопка записи.
К упражнению «Ловушка: „соберу сразу в Конфигураторе"». Ответ. Он пропустил первый шаг — описание работы. Форма собралась из того, что подвернулось, и переделка ушла на то, что можно было решить на бумаге за десять минут.
К упражнению «Обратный ход». Ответ. Это документ: клиент, велосипед, срок и залог — сведения о событии. Платформа сама даст команды записи, закрытия и проведения, если проведение разрешено; «Выдать» в скетче — скорее всего, именно проведение.
К упражнению «На чтение». Ответ. Лишние кнопки — стандартные команды от объекта: записать, записать и закрыть, провести, отменить проведение. В скетчах их обычно не рисуют, потому что их не задают.
§ 10.5. Где здесь код: события и обработчики
К вопросу 1. Ответ. В действие команды, в события формы и в события элементов.
К вопросу 2. Ответ. Событие — момент, о котором платформа сообщает: форма создаётся, открывается, поле изменилось. Обработчик — процедура, которую платформа вызывает в этот момент.
К вопросу 3. Ответ. По имени: «при создании на сервере» происходит на сервере, «при открытии» и «при изменении» — на клиенте, когда окно уже у человека.
К вопросу 4. Ответ. Пометки «на клиенте» и «на сервере» перед именем процедуры: они говорят, где процедуре работать. Читателю форм достаточно знать, что они есть и откуда растут — из клиент-серверной границы.
К вопросу 5. Ответ. Поле заполнилось само; сумма пересчиталась при вводе; нестандартный вопрос при закрытии; часть полей появилась не сразу; кнопка не делает ничего.
К вопросу 6. Указание. Что остаётся верным, даже когда элемент добавил код?
Полное решение. Правила описания. Поле всё равно связано с реквизитом через путь к данным, кнопка — с командой, роли форм и состав подсистем задаются не кодом. Код заполняет, пересчитывает, прячет, добавляет — но внутри тех же правил.
К вопросу 7. Ответ. Где форма оживает: что происходит при открытии и записи, какие поля влияют на другие, какие команды написаны, а какие заготовлены, — и насколько форма вообще «живая».
К упражнению «По образцу». Ответ. Команды записи и проведения; события формы — создание, открытие, перед записью, закрытие; события полей — изменение количества, цены, контрагента, склада.
К упражнению «Своё: предскажите обработчик». Ответ. К изменению поля велосипеда: выбрали велосипед — пересчитали залог. Если залог зависит ещё и от срока, обработчик понадобится и у поля срока.
К упражнению «Ловушка: „само заполнилось — значит, магия"». Ответ. Сначала правила объекта: заполнение по умолчанию, заполнение на основании. Потом обработчик в модуле формы. Порядок именно такой: правило видно без кода.
К упражнению «Обратный ход». Ответ. Что в форме много связанных значений: одно поле меняет другие. Такую форму без модуля не прочитать — по дереву видно только, где именно она оживает.
К упражнению «На чтение». Ответ. Его добавил код при открытии формы. Правилам он подчиняется тем же: показывает реквизит через путь к данным, лежит в группе, может иметь команду.
§ 10.6. Маршрут дальше
К вопросу 1. Ответ. Всё: чтение незнакомой формы, различение данных записи и данных формы, понимание того, что собрала платформа, чтение команд и поиск места, откуда форму открывают, — это умение читать описание.
К вопросу 2. Ответ. События и код формы; запросы с компоновкой данных; программное создание форм; мобильный интерфейс.
К вопросу 3. Ответ. Первые две: события и запросы. Остальные берут по задаче.
К вопросу 4. Ответ. Потому что место для кода уже известно: пустые процедуры за командами и события формы. Остаётся узнать, что в них писать, — это самый короткий путь от чтения к делу.
К вопросу 5. Ответ. За каждым динамическим списком и каждым отчётом стоит запрос. Не читая запросов, вы видите, что список показывает, но не знаете, откуда он это берёт.
К вопросу 6. Ответ. Читать чужое и отвечать на пять вопросов; называть замысел одной фразой; вести список находок; спрашивать людей.
К вопросу 7. Указание. Все три — про ожидание окончательной ясности.
Полное решение. Что код сделает формы полностью понятными — он объясняет поведение, но не замысел. Что компоновка сделает отчёты простыми — читаемыми, но не простыми. Что однажды непонятное закончится — оно будет всегда, изменится скорость разбора.
К упражнению «По образцу». Ответ. Маршрут обычно выходит такой: месяц на события и обработчики, два — на язык запросов, компоновка следом. Программные формы и мобильный — в список «когда понадобится».
К упражнению «Своё: три непонятные формы». Ответ. Граница у каждой будет своя: у одной код, у другой запрос, у третьей права или история системы. Чаще всего повторяется одна — она и есть следующий шаг.
К упражнению «Ловушка: „сначала выучу всё"». Ответ. Что ждать нечего: формы читаются уже сейчас, без кода и запросов, а умение читать делает изучение кода осмысленным — вы будете знать, куда он приходит и зачем.
К упражнению «Обратный ход». Ответ. Ему нужны главы о данных формы и о связи элемента с данными — чтобы знать, с чем работает его код; потом о командах — чтобы понимать, откуда его процедуру зовут; и разборы чужих форм, чтобы читать то, что написали другие.
К упражнению «На чтение». Ответ. Через месяц обычно оказывается, что треть находок объяснилась сама — просто вы дочитали книгу; треть требует короткого вопроса человеку; остальное ждёт кода или запросов. Это и есть полезная пропорция: большая часть «странностей» снимается чтением.