6. Отчёты

Примеры отчетов См. также статью.

Отчеты (и запросы) - простое средство извлечения и сведения данных из разных форм. Отчет может группировать данные и проделывать с ними различные вычисления. Примерами отчетов могут быть: остатки товаров на складе, доходы и расходы за период, статистика продаж и т. д. Отчет отображается в отдельном окне в виде таблицы. Данные отчета могут быть ограничены параметрами, которые определяет набор отображаемых данных.

Отчёт в рабочем режиме

Управление отчетами

Управления отчетами осуществляется в окне отчетов, доступном из меню «Файл-Отчеты». Отчеты можно настраивать в дизайнере и в пользовательском режиме. Отчет имеет множество настроек. Все начинается с настройки отбора.

Настройка отчёта

Настройки отбора

Настройка отбора В настройках отбора вы указываете из каких форм извлекать данные, какие вычисления проводить с ними, какие поля должны отображаться, а какие выступать в роли параметров. В качестве источника отбора может выступать форма и (необязательно) одна подчиненная форма (таблица). В отборе может быть один или несколько источников. Выберите поля, которые вы хотите видеть в результате. Для этого нажмите кнопку «Добавить поле» и в новой строке дважды щелкните по ячейке. Поля, принадлежащие основной форме, отмечаются восклицательным знаком перед именем.  Выбор поля Поля типа «объект» содержат в себе поля связанной формы - поля объекта, в том числе вложенные объекты. Обычно вам нужно будет выбирать какое-либо поле объекта, а не сам объект, т. к. если выбрать сам объект (к примеру, «Товар» или «Товар|Группа»), то в отчете вы увидите непонятные числа, вместо текста. На самом деле это ID записей связанной формы, но для пользователя они не имеют смысла. Имена полей должны быть уникальными. Напротив каждого поля вы можете указать видимость поля в отчете и возможность фильтрации по этому полю (флажок «Параметр»). Имена полей должны быть уникальными. Допускается совпадение имен только для пары полей, если одно видимое, а другое является параметром.

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

  • Сумма - вычисляет итоговую сумму.
  • Среднее - вычисляет среднее значение.
  • Максимум - вычисляет максимальное значение.
  • Минимум - вычисляет минимальное значение.
  • Количество - считает количество записей или непустых значений (зависит от того выбрано ли поле).
  • Баланс - вычисляет разницу прихода и расхода. Нужно обязательно указывать тип источника: приход или расход.
  • Кол-во различных - считает кол-во уникальных значений поля.
  • Соединить - соединяет значения поля в одну строку, разделяя значения точкой с запятой и пробелом. В результат не включаются повторяющиеся значения.
  • Соединить все - соединяет значения поля в одну строку, разделяя значения точкой с запятой и пробелом. В результат входят все значения, в том числе повторы.

Для функций «Сумма», «Среднее», «Баланс» подходят только числовые поля. Для остальных функций подходят любые поля.

Быстрое добавление полей в отбор

В левом верхнем углу окна есть кнопка «Подбор». Она открывает окно выбора поля в режиме подбора. Щелкайте дважды по полям, чтобы добавить их в отбор. Закройте окно, когда добавите все необходимые поля в отбор. Когда добавляется поле, программа ищет первую незаполненную ячейку в источнике, начиная с текущей выделенной ячейки. Если пустая ячейка найдена, программа выделяет и заполняет ее. Если все ячейки заполнены, программа добавляет новую строку в отбор и заполняет ячейку.

Принцип работы функций

Рассмотрим на простом примере как работают функции и группировка данных. Пусть есть форма со следующими данными:

Номер Дата Товар Единица измерения Количество
12 10.02.2020 Крупа кг 100
15 13.02.2020 Хлеб шт 30
16 15.02.2020 Крупа кг 50
17 02.03.2020 Хлеб шт 20
18 09.03.2020 Крупа т 2

Посчитаем сколько всего хлеба и крупы с учетом единицы измерения. В отборе выберем поля и функцию. Будет это выглядеть следующим образом (схематично):

Поле Функция
Товар
Единица измерения
Количество Сумма

Если в отборе выбирается хотя бы одна функция, то все поля, для которых функция не выбрана, становятся группой. В нашем случае группой становятся поля «Товар» и «Единица измерения». Группа - это некоторая комбинация значений, которая может повторяться в базе и для которой будет вычислена функция. В примере мы можем выделить следующие группы: Крупа-кг, Крупа-т, Хлеб-шт. В результате работы отчета получится следующий результат:

Товар Единица измерения Сумма (Количество)
Крупа кг 150
Крупа т 2
Хлеб шт 50

В зависимости от функции результат будет отличаться. Посмотрим какой результат будет, если выбрать другую функцию:

Товар Единица измерения Среднее Максимум Минимум Количество Соединить
Крупа кг 75 100 50 2 100; 50
Крупа т 2 2 2 1 2
Хлеб шт 25 30 20 2 30; 20

Функции «Сумма», «Среднее» и «Баланс» могут работать только с числовыми полями. Для остальных функций поля могут быть любых типов.

Влияние значений NULL на результат функции

Если в выбранных полях встречаются пустые поля (содержат значение NULL), то все функции будут игнорировать эти значения. Т. е. наличие таких пустых значений на результат никак не влияет.

Функция "Количество уникальных"

Функция вычисляет количество уникальных значений, входящих в группу. Возьмем для примера исходные данные формы, указанные в таблице выше. Посчитаем для каждого товара количество уникальных единиц измерения. Для сравнения добавим еще функцию «Количество». Настройки отбора будут выглядеть следующим образом:

Поле Функция
Товар
Единица измерения Количество уникальных
Единица измерения Количество

Поле «Товар» является группой. В группу входят следующие значения: Крупа и Хлеб. Для круп имеется две уникальных единицы измерения: кг и т, для хлеба - шт. Результат работы отчета будет следующим:

Товар Количество уникальных Количество
Крупа 2 3
Хлеб 1 2

Вычисление функций за период

Группировка по дате Если в отборе присутствует дата и функции, то можно группировать результаты вычислений функций по периодам: дням, неделям, месяцам, кварталам, полугодиям и годам. Для этого в списке «Группировка по дате» выбирается поле даты и выбирается период. Дата будет преобразована к виду, в зависимости от выбранного периода. К примеру, если выбран период «Месяц», то из даты будет извлекаться месяц и год и преобразовываться к виду: год.месяц. С помощью такой группировки вы легко можете узнать, например, сумму заказов в каждом месяце.

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

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

Поле Функция
Дата
Количество Сумма

Период: день

Дата Сумма (Количество)
10.02.2020 100
13.02.2020 30
15.02.2020 50
02.03.2020 20
09.03.2020 2

Период: Месяц

Дата Сумма (Количество)
2020.02 180
2020.03 22

Период: Полугодие

Дата Сумма (Количество)
2020.01 202

Период: Год

Дата Сумма (Количество)
2020 202

Обратите внимание, что тип поля будет отличаться от типа «дата», если выбран период отличный от «День». Для периодов «неделя, месяц, квартал, полугодие» тип поля будет «текст». Для периода «год» тип поля будет «число». Это надо учитывать при составлении выражений.

Отбор из нескольких источников

Отчет может объединять данные из нескольких источников. Для этого нужно добавить еще один или более источников кнопкой «Добавить источник». Затем, как обычно, выбираете форму, таблицу (при необходимости) и поля. Поля разных источников должны быть одного типа или быть совместимыми. Совместимые поля - это текст, заметка и список. Для всех остальных полей требуется точное соблюдение типа.

Функция "Баланс"

Для этой функции требуется как минимум два источника и указание типа источника: приход или расход.  Использование функции "Баланс" Эта функция вычисляет разницу между суммой прихода и суммой расхода.

Представим данные двух источников. Данные первого источника (приход):

Товар Количество
Крупа 100
Крупа 50
Хлеб 10

Данные второго источника (расход):

Товар Количество
Крупа 10
Хлеб 3
Крупа 7
Хлеб 2

В результате объединения получаем:

Товар Количество
Крупа 100
Крупа 50
Хлеб 10
Крупа -10
Хлеб -3
Крупа -7
Хлеб -2

Положительные числа означают приход, отрицательные - расход. В результате группировки и суммирования количества получаем:

Товар Баланс (Количество)
Крупа 133
Хлеб 5

Пустые ячейки при настройке отбора

В некоторых случаях допускается не выбирать поле источника. Например, для функции «Количество» обычно поля в источниках не выбираются. В этом случае, функция считает количество записей, а не количество непустых значений. При извлечении данных из нескольких источников в некоторых из них может не быть подходящего поля. Вместо отсутствующего поля будет подставлено значение NULL, что соответствует пустой ячейке. Также поле может не выбираться специально для функций, чтобы вычислить результат не для всех источников. Значение, которое будет подставлено вместо отсутствующего поля зависит от функции. Так для функций «Сумма» и «Баланс» вместо отсутствующего поля будет подставлен 0. Для остальных функций будет подставлено значение NULL, которое функции не учитывают при вычислении. Пример отбора с пустыми ячейками можете увидеть на рисунке выше.

Использование параметров

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

Вид параметра зависит от типа поля. Здесь все так же, как и в фильтре формы. Для чисел задается диапазон значений, для списков и объектов - раскрывающийся список, и т. д. Если в отборе поле объекта, то тип определяется по полю объекта. Чтобы в параметрах можно было выбирать объект из списка, добавьте его в отбор и поставьте флажок «Параметр», флажок «Видимое» можете снять по желанию.  Выбор объекта Имена полей-параметров и видимых полей могут совпадать при условии, что для первых снят флажок «Видимое».

Фильтр источника

Фильтр источника Текст фильтра источника
В каждом источнике может быть задан фильтр, который позволяет извлекать данные по определенным критериям.

Все нижеописанное про фильтр относится к запросам, отчетам, объектам, спискам, заметкам, условию отбора.

Фильтр записывается в виде простого текста, напоминающего логическое выражение. Например:

[!Статус]='Выдано' | [!Статус]='Готово'

Помните, что несмотря на сходство с выражениями, фильтр составляется по следующим правилам. Слева пишется поле формы-источника, затем операция сравнения (=, <>, < и т. д.), затем выражение. Условия могут соединятся логическими операциями & - И, | - ИЛИ. Если в самом выражении есть символы & и |, то выражение должно браться в круглые скобки.

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

[!счет|закрыт]=0

Операции сравнения применяются те же, что и в выражениях, плюс добавляется еще несколько операций, которые можно использовать только в фильтрах (==, #, in, notin - о них чуть ниже).

Операции =, <>, >, >=, <, <= допустимо применять к числовым полям, дате, времени, флажкам. К тексту допустимо применять все операции сравнения. К объектам применяются операции =, <>. Операции in и notin можно применять к полям любых типов. Ниже в таблице наглядно показано какие операции допустимо применять к полям разных типов.

Тип поля = <> > >= < <= == # in notin
Число * * * * * * * *
Дата * * * * * * * *
Время * * * * * * * *
Счетчик * * * * * * * *
Флажок * * * * * * * *
Объект * * * *
Текст * * * * * * * * * *
Заметка * * * * * * * * * *
Список * * * * * * * * * *
Изображение * * * * * * * * * *
Файл * * * * * * * * * *

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

Думаю, нет смысла останавливаться на стандартных операциях сравнения, они достаточно очевидны. Давайте рассмотрим дополнительные операции, которые доступны только в фильтрах.

Операция ==

Операция == применяется для поиска записей, в которых встречается указанный фрагмент текста. Указанный фрагмент может быть в начале, в конце, в середине текста, причем регистр не имеет значения. Например, ищем записи, в которых поле «комментарий» содержит текст «позвонить»:

[!Комментарий]=='позвонить'

Это вполне может быть поле объекта:

[Товар|Наименование]=='samsung'

Операция #

Операция # противоположна операции ==. Этот знак говорит программе найти все записи с текстом, в котором не содержится указанный фрагмент.

Операция in

Операция in позволяет искать все записи, содержащие значения из списка. Список задается в виде текста, значения разделяются точкой с запятой. Например:

[!статус] in 'Новый;в работе;готов'

Будут найдены все записи, в которых поле «статус» равен или «Новый», или «В работе», или «Готово». Данный фильтр аналогичен следующему фильтру:

[!статус]="Новый" | [!статус]="В работе" | [!статус]="Готов"

Но есть и существенное отличие - операция in не чувствительна к регистру символов. Кроме того, операция in позволяет сравнивать с произвольным набором значений. Например, список значений может быть задан в каком-нибудь поле:

[Товар|Группа] in [выбранные группы]

Операцию in можно использовать не только для текстовых полей, но и для объектов, чисел, дат и любых других типов полей. Значения также задаются в виде текста и отделяются точкой с запятой. Например:

[!объект] in "4;6;12;553;73;;99"
[!дата] in "01.02.2021;01.03.2021;01.04.2021"
[!время] in "10:00;12:00;14:00;16:00"

Среди значений могут присутствовать пустые значения (как в первой строчке примера) - они интерпретируются как Null. Если весь список состоит из пустых значений или не содержит значений вообще, то значением будет считаться Null.

Практическое применение операции in

В простых формах для фильтрации по произвольному набору значений можно использовать связку: таблица - поле - MERGE (MERGEX) - in. Т. е. добавляете таблицу. В таблицу добавляете поле того же типа, что и поле, по которому фильтруются данные (хотя тип необязательно должен совпадать). Например, пусть это будет объект «Группа». В родительскую форму вставляете текстовое поле «Выбранные группы» и пишите выражение:

MERGEX('таблица', '[группа]', ';')

В фильтре пишите:

[Товар|Группа] in [выбранные группы]

Еще можно использовать заметку с настроенным источником. Здесь еще проще. Вставляете заметку, указываете форму-источник, меняете разделитель на ; (без пробелов), указываете заметку в фильтре:

[Товар|Группа|Наименование] in [Заметка]

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

Операция NotIn

Операция notin противоположна операции in - будут найдены все записи, за исключением записей с перечисленными значениями.

Фильтрация значений Null

Значение Null может быть задано в фильтре в явном виде или являться результатом вычисления выражений. Любая операция сравнения с Null будет аналогична операции =, кроме операций # и notin - они будут аналогичны операции <>. Например, если задан такой фильтр:

[число]>=Null

то будут отобраны все записи со значением Null. Еще пример:

[статус] in [заметка]

Если поле «заметка» пустое (т. е. равно Null), то будут отобраны все записи с пустым полем «статус».

Необязательные поля в фильтре

В фильтрах можно использовать необязательные поля. Если значение такого поля равно Null, то оно исключается из фильтра. Для этого перед именем поля ставится ? (вопросительный знак). Например:

[?!клиент]=getvar('заказчик') & [!статус]='Готово'

Если переменная «заказчик» равна Null, то условие исключается из выражения.

Изменение приоритета условий фильтра

Условия фильтра можно брать в фигурные скобки, чтобы изменить их приоритет. Например:

{[!устройство]='Принтер' | [!устройство]=null} & {[!марка]='Canon' | [!марка]=null}

Логическая операция | имеет более низкий приоритет, чем операция &, поэтому условия надо взять в фигурные скобки.

Ошибки фильтра

В процессе анализа фильтра могут быть найдены следующие ошибки:

Ошибка Описание
Поле источника не найдено Программа не может найти указанное поле в форме-источнике. Проверьте правильность ввода имени поля.
Ожидается поле источника Ошибка возникает, когда не соблюдаются правила написания фильтра. Часто начинающие разработчики путают фильтр с обычным выражением и пишут слева от операции сравнения выражение (например, функцию), а должно быть поле формы-источника.
Неверная операция сравнения Допустимы следующие операции сравнения: = <> < <= > >= == #.
Ожидается операция сравнения Не соблюден синтаксис написания фильтра. После поля источника программа ожидает операцию сравнения.
Выражение не распознано Выражение (справа от операции сравнения) содержит недопустимые символы.
Ошибка в выражении Выражение содержит какую-то ошибку (программа сообщает какую именно).
Тип поля формы-источника не совместим с типом результата вычисления выражения Убедитесь, что тип поля формы-источника совпадает с типом результата вычисления выражения. Например, ошибка возникнет, если попытаться сравнить поле «объект» с текстом.
Ожидается логическая операция Пропущена логическая операция между двумя условиями фильтра.
Ожидается символ { Пропущена одна или более фигурных скобок {. Ошибка возникает, когда число закрывающих фигурных скобок } больше чем открывающих.
Ожидается символ } Пропущена одна или более фигурных скобок }. Ошибка возникает, когда число открывающих фигурных скобок { больше чем закрывающих.
Недопустимое поле источника В качестве поля-источника нельзя использовать изображение, файл и поле объекта (компонент).

Таблица

Настройка табличной части отчета ничем не отличается от настройки табличной части формы, кроме того, что нельзя поменять заголовки столбцов.

Вычисляемые поля

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

[оклад]+[доход]

[сумма]*1.25

'Константа'

dbsum('Заказ', 'Сумма', '[клиент]=' + cstr([код клиента]) + ' & [!дата]>=date')

[!год]=2016

Вычисление выражений происходит во всех записях отчета после их извлечения из базы. Для каждого вычисляемого поля выбирается тип данных, которые будут в нем содержаться. Результат выражения должен совпадать с типом поля. Для чисел и текста также задаются точность и длина текста. Во всех числовых полях включена группировка цифр по классам, т. е. числа будут иметь вид: 1 000 000, 1 200 и т. д.

Выходной фильтр

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

[Количество]<=0
[!год]=YearOf([дата])
MonthOf([дата])=10 

Раскраска

Раскраска позволяет выделить цветом ячейки и строки цветом в зависимости от результата логического выражения. Настройка раскраски Если результат истинный, то ячейка или строка будет окрашена в заданный цвет. Если несколько условий истинно, то будет выбрано первое истинное условие. Для раскраски всей строки поле выбирать не нужно (оставьте ячейку «Имя поля» пустой).

Итоги

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

Справочный текст

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

Копирование стиля

Чтобы ускорить настройку внешнего вида отчетов, воспользуйтесь кнопкой «Копировать стиль». Копирование стиля Выберите отчеты, к которым будут применены настройки табличной части текущего отчета (который выделен в окне управления отчетами).

Экспорт отчетов

Любой отчет можно экспортировать в файл формата CSV - это текстовый формат, в котором значения отделяются точкой с запятой. В первой строке файла находятся названия полей, в остальных - значения полей. Обычно файл открывается в табличном редакторе, например в Excel. Экспорт отчета В диалоговом окне выберите поля для экспорта и введите имя файла, куда будут экспортированы данные отчета. Если поле для ввода имени файла оставить пустым, то отчет будет экспортирован во временный файл и программа откроет его в программе по умолчанию. Данные могут быть сохранены в кодировке UTF-8 или ANSI.

Печать отчетов

Для печати отчета создайте один или несколько шаблонов и укажите их в свойстве отчета «Шаблоны», аналогично свойству формы Шаблоны. Дополнительная обработка данных при печати настраивается в свойстве отчета «При печати» (аналогично свойству формы Вычисляемые поля).

Шаблоны отчета Вычисления при печати Шаблон отчета

Окно отчета как форма

Для обеспечения печати параметров и итогов отчета, наряду с его данными, окно отчета представляется как форма, а параметры и итоги представляются как поля формы. Названия полей этой формы совпадают с названиями параметров и итогов отчета. Кроме того для параметров создаются дополнительные поля для печати таких значений, как: Не, Пусто, Начальное значение, Конечное значение, Все значения. Этим значениям соответствуют имена поля, оканчивающиеся соответственно на: _not, _null, _begin, _end, _text. Например (см. скриншоты), для параметра «Дата», кроме поля «Дата», создаются дополнительные поля: Дата_not, Дата_null, Дата_begin, Дата_end, Дата_text. Само поле «Дата» будет содержать текстовое представление первого значения параметра, например: 01.01.2018 .. 31.12.2018. Все поля, кроме _text, содержат только первое значение параметра. Для каждого параметра и итога отчета программа подбирает поле соответствующего типа. Т. е. если это число, то поля «_begin», «_end» будут числовыми с той же точностью и группировкой цифр, что и в форме-источнике. Если параметр объект, то и поле будет объектом и в шаблоне, и в вычислениях при печати можно ссылаться на поля объекта.

Обращаться к полям формы окна отчета можно только в шаблоне и в вычислениях при печати. В вычисляемых полях отчета это делать невозможно.

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