§ 6.7. Чужая форма: какие здесь таблицы и откуда у каждой строки

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

1. Три ответа на один вопрос

Вопрос к каждой таблице один: откуда её строки. Ответов ровно три — те самые, что мы разбирали по очереди всю главу.

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

Третья колонка — не просто следствие. Это самый быстрый способ проверить себя: если вы не можете сказать, что станет со строками при закрытии окна, вы ещё не определили тип таблицы.

Лицо таблицы плохо видно на экране. Надёжно оно читается в редакторе: путь и тип реквизита, к которому путь ведёт.

2. Первый взгляд: путь таблицы

Путь делит три случая надвое с первого взгляда — и делит по числу частей.

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

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

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

3. Второй взгляд: тип реквизита

Имя из пути ищут в списке реквизитов формы и смотрят на его тип.

тип реквизитачто за таблицаоткуда строки
ДинамическийСписокдинамический списокзапрос к базе
ТаблицаЗначенийтаблица значенийих кладёт обработчик

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

4. Подтверждающие признаки

Тип определён, но у каждого вида таблиц есть приметы, по которым ответ полезно перепроверить — и которые сами по себе говорят о форме кое-что.

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

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

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

5. Разбор на примере

Вот элементы чужой формы документа — с тремя таблицами сразу.

Форма
├── Шапка
│   ├── Номер, Дата
│   └── Контрагент, Склад
├── Страницы
│   ├── Товары
│   │   └── Товары
│   │       путь: Объект.Товары
│   ├── Остатки
│   │   └── Остатки
│   │       путь: ОстаткиНаСкладе
│   └── История
│       └── Поступления
│           путь: ПоступленияКонтрагента

Список реквизитов формы для той же формы:

Объект  ← основной
    ДокументОбъект.Реализация
ОстаткиНаСкладе
    ТаблицаЗначений
ПоступленияКонтрагента
    ДинамическийСписок

Дальше — два взгляда на каждую таблицу.

таблицапутьтипоткуда строки
ТоварыОбъект.Товары—из записи
ОстаткиОстаткиНаСкладеТаблицаЗначенийих кладёт обработчик
ПоступленияПоступленияКонтрагентаДинамическийСписокзапрос к базе

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

6. Четыре ловушки

На разобранном примере всё прозрачно; ошибаются обычно там, где смотреть в редактор кажется лишним.

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

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

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

Четвёртая: искать причину пустой таблицы в дереве объекта. Если строк нет, у каждого вида своя причина: у табличной части — их не вводили, у таблицы значений — обработчик не отработал или не вызывался, у списка — отбор. Три разных адреса, и путать их дорого.

7. Разбор по шагам

Пять шагов — и таблицы разобраны.

  1. Пройдите структуру элементов сверху вниз и выпишите все таблицы, не пропуская вложенные в группы и страницы.

  2. Для каждой запишите путь. Начинается с «Объект.» — табличная часть, вопрос закрыт.

  3. Остальные найдите по имени в списке реквизитов формы и посмотрите тип.

Здесь будет снимок экранаструктура элементов чужой формы с тремя таблицами, палитра свойств с путём к данным и список реквизитов с типами
  1. Проверьте себя приметами: пути колонок, настройки у реквизита, есть ли кому вводить строки.

  2. Для каждой таблицы скажите одной фразой, что станет со строками при закрытии окна без записи.

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

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

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


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

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

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

Упражнения

По образцу. Разберите по двум взглядам все таблицы формы поступления, которую вы собирали, и формы списка «Товаров».

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

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

Обратный ход. В форме есть таблица без единой кнопки, колонок в ней больше, чем реквизитов у объекта, а строки видны сразу при открытии. Что это за таблица и где искать, почему строк именно столько?

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

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