3ERP

3ERP - простая и бесплатная программа для бухгалтерского и оперативного учёта в учреждениях сферы торговли и услуг, общественного питания, складского хранения, автосервиса, медицины, логистики, производства, управления работами и заявками, поддерживающая до 100 пользователей, на русском языке и полностью бесплатная для 1 пользователя. На сайт (скачать)

08. Отчёты и диаграммы

8.1. Общая концепция

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

Особенности отчётов в платформе:

  • Только SQL (нельзя использовать DSL-функции внутри отчёта)
  • Параметры подставляются через {{ИмяПараметра}}
  • RLS не применяется автоматически (нужно явно добавить условия)
  • Поддерживаются диаграммы на базе Chart.js
  • Можно добавить переключатель для показа/скрытия диаграммы

8.2. Синтаксис отчёта

ОТЧЁТ ИмяОтчёта
    ПАРАМЕТР ИмяПараметра ТИП_ДАННЫХ
    ПАРАМЕТР ИмяДругогоПараметра ТИП_ДАННЫХ [ОБЯЗАТЕЛЬНЫЙ]
    
    ЗАПРОС "SELECT ... WHERE ... = '{{ИмяПараметра}}'"
    
    КОЛОНКА ИмяКолонки1 ТИП_ДАННЫХ
    КОЛОНКА ИмяКолонки2 ТИП_ДАННЫХ
    
    ВЫВОД_ДИАГРАММА ТИП "столбчатая"
    ПОЛЕ_ДЛЯ_ДИАГРАММЫ ИмяКолонки
    РЕСУРС ИмяКолонкиСЧислами
    ПАРАМЕТР ПоказыватьГрафик БУЛЕВО
КОНЕЦ

Важно: Параметр ПАРАМЕТР ПоказыватьГрафик БУЛЕВО в DSL-блоке отчёта всегда должен указываться перед блоком ЗАПРОС.

8.3. Типы параметров

ТипКлючевое словоКак выглядит в UIЗначение в SQL
СтрокаСТРОКАТекстовое полеПодставляется как есть
ЧислоЧИСЛОПоле для ввода цифрПодставляется как есть
ДатаДАТАВыбор датыYYYY-MM-DD
Дата/ВремяДАТАВРЕМЯВыбор даты и времениYYYY-MM-DD HH:MM:SS
Выбор из коллекцииВЫБОР ИмяКоллекцииВыпадающий списокID выбранной записи
БулевоБУЛЕВОЧекбокс1 или 0

8.4. Управление отображением диаграммы

Для добавления пользовательского контроля над отображением диаграммы используется параметр ПАРАМЕТР ПоказыватьГрафик БУЛЕВО. По умолчанию (без этого параметра) диаграмма показывается всегда.

Поведение:

  • Если параметр НЕ указан — диаграмма отображается всегда
  • Если параметр указан — в интерфейсе появляется чекбокс «Показывать график», который по умолчанию включён (ИСТИНА)
  • Если параметр указан и пользователь снял галочку — отображается только таблица без диаграммы
  • Параметр должен указываться первым в блоке ОТЧЁТ (после объявления отчёта, перед ЗАПРОС)

Пример правильного размещения параметра:

ОТЧЁТ ПродажиПоМесяцам
    ПАРАМЕТР ПоказыватьГрафик БУЛЕВО          # ← первым после имени отчёта
    ПАРАМЕТР Год ЧИСЛО ОБЯЗАТЕЛЬНЫЙ
    
    ЗАПРОС "
        SELECT 
            strftime('%m', Дата) as Месяц,
            SUM(ИтогоСумма) as СуммаПродаж
        FROM ЗаказНаряд
        WHERE strftime('%Y', Дата) = '{{Год}}'
        GROUP BY Месяц
        ORDER BY Месяц
    "
    
    КОЛОНКА Месяц СТРОКА
    КОЛОНКА СуммаПродаж ЧИСЛО
    
    ВЫВОД_ДИАГРАММА ТИП "линейная"
    ПОЛЕ_ДЛЯ_ДИАГРАММЫ Месяц
    РЕСУРС СуммаПродаж
КОНЕЦ

8.5. Диаграммы

Платформа поддерживает построение диаграмм на основе данных отчёта. Движок визуализации на базе Chart.js автоматически читает таблицу, очищает данные и строит график.

Поддерживаемые типы диаграмм:

Команда в DSLТип графикаДля чего используется
СТОЛБИКОВАЯ (или ГИСТОГРАММА)barСравнение показателей
КРУГОВАЯpieОтображение долей от целого
БУБЛИКdoughnutКруговая диаграмма с отверстием
ЛИНЕЙНАЯlineАнализ динамики и трендов
РАДАРradarСравнение нескольких метрик ("паутина")
ТЕПЛОВАЯ (или ПОЛЯРНАЯ)polarAreaПолярная диаграмма

Синтаксис добавления диаграммы:

ВЫВОД_ДИАГРАММА <ТипДиаграммы>
ПОЛЕ_ДЛЯ_ДИАГРАММЫ <ИмяКолонкиДляПодписей>
РЕСУРС <ИмяКолонкиСЦифрами>
ПАРАМЕТР ПоказыватьГрафик БУЛЕВО   # опционально, указывается перед ЗАПРОС

Сохранение диаграммы как рисунка:

Любую построенную диаграмму пользователь может сохранить как изображение. Для этого необходимо нажать правой кнопкой мыши на диаграмму и в появившемся контекстном меню выбрать пункт «Сохранить картинку как...». Диаграмма сохранится в формате PNG с прозрачным фоном.

Пример отчёта с диаграммой (без переключателя):

ОТЧЁТ ВыручкаПоВидам
    ПАРАМЕТР ДатаС ДАТАВРЕМЯ
    ПАРАМЕТР ДатаПо ДАТАВРЕМЯ
    
    ЗАПРОС "
        SELECT ВидУслуги, SUM(Сумма) as СуммаВыручки 
        FROM Журнал_Продаж 
        GROUP BY ВидУслуги
    "
    
    КОЛОНКА ВидУслуги СТРОКА
    КОЛОНКА СуммаВыручки ЧИСЛО
    
    ВЫВОД_ДИАГРАММА БУБЛИК
    ПОЛЕ_ДЛЯ_ДИАГРАММЫ ВидУслуги
    РЕСУРС СуммаВыручки
КОНЕЦ

Особенности работы диаграмм:

  • Автоматическая очистка данных: числа с пробелами и запятыми преобразуются в корректные значения
  • Экспорт в PNG правой кнопкой мыши: клик правой кнопкой по диаграмме → «Сохранить картинку как...»
  • Игнорирование нулей: строки с ресурсом = 0 или «Нет данных» автоматически отсекаются
  • Умный Fallback: при ошибке в имени колонки система берёт первую текстовую колонку для подписей и последнюю — для цифр

8.6. Примеры отчётов

Пример: Отчёт с диапазоном дат

ОТЧЁТ ПродажиЗаПериод
    ПАРАМЕТР ДатаС ДАТА ОБЯЗАТЕЛЬНЫЙ
    ПАРАМЕТР ДатаПо ДАТА ОБЯЗАТЕЛЬНЫЙ
    
    ЗАПРОС "
        SELECT Дата, Номер, Клиент, ИтогоСумма, Статус
        FROM ЗаказНаряд
        WHERE Дата BETWEEN '{{ДатаС}}' AND '{{ДатаПо}}'
        ORDER BY Дата DESC
    "
    
    КОЛОНКА Дата ДАТАВРЕМЯ
    КОЛОНКА Номер СТРОКА
    КОЛОНКА Клиент ВЫБОР Клиенты
    КОЛОНКА ИтогоСумма ЧИСЛО
    КОЛОНКА Статус СТРОКА
КОНЕЦ

Пример: Отчёт с необязательными параметрами

ОТЧЁТ ФильтрЗаказов
    ПАРАМЕТР Клиент ВЫБОР Клиенты
    ПАРАМЕТР Статус СТРОКА
    
    ЗАПРОС "
        SELECT id, Номер, Дата, Клиент, ИтогоСумма, Статус
        FROM ЗаказНаряд
        WHERE 1=1
        {{ЕСЛИ Клиент}} AND Клиент = '{{Клиент}}' {{КОНЕЦ}}
        {{ЕСЛИ Статус}} AND Статус = '{{Статус}}' {{КОНЕЦ}}
        ORDER BY Дата DESC
    "
    
    КОЛОНКА id ЧИСЛО
    КОЛОНКА Номер СТРОКА
    КОЛОНКА Дата ДАТАВРЕМЯ
    КОЛОНКА Клиент ВЫБОР Клиенты
    КОЛОНКА ИтогоСумма ЧИСЛО
    КОЛОНКА Статус СТРОКА
КОНЕЦ

Пример: Агрегатный отчёт с GROUP BY и диаграммой с переключателем

ОТЧЁТ СуммаПродажПоКлиентам
    ПАРАМЕТР ПоказыватьГрафик БУЛЕВО
    ПАРАМЕТР ДатаС ДАТА
    
    ЗАПРОС "
        SELECT 
            К.Наименование as Клиент,
            COUNT(З.id) as КоличествоЗаказов,
            SUM(З.ИтогоСумма) as ОбщаяСумма
        FROM ЗаказНаряд З
        JOIN Клиенты К ON З.Клиент = К.id
        WHERE 1=1
        {{ЕСЛИ ДатаС}} AND З.Дата >= '{{ДатаС}}' {{КОНЕЦ}}
        GROUP BY К.id
        ORDER BY ОбщаяСумма DESC
    "
    
    КОЛОНКА Клиент СТРОКА
    КОЛОНКА КоличествоЗаказов ЧИСЛО
    КОЛОНКА ОбщаяСумма ЧИСЛО
    
    ВЫВОД_ДИАГРАММА СТОЛБИКОВАЯ
    ПОЛЕ_ДЛЯ_ДИАГРАММЫ Клиент
    РЕСУРС ОбщаяСумма
КОНЕЦ

Пример: Отчёт по журналу (остатки)

ОТЧЁТ СкладскиеОстатки
    ПАРАМЕТР Склад ВЫБОР Склады
    
    ЗАПРОС "
        SELECT 
            Номенклатура,
            SUM(_type * Количество) as ОстатокШт,
            SUM(_type * Сумма) as СуммаНаСкладе
        FROM Журнал_ОстаткиЗапчастей
        WHERE 1=1
        {{ЕСЛИ Склад}} AND Склад = '{{Склад}}' {{КОНЕЦ}}
        GROUP BY Номенклатура
        HAVING ОстатокШт != 0
    "
    
    КОЛОНКА Номенклатура ВЫБОР Номенклатура
    КОЛОНКА ОстатокШт ЧИСЛО
    КОЛОНКА СуммаНаСкладе ЧИСЛО
КОНЕЦ

8.7. Важные ограничения

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

ОТЧЁТ МоиЗаказы
    ЗАПРОС "
        SELECT id, Номер, Дата, ИтогоСумма
        FROM ЗаказНаряд
        WHERE Менеджер = {{ТЕКУЩИЙПОЛЬЗОВАТЕЛЬ().id}}
        ORDER BY Дата DESC
    "
    КОЛОНКА id ЧИСЛО
    КОЛОНКА Номер СТРОКА
    КОЛОНКА Дата ДАТАВРЕМЯ
    КОЛОНКА ИтогоСумма ЧИСЛО
КОНЕЦ

Экранирование параметров: Для строковых параметров используйте кавычки вручную:

# Правильно
WHERE Наименование = '{{Наименование}}'

# Неправильно (вызовет ошибку SQL)
WHERE Наименование = {{Наименование}}

Пустые параметры: Используйте конструкцию {{ЕСЛИ ...}} для необязательных параметров:

WHERE 1=1
{{ЕСЛИ Клиент}} AND Клиент = '{{Клиент}}' {{КОНЕЦ}}

8.8. Best Practices

  • Всегда используйте псевдонимы (AS) для колонок — они становятся заголовками в таблице
  • Для необязательных параметров всегда используйте {{ЕСЛИ ...}} — иначе пустой параметр сломает запрос
  • Не забывайте про кавычки для строковых параметров — это частая ошибка
  • Для отчётов по журналам всегда используйте SUM(_type * Ресурс) для расчёта остатка
  • Для больших отчётов добавляйте LIMIT — пользователи могут случайно выбрать огромный период
  • Тестируйте SQL вручную перед добавлением в отчёт — используйте любой SQLite-клиент
  • Помните про RLS — если данные должны быть ограничены, добавляйте {{ТЕКУЩИЙПОЛЬЗОВАТЕЛЬ().id}} вручную
  • Для диаграмм с большим количеством категорий (>15) используйте СТОЛБИКОВУЮ или ЛИНЕЙНУЮ диаграмму, а не КРУГОВУЮ
  • Если хотите дать пользователю выбор — показывать график или нет, добавьте параметр ПАРАМЕТР ПоказыватьГрафик БУЛЕВО первым в блоке отчёта (перед ЗАПРОС)
  • Напомните пользователям, что любую диаграмму можно сохранить как картинку через правую кнопку мыши
3537 | 0 | 3537 | 359 | 173 | 40