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