В процессе разработки интерфейсов часто возникает задача наглядно показать пользователю объем данных, с которыми он работает. Например, вывести общее количество документов или элементов справочника прямо на главной странице или в заголовке списка. Рассмотрим подробнее несколько способов реализации этой задачи: от простого вывода в заголовок формы до создания полноценной информационной панели (дашборда).
Самый простой и быстрый способ — программно подсчитать количество записей при открытии формы и изменить её заголовок. Проанализируем, как это сделать правильно, чтобы не замедлять работу системы. Мы будем использовать событие ПриСозданииНаСервере.
Разберем пример кода, который выполняет запрос к базе данных и обновляет заголовок формы:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Формируем запрос к нужному справочнику
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| КОЛИЧЕСТВО(*) КАК ВсегоЭлементов
|ИЗ
| Справочник.АктыНесоответствия КАК АктыНесоответствия";
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Колво = Выборка.ВсегоЭлементов;
// Устанавливаем новый заголовок формы
ЭтаФорма.Заголовок = "Акты несоответствия (всего: " + Колво + " шт.)";
КонецЕсли;
КонецПроцедуры
Этот метод хорош тем, что пользователь сразу видит итоговую цифру, как только открывает справочник. Однако помните, что КОЛИЧЕСТВО(*) подсчитает абсолютно все записи, включая помеченные на удаление и группы (папки), если справочник иерархический.
Если нам нужно видеть итоги сразу по нескольким справочникам на главной странице, лучше всего создать отдельную обработку. Выясним причину, почему это удобнее: мы можем собрать данные из разных источников в одном месте, не перегружая стандартные формы списка.
Выполним следующие шаги для реализации:
РабочийСтолРуководителя.Строка или Число для отображения итогов.ПриСозданииНаСервере напишем код, который соберет данные по всем интересующим нас справочникам.Посмотрим на пример реализации запроса для нескольких справочников одновременно:
&НаСервере
Процедура ОбновитьСтатистикуНаСервере()
ТекстЗапроса =
"ВЫБРАТЬ
| КОЛИЧЕСТВО(*) КАК Колво,
| ""Акты"" КАК Тип
|ИЗ
| Справочник.АктыНесоответствия
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ
| КОЛИЧЕСТВО(*),
| ""Номенклатура""
|ИЗ
| Справочник.Номенклатура";
Запрос = Новый Запрос(ТекстЗапроса);
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
Если Результат.Тип = "Акты" Тогда
Элементы.НадписьАкты.Заголовок = "Актов в базе: " + Результат.Колво;
ИначеЕсли Результат.Тип = "Номенклатура" Тогда
Элементы.НадписьНоменклатура.Заголовок = "Товаров: " + Результат.Колво;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
После создания обработки её необходимо назначить Рабочей областью начальной страницы в свойствах конфигурации. Таким образом, при входе в программу пользователь сразу будет видеть актуальные итоги.
Начиная с версии платформы 8.3.15, у разработчиков появилась возможность выводить итоги непосредственно в подвале ДинамическийСписок. Это избавляет от необходимости писать ручные запросы и позволяет автоматически пересчитывать количество, если пользователь применил фильтры (поиск) в списке.
Проанализируем алгоритм настройки:
Footer).Программная настройка итогов в ДинамическийСписок выглядит так:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Включаем отображение количества элементов в подвале колонки "Наименование"
ЭлементИтога = Список.НастройкиКомпоновкиДанных.Настройки.Структура[0].ПоляИтогов.Элементы.Добавить();
ЭлементИтога.Поле = Новый ПолеКомпоновкиДанных("Наименование");
ЭлементИтога.ТипАгрегатнойФункции = ТипАгрегатнойФункцииКомпоновкиДанных.Количество;
КонецПроцедуры
При подсчете данных важно учитывать бизнес-логику. Рассмотрим подробнее, какие фильтры стоит добавить в запрос, чтобы цифры были корректными:
ГДЕ НЕ ЭтоГруппа.ГДЕ НЕ ПометкаУдаления.КОЛИЧЕСТВО(*) может выполняться долго. В таких случаях рекомендуется сохранять результат подсчета в специальный РегистрСведений и обновлять его регламентным заданием раз в час, а на форму выводить уже готовое значение из регистра.Пример правильного запроса с учетом этих фильтров:
ВЫБРАТЬ
КОЛИЧЕСТВО(*) КАК ТочноеКоличество
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
НЕ Номенклатура.ПометкаУдаления
И НЕ Номенклатура.ЭтоГруппа
Чтобы не снимать типовую конфигурацию с поддержки, мы рекомендуем внедрять эти изменения через Расширение. Создайте расширение, добавьте в него нужную форму справочника и создайте обработчик-последовательность (&После) для процедуры ПриСозданииНаСервере. Это позволит сохранить возможность легкого обновления программы в будущем, при этом добавив необходимый функционал подсчета.
Таким образом, мы рассмотрели различные подходы к визуализации итогов. Выбор метода зависит от ваших задач: для оперативной работы в списке подойдет настройка подвала динамического списка, а для управленческого контроля лучше создать информативный дашборд на начальной странице.