Каталог решений - Подсчёт и отображение количества строк в динамическом списке

Подсчёт и отображение количества строк в динамическом списке

Подсчёт и отображение количества строк в динамическом списке

В наличии

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

Категория:

Описание

Разработчики предоставили нам нужные инструменты для реализации такого механизма.

(Обновил публикацию, теперь процедура более универсальна и работает с виртуальными таблицами в запросе динамического списка)

Получение данных динамического списка

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

Чтобы было удобно обновлять конфигурацию и добавлять в другие формы списков, решил кнопку создавать программно. В стандартную процедуру ПриСозданииНаСервере добавляется вызов процедуры программного создания элементов и команды:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	этСозданиеЭлементов();

КонецПроцедуры

 

Процедура этСозданиеЭлементов()
    
    /////   РЕКВИЗИТЫ   //////////
	
    /////   КОМАНДЫ   //////////
	Команда = Команды.Добавить("этПосчитатьКоличествоВручную");
	Команда.Действие = "этПосчитатьКоличествоВСписке";
	//Команда.Картинка = БиблиотекаКартинок.Сумма; // можно добавить свою картинку
	//Команда.Отображение = ОтображениеКнопки.КартинкаИТекст; // и отобразить её с количеством строк

	
	/////   ЭЛЕМЕНТЫ   //////////
	НовыйЭлемент = Этаформа.Элементы.Вставить("этПосчитатьКоличествоВручную", Тип("КнопкаФормы"), Элементы.ФормаКоманднаяПанель,);
    НовыйЭлемент.Вид = ВидКнопкиФормы.КнопкаКоманднойПанели;
	НовыйЭлемент.ИмяКоманды = "этПосчитатьКоличествоВручную";
	НовыйЭлемент.Заголовок = "?";
	НовыйЭлемент.Ширина = 3;
	
КонецПроцедуры

&НаКлиенте
Процедура этПосчитатьКоличествоВСписке()
	
	Элементы.Список.Обновить();
	этПосчитатьКоличествоВСпискеНаСервере();
	
КонецПроцедуры

Процедура подсчета подменяет в тексте запроса динамического списка выбираемые поля на Количество(*), выполняет запрос и отображает результат в заголовке кнопки:

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

КонецПроцедуры

Код можно использовать в расширениях конфигурации, можно вынести процедуры в общий модуль, а в модулях форм добавлять только вызов процедуры из общего модуля в ПриСозданииНаСервере

has been added to your cart:
Оформление заказа