В некоторых случаях при задании элементарных критериев групп фильтра оказывается выгоднее использовать не поля таблицы, присоединенной к типу объектов, а поля выборки, основанной на этой таблице. В качестве примеров можно назвать две подобных ситуации:
Если в поле таблицы содержится код, которому можно сопоставить значение из справочника (см. гл. 27 «Справочники»), то использование выборки, в которой установлен справочник, позволяет использовать это значение при задании критерия. Например, вместо кода улицы, содержащегося в таблице «Паспорта зданий», можно будет задавать название этой улицы по таблице-справочнику «Справочник улиц».
Если часть информации об объектах данного типа содержится в таблице, которая не присоединена к этому типу явно, но связана с другой, присоединенной таблицей в выборке, использующей соединение таблиц (см. гл. 28 «Соединение таблиц»), то такая информация также может быть использована при построении фильтра. Пусть, например, требуется построить фильтр для участков, использующий фамилию владельца участка. В таблице «Паспорта зданий» нет фамилий владельцев, они содержатся в другой таблице, «Владельцы участков», которая не является присоединенной для типа объектов «Земельный участок». Выборка «Паспорта участков с информацией о владельцах» решает эту проблему.
Однако не все так просто. Иногда результат использования выборки в критерии фильтра оказывается далек от ожидаемого или просто непонятен. Пусть, например, в критерии для зданий использовано вычисляемое поле «Количество жителей» из выборки «Распределение жителей по улицам». Пользователь может ожидать, что в результате стиль отображения здания будет определяться суммарным количеством жителей на той улице, где стоит это здание. На самом же деле будет учитываться лишь количество жителей в данном здании.
Чтобы понять, почему так происходит, нужно понимать общий алгоритм использования полей выборок в элементарном критерии фильтра. Этот алгоритм заключается в следующем:
Выбираются все записи корневой таблицы выборки, присоединенные к данному объекту. В случае уникальной связи будет выбрано не более одной записи, при множественной связи это может быть несколько записей.
Все выбранные записи корневой таблицы рассматриваются как «временная таблица», и именно к этой временной таблице (а не ко всей корневой таблице) применяются операции построения выборки: соединения, установка справочников, вычисления и т.п.
Записи полученной таким образом выборки используются для вычисления элементарного критерия для данного объекта. Если выборка содержит более одной записи, то используется заданный вариант отношения.
Теперь нетрудно понять, почему количество жителей не суммируется по всем зданиям улицы. Для любого данного здания существует как максимум один паспорт (поскольку связь с таблицей «Паспорта зданий» задана как уникальная), поэтому «временная таблица» содержит не более одной записи. Операция суммирования количества жителей по улицам в таком случае сведется к «суммированию» единственного слагаемого – количества жителей в данном здании.
Пользователю, не желающему запутаться в тонкостях использования выборок при задании критерия фильтра, можно порекомендовать следующее:
Не использовать в критерии фильтра выборок, содержащих вычисления.
Выборки, содержащие соединения, использовать только в том случае, если поле соединения в корневой таблице является уникальным. Это позволит избежать сложностей, возникающих для соединений типа «многие к одному» и «многие ко многим».