На 2ые сутки борьбы с отчетом, я понял что такое галочка Автозаполнение в СКД. Жесть конечно, теперь буду знать. http://its.1c.ru/db/metod81#content:2696:1
Особенности использования отборов в системе компоновки данных
В настройках компоновки данных возможно указание главного отбора и отбора группировок. Главный отбор устанавливается для всего отчета в целом. Отбор группировок устанавливается у конкретной группировки. В данной статье описываются особенности работы системы с главным и отборами группировок.
Главный отбор отчета
Главный отбор влияет на получение данных из наборов, для вывода в отчет. Например, если в главный отбор добавить условие Номенклатура Равно «1С:Бухгалтерия 7.7 Стандартная версия», то в отчет будут выдаваться только записи, у которых поле Номенклатура имеет значение «1С:Бухгалтерия 7.7 Стандартная версия».
Применение отбора в запросах
Если возможно, условия из главного отбора помещается в текст запроса. Отбор может быть помещен в условие виртуальной таблицы, в предложение ГДЕ, в предложение ИМЕЮЩИЕ, в зависимости от того, на какое поле накладывается отбор.
В условие виртуальной таблицы отбор помещается в случае если в исходном запросе набора дынных явно сказано, что отбор на данное поле нужно помещать в условие виртуальной таблицы или для набора данных указано автоматическое заполнение полей.
Пример явного указания необходимости помещения условия на поле Номенклатура в параметр виртуальной таблицы:
ВЫБРАТЬ ПродажиОбороты.Контрагент, ПродажиОбороты.Номенклатура, ПродажиОбороты.КоличествоОборот, ПродажиОбороты.СуммаОборот ИЗ РегистрНакопления.Продажи.Обороты(, , , {(Номенклатура)}) КАК ПродажиОбороты
Сгенерированный запрос набора данных при применении отбора на поле Номенклатура может выглядеть следующим образом:
ВЫБРАТЬ ПродажиОбороты.Контрагент КАК Контрагент, ПродажиОбороты.Номенклатура КАК Номенклатура, ПродажиОбороты.КоличествоОборот КАК КоличествоОборот, ПродажиОбороты.СуммаОборот КАК СуммаОборот, ПРЕДСТАВЛЕНИЕССЫЛКИ(ПродажиОбороты.Контрагент) КАК КонтрагентПредставление, ПРЕДСТАВЛЕНИЕССЫЛКИ(ПродажиОбороты.Номенклатура) КАК НоменклатураПредставление ИЗ РегистрНакопления.Продажи.Обороты(, , , Номенклатура = &П) КАК ПродажиОбороты
Как видно, отбор помещен в условие виртуальной таблицы.
В предложение ГДЕ условие помещается в случае если в исходном запросе набора данных явно сказано, что отбор на поле нужно помещать в предложение ГДЕ или при автоматическом заполнении. Если для набора данных указано автоматическое заполнение, то условие будет помещаться в предложение ГДЕ только в случае если отбор на поле не применилось в условии виртуальной таблицы, которая не находится в левой части соединения.
Пример. В наборе данных используется следующий запрос и используется автоматическое заполнение:
ВЫБРАТЬ ПродажиОбороты.Контрагент, ПродажиОбороты.Номенклатура, УчетНоменклатурыОстатки.Склад, ПродажиОбороты.КоличествоОборот, ПродажиОбороты.СуммаОборот, УчетНоменклатурыОстатки.КоличествоОстаток ИЗ РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.УчетНоменклатуры.Остатки КАК УчетНоменклатурыОстатки ПО ПродажиОбороты.Номенклатура = УчетНоменклатурыОстатки.Номенклатура
Если в отбор добавить условие на поля Номенклатура и Склад, то результирующий запрос будет выглядеть так:
ВЫБРАТЬ ПродажиОбороты.Контрагент КАК Контрагент, ПродажиОбороты.Номенклатура КАК Номенклатура, УчетНоменклатурыОстатки.Склад КАК Склад, ПродажиОбороты.КоличествоОборот КАК КоличествоОборот, ПродажиОбороты.СуммаОборот КАК СуммаОборот, УчетНоменклатурыОстатки.КоличествоОстаток КАК КоличествоОстаток, ПРЕДСТАВЛЕНИЕССЫЛКИ(ПродажиОбороты.Контрагент) КАК КонтрагентПредставление, ПРЕДСТАВЛЕНИЕССЫЛКИ(ПродажиОбороты.Номенклатура) КАК НоменклатураПредставление, ПРЕДСТАВЛЕНИЕССЫЛКИ(УчетНоменклатурыОстатки.Склад) КАК СкладПредставление ИЗ РегистрНакопления.Продажи.Обороты(, , , Номенклатура = &П) КАК ПродажиОбороты ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.УчетНоменклатуры.Остатки(, (Номенклатура = &П) И Склад = &П2) КАК УчетНоменклатурыОстатки ПО ПродажиОбороты.Номенклатура = УчетНоменклатурыОстатки.Номенклатура ГДЕ УчетНоменклатурыОстатки.Склад = &П2
Как видно, отбор на поле Номенклатура был помещен в параметры виртуальных таблиц и т.к. отбор на данное поле был помещен в таблицу, которая не находится в левом соединении (ПродажиОбороты), то отбор на это поле не был помещен предложение ГДЕ. Условие же на поле Склад было помещено как в виртуальную таблицу, так и в предложение ГДЕ, т.к. таблица УчетНоменклатурыОстатки, в условие которой помещен отбор, находится в левом соединении.
Если бы в исходном запросе было явное указание того, что условие на поле Номенклатуры нужно помещать в предложение ГДЕ, как в следующем запросе:
ВЫБРАТЬ ПродажиОбороты.Контрагент, ПродажиОбороты.Номенклатура, УчетНоменклатурыОстатки.Склад, ПродажиОбороты.КоличествоОборот, ПродажиОбороты.СуммаОборот, УчетНоменклатурыОстатки.КоличествоОстаток ИЗ РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.УчетНоменклатуры.Остатки КАК УчетНоменклатурыОстатки ПО ПродажиОбороты.Номенклатура = УчетНоменклатурыОстатки.Номенклатура {ГДЕ ПродажиОбороты.Номенклатура.*}
То отбор на данное поле был бы добавлен в предложение ГДЕ результирующего запроса вне зависимости от того, был ли отбор помещен в условие виртуальной таблицы. Для выше описанного примера результирующий запрос бы выглядел следующим образом:
ВЫБРАТЬ ПродажиОбороты.Контрагент КАК Контрагент, ПродажиОбороты.Номенклатура КАК Номенклатура, УчетНоменклатурыОстатки.Склад КАК Склад, ПродажиОбороты.КоличествоОборот КАК КоличествоОборот, ПродажиОбороты.СуммаОборот КАК СуммаОборот, УчетНоменклатурыОстатки.КоличествоОстаток КАК КоличествоОстаток, ПРЕДСТАВЛЕНИЕССЫЛКИ(ПродажиОбороты.Контрагент) КАК КонтрагентПредставление, ПРЕДСТАВЛЕНИЕССЫЛКИ(ПродажиОбороты.Номенклатура) КАК НоменклатураПредставление, ПРЕДСТАВЛЕНИЕССЫЛКИ(УчетНоменклатурыОстатки.Склад) КАК СкладПредставление ИЗ РегистрНакопления.Продажи.Обороты(, , , Номенклатура = &П) КАК ПродажиОбороты ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.УчетНоменклатуры.Остатки(, (Номенклатура = &П) И Склад = &П2) КАК УчетНоменклатурыОстатки ПО ПродажиОбороты.Номенклатура = УчетНоменклатурыОстатки.Номенклатура ГДЕ ПродажиОбороты.Номенклатура = &П И УчетНоменклатурыОстатки.Склад = &П2
В предложение ИМЕЮЩИЕ условие помещается в случае если отбор накладывается на поле, выражение которого содержит агрегатную функцию.
Например, если исходный запрос, с автоматическим заполнением, выглядит так:
ВЫБРАТЬ РасходнаяНакладная.Контрагент, СУММА(РасходнаяНакладная.СуммаДок) КАК СуммаДок ИЗ Документ.РасходнаяНакладная КАК РасходнаяНакладная СГРУППИРОВАТЬ ПО РасходнаяНакладная.Контрагент
То при применении отбора на поле СуммаДок результирующий запрос будет выглядеть так:
ВЫБРАТЬ РасходнаяНакладная.Контрагент КАК Контрагент, СУММА(РасходнаяНакладная.СуммаДок) КАК СуммаДок, ПРЕДСТАВЛЕНИЕССЫЛКИ(РасходнаяНакладная.Контрагент) КАК КонтрагентПредставление ИЗ Документ.РасходнаяНакладная КАК РасходнаяНакладная СГРУППИРОВАТЬ ПО РасходнаяНакладная.Контрагент ИМЕЮЩИЕ СУММА(РасходнаяНакладная.СуммаДок) = &П
Отбор, применяемый не в запросе
В некоторых ситуациях поместить условие в текст запроса не удается. Такое может произойти в случае если в условии используются поля из нескольких наборов данных или в условии используется вычисляемое или пользовательское поле, содержащее выражения, которые не могут быть представлены на языке запросов. В этом случае выражение условие помещается в свойство Отбор сгенерированного набора данных макета компоновки данных. Если в условии использовались поля из нескольких наборов данных, то условие будет помещаться в последний по связи дочерний набор данных, поле которого используется в условии. Например, если в схеме определены наборы данных Продажи и связанный с ним набор данных Остатки и в условии используются поля из обоих наборов данных, то условие будет помещено в свойство Отбор набора данных Остатки.
Особенности использования отбора при работе с несколькими наборами данных
При использовании в схеме нескольких наборов данных, если в главном отборе накладывается условие на поле некоторого дочернего набора данных, то в сгенерированном макете компоновки данных дочерний набор данных будет связан с родительским набором данных с типом связи «Внутренняя». Родительские наборы данных набора данных, к которому применяется условие, также будут связаны со своими родительскими наборами данных с типом связи «Внутренняя». Тип связи «Внутренняя» означает, что запись родительского набора данных будет выводиться в результат отчета только в случае, если в дочернем наборе данных будут найдены связанные записи. Например, если в схеме определены наборы данных Продажи и связанный с ним набор данных Остатки и в условии используются поле из набора данных Остатки, то в сгенерированном макете компоновки данных связь между этими наборами данных будет определена с типом связи «Внутренняя». Если бы при этом набор данных Продажи был в свою очередь приемником связи для некоторого другого набора данных, то и эта связь также была бы сгенерирована с типом связи «Внутренняя».
Отбор группировок
Отбор группировок используется для фильтрации записей, выводимых в группировке. При этом отбор распространяется на саму группировку, на вложенные группировки, и не влияет на другие группировки имеющиеся в отчете.
Например. В схеме компоновки опишем набор данных, который получает остатки номенклатуры по складам.
В настройках отчета создадим следующую структуру:
В первую группировку по полю Номенклатура добавим условие Склад Равно «Основной склад». В группировку по полю Склад добавим условие Склад Не Равно «Основной склад».
Результат отчета будет выглядеть следующим образом:
Как видно, в первой группировке выданы остатки номенклатуры по складу «Основной склад». В следующих группировках выдаются остатки номенклатуры по другим складам.
Тип применения отбора группировок
В отборах, применяемых к группировкам, возможно указание типа применения условия для выводимых записей.
Возможны три варианта типа применения:
- Без иерархии — условие применяется только к не иерархическим записям. При этом иерархические записи не фильтруются. В отчет выдаются только те иерархические записи, в которых присутствуют не иерархические записи, удовлетворяющие условию. Итог по ресурсам в иерархических записях и общий итог по группировки учитывает условие.
- Иерархия — условие применяется как к не иерархическим, как и к иерархическим записям. Итог по ресурсам в иерархических записях и общий итог по группировке отбор не учитывает.
- Только иерархия — условие применяется только к иерархическим записям. Итог по ресурсам в иерархических записях и общий итог по группировке отбор не учитывает.
В следующем примере в результат отчета выдаются четыре группировки по полю Номенклатура. При этом в первой группировке выводятся записи без отбора, а в остальных группировках выдаются записи с отбором Количество остаток больше 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 |
Особенности отбора по полям — ресурсам
При использовании отбора на поля — ресурсы следует учитывать, что в случае если отбор на поле — ресурс был добавлен в главный отбор отчета, то этот отбор, будет помещен в текст запроса, т.е. фильтроваться будут именно детальные записи, которые получаются из запроса, а не итоги ресурса для группировок.
Например, если используется следующий запрос:
ВЫБРАТЬ ПродажиОбороты.Контрагент, ПродажиОбороты.Номенклатура, ПродажиОбороты.КоличествоОборот, ПродажиОбороты.СуммаОборот ИЗ РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты
И в главный отбор добавляется условие на поле КоличествоОборот, то в результирующий запрос будет добавлено условие
ГДЕ ПродажиОбороты.КоличествоОборот > &П
Т.к. в запросе используется виртуальная таблица Обороты, которая выдает агрегированные данные в зависимости от использованных полей, то результат отчета будет зависеть от того, какие поля будут задействованы в настройках отчета. Так, если в отчете задействовано только поле Контрагент, то в результат будут выдаваться записи для контрагентов, по которым оборот превышал заданную величину, а если задействованы поля Контрагент и Номенклатура, то в результат будут выдаваться записи для сочетаний контрагентов и номенклатуры, по которым оборот превысил заданную величину.
Таким образом, если в отчете требуется получить только записи группировки, в которых значение ресурса удовлетворяет некоторому условию, то следует добавлять отбор в группировку, а не в главный отбор.
Например, для того, чтобы в отчете, в группировке номенклатуры, получить номенклатуру, с оборотом, превышающим некоторую величину, то отбор следует применять в группировке по номенклатуре.