Особенности использования отборов в системе компоновки данных

В настройках компоновки данных возможно указание главного отбора и отбора группировок. Главный отбор устанавливается для всего отчета в целом. Отбор группировок устанавливается у конкретной группировки. В данной статье описываются особенности работы системы с главным и отборами группировок.

Главный отбор отчета

Главный отбор влияет на получение данных из наборов,  для вывода в отчет. Например, если в главный отбор добавить условие Номенклатура Равно "1С:Бухгалтерия  7.7 Стандартная версия", то в отчет будут выдаваться только записи, у которых поле Номенклатура имеет значение "1С:Бухгалтерия  7.7 Стандартная версия".

Применение отбора в запросах

Если возможно, условия из главного отбора помещается в текст запроса. Отбор может быть помещен в условие виртуальной таблицы, в предложение ГДЕ, в предложение ИМЕЮЩИЕ, в зависимости от того, на какое поле накладывается отбор.

В условие виртуальной таблицы отбор помещается в случае если в исходном запросе набора данных явно сказано, что отбор на данное поле нужно помещать в условие виртуальной таблицы или для набора данных указано автоматическое заполнение полей.

Пример явного указания необходимости помещения условия на поле Номенклатура в параметр виртуальной таблицы:

Копировать в буфер обмена
ВЫБРАТЬ
 ПродажиОбороты.Контрагент,
 ПродажиОбороты.Номенклатура,
 ПродажиОбороты.КоличествоОборот,
 ПродажиОбороты.СуммаОборот
ИЗ
 РегистрНакопления.Продажи.Обороты(, , , {(Номенклатура)}) КАК ПродажиОбороты

Сгенерированный запрос набора данных при применении отбора на поле Номенклатура может выглядеть следующим образом:

Копировать в буфер обмена
ВЫБРАТЬ
 ПродажиОбороты.Контрагент КАК Контрагент,
 ПродажиОбороты.Номенклатура КАК Номенклатура,
 ПродажиОбороты.КоличествоОборот КАК КоличествоОборот,
 ПродажиОбороты.СуммаОборот КАК СуммаОборот,
 ПРЕДСТАВЛЕНИЕССЫЛКИ(ПродажиОбороты.Контрагент) КАК КонтрагентПредставление,
 ПРЕДСТАВЛЕНИЕССЫЛКИ(ПродажиОбороты.Номенклатура) КАК НоменклатураПредставление
ИЗ
 РегистрНакопления.Продажи.Обороты(, , , Номенклатура = &П) КАК ПродажиОбороты

Как видно, отбор помещен в условие виртуальной таблицы.

В предложение ГДЕ условие помещается в случае если в исходном запросе набора данных явно сказано, что отбор на поле нужно помещать в предложение ГДЕ или при автоматическом заполнении. Если для набора данных указано автоматическое заполнение, то условие будет помещаться в предложение ГДЕ только в случае если отбор на поле не применилось в условии виртуальной таблицы, которая не находится в левой части соединения.

Пример. В наборе данных используется следующий запрос и используется автоматическое заполнение:

Копировать в буфер обмена
ВЫБРАТЬ
 ПродажиОбороты.Контрагент,
 ПродажиОбороты.Номенклатура,
 УчетНоменклатурыОстатки.Склад,
 ПродажиОбороты.КоличествоОборот,
 ПродажиОбороты.СуммаОборот,
 УчетНоменклатурыОстатки.КоличествоОстаток
ИЗ
 РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты
  ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.УчетНоменклатуры.Остатки КАК УчетНоменклатурыОстатки
  ПО ПродажиОбороты.Номенклатура = УчетНоменклатурыОстатки.Номенклатура

Если в отбор добавить условие на поля Номенклатура и Склад, то результирующий запрос будет выглядеть так:

Копировать в буфер обмена
ВЫБРАТЬ
 ПродажиОбороты.Контрагент КАК Контрагент,
 ПродажиОбороты.Номенклатура КАК Номенклатура,
 УчетНоменклатурыОстатки.Склад КАК Склад,
 ПродажиОбороты.КоличествоОборот КАК КоличествоОборот,
 ПродажиОбороты.СуммаОборот КАК СуммаОборот,
 УчетНоменклатурыОстатки.КоличествоОстаток КАК КоличествоОстаток,
 ПРЕДСТАВЛЕНИЕССЫЛКИ(ПродажиОбороты.Контрагент) КАК КонтрагентПредставление,
 ПРЕДСТАВЛЕНИЕССЫЛКИ(ПродажиОбороты.Номенклатура) КАК НоменклатураПредставление,
 ПРЕДСТАВЛЕНИЕССЫЛКИ(УчетНоменклатурыОстатки.Склад) КАК СкладПредставление
ИЗ
 РегистрНакопления.Продажи.Обороты(, , , Номенклатура = &П) КАК ПродажиОбороты
  ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.УчетНоменклатуры.Остатки(, (Номенклатура = &П) И Склад = &П2) КАК УчетНоменклатурыОстатки
  ПО ПродажиОбороты.Номенклатура = УчетНоменклатурыОстатки.Номенклатура
ГДЕ
 УчетНоменклатурыОстатки.Склад = &П2

Как видно, отбор на поле Номенклатура был помещен в параметры виртуальных таблиц и т.к. отбор на данное поле был помещен в таблицу, которая не находится в левом соединении (ПродажиОбороты), то отбор на это поле не был помещен предложение ГДЕ. Условие же на поле Склад было помещено как в виртуальную таблицу, так и в предложение ГДЕ, т.к. таблица УчетНоменклатурыОстатки, в условие которой помещен отбор, находится в левом соединении.

Если бы в исходном запросе было явное указание того, что условие на поле Номенклатуры нужно помещать в предложение ГДЕ, как в следующем запросе:

Копировать в буфер обмена
ВЫБРАТЬ
 ПродажиОбороты.Контрагент,
 ПродажиОбороты.Номенклатура,
 УчетНоменклатурыОстатки.Склад,
 ПродажиОбороты.КоличествоОборот,
 ПродажиОбороты.СуммаОборот,
 УчетНоменклатурыОстатки.КоличествоОстаток
ИЗ
 РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты
  ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.УчетНоменклатуры.Остатки КАК УчетНоменклатурыОстатки
  ПО ПродажиОбороты.Номенклатура = УчетНоменклатурыОстатки.Номенклатура
{ГДЕ
 ПродажиОбороты.Номенклатура.*}

То отбор на данное поле был бы добавлен в предложение ГДЕ результирующего запроса вне зависимости от того, был ли отбор помещен в условие виртуальной таблицы. Для выше описанного примера результирующий запрос бы выглядел следующим образом:

Копировать в буфер обмена
ВЫБРАТЬ
 ПродажиОбороты.Контрагент КАК Контрагент,
 ПродажиОбороты.Номенклатура КАК Номенклатура,
 УчетНоменклатурыОстатки.Склад КАК Склад,
 ПродажиОбороты.КоличествоОборот КАК КоличествоОборот,
 ПродажиОбороты.СуммаОборот КАК СуммаОборот,
 УчетНоменклатурыОстатки.КоличествоОстаток КАК КоличествоОстаток,
 ПРЕДСТАВЛЕНИЕССЫЛКИ(ПродажиОбороты.Контрагент) КАК КонтрагентПредставление,
 ПРЕДСТАВЛЕНИЕССЫЛКИ(ПродажиОбороты.Номенклатура) КАК НоменклатураПредставление,
 ПРЕДСТАВЛЕНИЕССЫЛКИ(УчетНоменклатурыОстатки.Склад) КАК СкладПредставление
ИЗ
 РегистрНакопления.Продажи.Обороты(, , , Номенклатура = &П) КАК ПродажиОбороты
  ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.УчетНоменклатуры.Остатки(, (Номенклатура = &П) И Склад = &П2) КАК УчетНоменклатурыОстатки
  ПО ПродажиОбороты.Номенклатура = УчетНоменклатурыОстатки.Номенклатура
ГДЕ
 ПродажиОбороты.Номенклатура = &П
 И УчетНоменклатурыОстатки.Склад = &П2

В предложение ИМЕЮЩИЕ условие помещается в случае если отбор накладывается на поле, выражение которого содержит агрегатную функцию.

Например, если исходный запрос, с автоматическим заполнением, выглядит так:

Копировать в буфер обмена
ВЫБРАТЬ
 РасходнаяНакладная.Контрагент,
 СУММА(РасходнаяНакладная.СуммаДок) КАК СуммаДок
ИЗ
 Документ.РасходнаяНакладная КАК РасходнаяНакладная
СГРУППИРОВАТЬ ПО
 РасходнаяНакладная.Контрагент

То при применении отбора на поле СуммаДок результирующий запрос будет выглядеть так:

Копировать в буфер обмена
ВЫБРАТЬ
 РасходнаяНакладная.Контрагент КАК Контрагент,
 СУММА(РасходнаяНакладная.СуммаДок) КАК СуммаДок,
 ПРЕДСТАВЛЕНИЕССЫЛКИ(РасходнаяНакладная.Контрагент) КАК КонтрагентПредставление
ИЗ
 Документ.РасходнаяНакладная КАК РасходнаяНакладная
СГРУППИРОВАТЬ ПО
 РасходнаяНакладная.Контрагент
ИМЕЮЩИЕ
 СУММА(РасходнаяНакладная.СуммаДок) = &П

Отбор, применяемый не в запросе

В некоторых ситуациях поместить условие в текст запроса не удается. Такое может произойти в случае если в условии используются поля из нескольких наборов данных или в условии используется вычисляемое или пользовательское поле, содержащее выражения, которые не могут быть представлены на языке запросов. В этом случае выражение условие помещается в свойство Отбор сгенерированного набора данных макета компоновки данных. Если в условии использовались поля из нескольких наборов данных, то условие будет помещаться в последний по связи дочерний набор данных, поле которого используется в условии. Например, если в схеме определены наборы данных Продажи и связанный с ним набор данных Остатки и в условии используются поля из обоих наборов данных, то условие будет помещено в свойство Отбор набора данных Остатки.

Особенности использования отбора при работе с несколькими наборами данных

При использовании в схеме нескольких наборов данных, если в главном отборе накладывается условие на поле некоторого дочернего набора данных, то в сгенерированном макете компоновки данных дочерний набор данных будет связан с родительским набором данных с типом связи "Внутренняя". Родительские наборы данных набора данных, к которому применяется условие, также будут связаны со своими родительскими наборами данных с типом связи "Внутренняя". Тип связи "Внутренняя" означает, что запись родительского набора данных будет выводиться в результат отчета только в случае, если в дочернем наборе данных будут найдены связанные записи. Например, если в схеме определены наборы данных Продажи и связанный с ним набор данных Остатки и в условии используются поле из набора данных Остатки, то в сгенерированном макете компоновки данных связь между этими наборами данных будет определена с типом связи "Внутренняя". Если бы при этом набор данных Продажи был в свою очередь приемником связи для некоторого другого набора данных, то и эта связь также была бы сгенерирована с типом связи "Внутренняя".

Отбор группировок

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

Например. В схеме компоновки опишем набор данных, который получает остатки номенклатуры по складам.

В настройках отчета создадим следующую структуру:

В первую группировку по полю Номенклатура добавим условие Склад Равно "Основной склад". В группировку по полю Склад добавим условие Склад Не Равно "Основной склад".

Результат отчета будет выглядеть следующим образом:

Отбор: Склад Равно "Основной склад"  
   
Номенклатура Количество остаток  
1С:Аспект 7.7 10,00  
1С:Бухгалтерия 7.7 Базовая версия 15,00  
1С:Бухгалтерия 7.7 Стандартная версия 5,00  
1С:Бухгалтерия ПРОФ версия 7.7 2,00  
1С:Торговля и Склад 7.7 Проф 2,00  
Windows XP Home Edition Russian CD 14,00  
Windows XP Home Edition Russian UPG CD 20,00  
Windows XP Professional Russian CD 2,00  
Клавиатура Apple Pro Keyboards 7,00  
Клавиатура Keyboard PS/2 11,00  
Клавиатура Linkworld LK-601 PS/2 30,00  
Клавиатура LK-601 KB-2 000 PS/2 17,00  
Лазерный принтер 5250197-203 Minolta-QMS 1,00  
Лазерный принтер Canon LBP-810 2,00  
Лазерный принтер HP LaserJet 2200 2,00  
Монитор 15' LG Studioworks 575N 4,00  
Монитор 19' Hitachi CM715ET 4,00  
Монитор LCD 22' M8537ZM/A 1,00  
Мышь 2-кноп A4Tech PS/2 16,00  
Мышь GENIUS "EASY" (3 кнопки), 35,00  
Мышь Ice Mouse MUS-2 8,00  
Мышь LOGITECH M-S48 PS/2 1,00  
Сист. блок Hewlett-Packard Brio BA410 10,00  
Сист. блок Hewlett-Packard Vectra VL420 2,00  
Сист. блок IBM NetVista A22p 5,00  
Сист. блок IBM NetVista M41 3,00  
Итого 229,00  
   
Отбор: Склад Не равно "Основной склад"  
   
Склад Количество остаток  
Номенклатура  
Витрина в офисе 23,00  
1С:Аспект 7.7 2,00  
1С:Бухгалтерия 7.7 Базовая версия 1,00  
1С:Бухгалтерия 7.7 Стандартная версия 1,00  
1С:Бухгалтерия ПРОФ версия 7.7 1,00  
1С:Торговля и Склад 7.7 Проф 1,00  
Windows XP Home Edition Russian CD 2,00  
Windows XP Home Edition Russian UPG CD 5,00  
Windows XP Professional Russian CD 2,00  
Клавиатура Keyboard PS/2 3,00  
Лазерный принтер 5250197-203 Minolta-QMS 1,00  
Лазерный принтер Canon LBP-810 1,00  
Мышь GENIUS "EASY" (3 кнопки), 2,00  
Ноутбук Rover Computers Explorer 1,00  
Склад отдела продаж 58,00  
1С:Аспект 7.7 1,00  
1С:Бухгалтерия ПРОФ версия 7.7 1,00  
1С:Торговля и Склад 7.7 Проф 1,00  
Windows XP Home Edition Russian CD 1,00  
Windows XP Home Edition Russian UPG CD 4,00  
Клавиатура Apple Pro Keyboards 1,00  
Клавиатура Keyboard PS/2 2,00  
Клавиатура Linkworld LK-601 PS/2 5,00  
Клавиатура LK-601 KB-2 000 PS/2 5,00  
Монитор 17' Philips 107S20 1,00  
Монитор 19' Hitachi CM715ET 4,00  
Мышь GENIUS "EASY" (3 кнопки), 5,00  
Мышь Ice Mouse MUS-2 16,00  
Мышь LOGITECH M-S48 PS/2 5,00  
Мышь OK-720 Mouse A4Tech PS/2 1,00  
Ноутбук Rover Computers Navigator KT7 4,00  
Сист. блок Hewlett-Packard Vectra VL420 1,00  
Итого 81,00  

Как видно, в первой группировке выданы остатки номенклатуры по складу "Основной склад". В следующих группировках выдаются остатки номенклатуры по другим складам.

Тип применения отбора группировок

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

Возможны три варианта типа применения:

В следующем примере в результат отчета выдаются четыре группировки по полю Номенклатура. При этом в первой группировке выводятся записи без отбора, а в остальных группировках выдаются записи с отбором Количество остаток больше 40, с типами применения Без иерархии, Иерархия, Только иерархия.

Без отбора  
   
Номенклатура Количество остаток  
Клавиатура Keyboard PS/2 16,00  
Клавиатуры 65,00  
Клавиатура Apple Pro Keyboards 8,00  
Клавиатура Linkworld LK-601 PS/2 35,00  
Клавиатура LK-601 KB-2 000 PS/2 22,00  
Мониторы 14,00  
Монитор 15' LG Studioworks 575N 4,00  
Монитор 17' Philips 107S20 1,00  
Монитор 19' Hitachi CM715ET 8,00  
Монитор LCD 22' M8537ZM/A 1,00  
Мыши 89,00  
Мышь LOGITECH M-S48 PS/2 6,00  
Мышь OK-720 Mouse A4Tech PS/2 1,00  
Оптические мыши 82,00  
Мышь 2-кноп A4Tech PS/2 16,00  
Мышь GENIUS "EASY" (3 кнопки), 42,00  
Мышь Ice Mouse MUS-2 24,00  
Ноутбуки 5,00  
Ноутбук Rover Computers Explorer 1,00  
Ноутбук Rover Computers Navigator KT7 4,00  
Принтеры 7,00  
Лазерный принтер 5250197-203 Minolta-QMS 2,00  
Лазерный принтер Canon LBP-810 3,00  
Лазерный принтер HP LaserJet 2200 2,00  
Программное обеспечение 93,00  
1С:Аспект 7.7 13,00  
1С:Бухгалтерия 7.7 Базовая версия 16,00  
1С:Бухгалтерия 7.7 Стандартная версия 6,00  
1С:Бухгалтерия ПРОФ версия 7.7 4,00  
1С:Торговля и Склад 7.7 Проф 4,00  
Windows XP Home Edition Russian CD 17,00  
Windows XP Home Edition Russian UPG CD 29,00  
Windows XP Professional Russian CD 4,00  
Системные блоки и комплектующие 21,00  
Сист. блок Hewlett-Packard Brio BA410 10,00  
Сист. блок Hewlett-Packard Vectra VL420 3,00  
Сист. блок IBM NetVista A22p 5,00  
Сист. блок IBM NetVista M41 3,00  
Итого 310,00  
   
Без иерархии  
Отбор: Количество остаток Больше "40"  
   
Номенклатура Количество остаток  
Мыши 42,00  
Оптические мыши 42,00  
Мышь GENIUS "EASY" (3 кнопки), 42,00  
Итого 42,00  
   
Иерархия  
Отбор: Количество остаток Больше "40"  
   
Номенклатура Количество остаток  
Клавиатуры 65,00  
Мыши 89,00  
Оптические мыши 82,00  
Мышь GENIUS "EASY" (3 кнопки), 42,00  
Программное обеспечение 93,00  
Итого 310,00  
   
Только иерархия  
Отбор: Количество остаток Больше "40"  
   
Номенклатура Количество остаток  
Клавиатура Keyboard PS/2 16,00  
Клавиатуры 65,00  
Клавиатура Apple Pro Keyboards 8,00  
Клавиатура Linkworld LK-601 PS/2 35,00  
Клавиатура LK-601 KB-2 000 PS/2 22,00  
Мыши 89,00  
Мышь LOGITECH M-S48 PS/2 6,00  
Мышь OK-720 Mouse A4Tech PS/2 1,00  
Оптические мыши 82,00  
Мышь 2-кноп A4Tech PS/2 16,00  
Мышь GENIUS "EASY" (3 кнопки), 42,00  
Мышь Ice Mouse MUS-2 24,00  
Программное обеспечение 93,00  
1С:Аспект 7.7 13,00  
1С:Бухгалтерия 7.7 Базовая версия 16,00  
1С:Бухгалтерия 7.7 Стандартная версия 6,00  
1С:Бухгалтерия ПРОФ версия 7.7 4,00  
1С:Торговля и Склад 7.7 Проф 4,00  
Windows XP Home Edition Russian CD 17,00  
Windows XP Home Edition Russian UPG CD 29,00  
Windows XP Professional Russian CD 4,00  
Итого 310,00  

Особенности отбора по полям - ресурсам

При использовании отбора на поля - ресурсы следует учитывать, что в случае если отбор на поле - ресурс был добавлен в главный отбор отчета, то этот отбор, будет помещен в текст запроса, т.е. фильтроваться будут именно детальные записи, которые получаются из запроса, а не итоги ресурса для группировок.

Например, если используется следующий запрос:

Копировать в буфер обмена
ВЫБРАТЬ
 ПродажиОбороты.Контрагент,
 ПродажиОбороты.Номенклатура,
 ПродажиОбороты.КоличествоОборот,
 ПродажиОбороты.СуммаОборот
ИЗ
 РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты

И в главный отбор добавляется условие на поле КоличествоОборот, то в результирующий запрос будет добавлено условие

Копировать в буфер обмена
ГДЕ
ПродажиОбороты.КоличествоОборот > &П

Т.к. в запросе используется виртуальная таблица Обороты, которая выдает агрегированные данные в зависимости от использованных полей, то результат отчета будет зависеть от того, какие поля будут задействованы в настройках отчета. Так, если в отчете задействовано только поле Контрагент, то в результат будут выдаваться записи для контрагентов, по которым оборот превышал заданную величину, а если задействованы поля Контрагент и Номенклатура, то в результат будут выдаваться записи для сочетаний контрагентов и номенклатуры, по которым оборот превысил заданную величину.

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

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