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