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

28.10.21

Разработка - Работа с интерфейсом

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

Скачать файлы

Наименование Файл Версия Размер
Подсчёт и отображение количества строк в динамическом списке:
.cf 79,96Kb
70
.cf 79,96Kb 70 Скачать бесплатно

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

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

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

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

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

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

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

 

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

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

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

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

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

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

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

Динамический список подсчет строк программное добавление кнопок

См. также

Богатый редактор картинок, хранимых в базе, с возможностью РИСОВАНИЯ. Редактор внешних файлов картинок. Объект, расширяющий возможности работы с картинками из встроенного языка (Три в одном) + Обработка «Стандартизация картинок»

Работа с интерфейсом Рабочее место Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Обработка предназначена для редактирования картинок в режиме «Предприятие», с возможностью РИСОВАТЬ на них. Поддерживается работа как в обычных формах (толстый клиент) так и на управляемых формах (тонкий клиент). Обработка позволяет редактировать как картинки, хранимые в базе, так и графические файлы с диска на файловой системе. Помимо базовых функций (изменение размеров, преобразование формата, обрезание картинки, повороты и т.п.) – редактор имеет богатый набор инструментов для рисования. Доступна функция вставки изображения из буфера обмена. Также обработка может быть использована из встроенного языка как объект для редактирования картинок. Объект может быть использован: на стороне клиента, на стороне сервера, из внешнего соединения. Данная обработка будет особенно полезна тем, кто вносит картинки в базу (изображения номенклатуры, фотографии физических лиц и т.п.). Функционал реализуется с использованием JavaScript и бесплатного ПО ImageMagick (без использования внешних компонент).

6000 руб.

16.01.2015    61793    43    59    

80

[Расширения] Динамическое управление видимостью и доступностью элементов форм (УФ) (8.3.6+)

Работа с интерфейсом Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Механизм «Динамическое управление доступом к элементам форм объектов 1С8» предназначен для обеспечения возможности оперативного управления видимостью и доступностью элементов форм документов и справочников продуктов фирмы «1С» «1С:Предприятие 8». Решение универсальное, встраивается в любую конфигурацию с минимальными доработками, что позволяет без проблем обновлять типовые решения.

5000 руб.

14.01.2016    54401    16    21    

42

Управление дашбордами

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Обработка предназначена для создания и управления дашбордами.

2400 руб.

29.06.2020    16695    21    4    

35

Новогоднее оформление для 1С

Работа с интерфейсом Платформа 1С v8.3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 Бесплатно (free)

Добавьте новогоднего настроения! Расширение создает декорацию в виде гирлянды на некоторых формах объектов.

27.12.2023    10735    750    elcoan    45    

106

Конструктор HTML, CSS и javascript

Инструментарий разработчика Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Подходит для создания web-страниц для замены управляемых форм 1С, красивых отчетов, интерфейса мобильного приложения на платформе 1С и для простых страниц веб-сайтов.

2 стартмани

10.04.2023    9610    151    acces969    31    

118

Модель состояния для MVC

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.

1 стартмани

05.07.2022    3665    kalyaka    2    

27

Табло очереди заказов на экран телевизора

WEB-интеграция Работа с интерфейсом Платформа 1С v8.3 1С:Розница 2 Платные (руб)

Связка из веб-приложения и расширения для 1С: Розница 2.3.

3600 руб.

29.04.2022    12079    1    5    

10
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. lefthander 28.11.18 15:48 Сейчас в теме
(0)Проще всего вывести список и там уже будет количество строк с учетом отборов. в самом списке это не имеет смысла
3. sano 67 28.11.18 16:18 Сейчас в теме
(1),(2) Да, так сначала делал сам и рекомендовал пользователям. Но потом попробовал посчитать количество строк в списке на несколько тысяч записей. Провёл эксперимент. Список из 130 тысяч выводим в список только Код и ждём 10 сек. Моим способом - 1 сек. Теперь считаем количество нажатий на различные кнопки: 6 против 1. Мои пользователи довольны маленькой кнопочкой в командной панели.
Никого не принуждаю, "Вывести список..." - пожалуйста. Хотите попробовать внедрить к себе этот функционал - даже скачивать не нужно, копируйте код в форму списка, пользуйтесь, получайте удовольствие. Надоело - можно удалить :)
user1857640; soft_wind; +2 Ответить
2. Xershi 1474 28.11.18 15:51 Сейчас в теме
Добавлю еще что есть такая замечательная кнопка вывести список. Вот там и будет ваш номер!
Разработчики сознательно не выводили номер строки, т.к. это основа тормозов!
4. sano 67 28.11.18 16:22 Сейчас в теме
(2) Именно поэтому процедура подсчета вызывается по кнопке и считает только тогда, когда это необходимо пользователю. В 1 клик.
Windsor77; Irwin; +2 Ответить
5. Xershi 1474 28.11.18 16:34 Сейчас в теме
(4) согласен что если это нужно это удобно, но это доработка. А потом на кой черт знать количество, что пользователь таким методом анализирует, мне кажется нужно логику пользователю поменять.
6. sano 67 28.11.18 16:56 Сейчас в теме
(5) Например, количество невыполненных задач с множеством отборов или специфически отобранных товаров. Фантазия пользователя безгранична. Да и в самописных конфигурациях использую, потому что удобно. Пример из самописной: считаю, сколько элементов на данный момент загружено в справочник в то время, когда работает фоновый загрузчик.
CratosX; gorvin; +2 Ответить
7. Xershi 1474 28.11.18 17:06 Сейчас в теме
(6) такую задачу нужно отчетами решать. Это же статистика. Это как использовать справочник вместо документа, можно но не нужно=))
8. sano 67 28.11.18 17:16 Сейчас в теме
(7)ага, пользователи так замучали меня своими одноразовыми отчетами, что решил предоставить им возможность быстрого подсчета. Просьбы как рукой сняло. На отчеты жаловались, что долго настраивать отборы по второму кругу (в списке-то уже настроили один раз)
9. Xershi 1474 28.11.18 17:27 Сейчас в теме
(8) похоже еще не научили пользователей использовать сохранение настроек в отчетах)))
10. sano 67 28.11.18 17:40 Сейчас в теме
(9)пользователи образованные, всё умеют. И время ценят.
Думаю, каждый сам решит, использовать функционал или нет.
CratosX; GoR1313; +2 Ответить
12. Ndochp 103 29.11.18 18:19 Сейчас в теме
(2)Каждый дин список выполняется в режиме "Упорядочить" + "Первые" + "Где номер строки > ХХХХ" иначе просто невозможно отработать стрелку вниз/пейдждаун в конце списка. Так что, все выведенные строки уже посчитаны, вы лукавите.

Рассказывать, что дополнительный запрос на общее количество строк не может быть оптимизирован так, чтобы не напрягать ни пользователей ни сервер - тоже лукавство. Но чуть меньшее.
native-api; +1 Ответить
13. Xershi 1474 29.11.18 18:30 Сейчас в теме
(12) если речь про план запроса, то это совсем другое.
Я написал про без доработок, а вы пилить решили.
15. Ndochp 103 30.11.18 09:25 Сейчас в теме
(13)Вот это "Разработчики сознательно не выводили номер строки, т.к. это основа тормозов! " - ИМХО не правда, так как строки уже проиндексированы и посчитаны. Или вы не про разработчиков платформы, а про разработчиков типовых?
native-api; +1 Ответить
11. yarsort 140 29.11.18 17:32 Сейчас в теме
Построитель = Новый ПостроительОтчета;
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ДокументыЗаказыПокупателя);
Выборка = Построитель.Результат.Выгрузить();
		
СуммаДокумента = Выборка.Итог("СуммаДокумента");
КоличествоДокументов = Выборка.Количество();
Henistaromin; +1 Ответить
14. sano 67 29.11.18 20:45 Сейчас в теме
16. yarsort 140 30.11.18 09:39 Сейчас в теме
// Где "ДокументыЗаказыПокупателя" - динамический список на форме.

Я такой схемой получения данных на обычных формах пользуюсь. Может и на управляемые можно перенести этот метод.
17. sano 67 30.11.18 13:14 Сейчас в теме
(16) Тут вижу 3 проблемы:
1. тормоза, т.к. Выгрузить()
2. не учитываются отборы и поиски
3. не универсально
Но тут и задача другая, считаете Сумму. С такими требованиями в своей практике пока не сталкивался
В запросе динамического списка можно заменить "Количество(*) КАК Кол" на сумму по конкретной колонке. Суммировать запросом будет быстрее, чем выгружать и использовать Итог. Попробуйте преобразовать мой метод.
18. igor-pn 72 04.07.19 14:33 Сейчас в теме
Спасибо, можно немножко убыстрить еще , использовать метод количество для выборки, и проверять пустую выборку тоже. Тогда не нужно редактировать текст запроса.

 
        Результат = Запрос.Выполнить();
	
	Выборка = Результат.Выбрать();
	
	КоличествоЗаписей =  Выборка.Количество() 
native-api; DERL; +2 Ответить
19. SlavaKron 04.07.19 15:09 Сейчас в теме
(18) Но ведь тогда будут считываться все данные полей (пусть и на стороне sql). Хотя, ваш способ универсальнее.
20. sano 67 04.07.19 21:30 Сейчас в теме
(18) Пробовал этот вариант в самом начале. SlavaKron прав. В результате в выборке получите столько записей, сколько в динамическом списке. В моём методе выбирается лишь одна запись с количеством строк. Можно даже не проводить эксперимент, чтобы понять, какой код отработает быстрее ;)
native-api; +1 Ответить
21. igor-pn 72 05.07.19 18:37 Сейчас в теме
(20) Вы правы, не внимательно посмотрел, Спасибо!
native-api; +1 Ответить
22. qazaz2 16 19.07.19 12:25 Сейчас в теме
Автору спасибо, отличная идея, использовал правда для другой цели.

Понятно что каждый данную задачу решит по-своему (каждый др***т как он хочет).

Крутизна ИМХО в том что бы в понять как устроен мир (1С это как раз мир, не нами придуманный. но данный нам)) и использовать это понимание для решения своих задач. Мне и в голову не приходило изнасиловать запрос макета компоновки)
Windsor77; +1 Ответить
23. acanta 14.02.20 12:51 Сейчас в теме
И почему запрос динамического списка не может быть использован для получения итогов..
24. lefthander 14.02.20 12:53 Сейчас в теме
(23)Птому что для этого есть запросы не динамического списка. Динамический список придуман для отбора и вывода чем проще запрос тем быстрее список отработает
25. gorshkov.an 10.07.20 18:20 Сейчас в теме
Если запрос с группировками, то неправильно посчитает. Да, запрос с группировками в динамическом списке плохо, но бывает.
Можно обернуть запрос списка запросом количества, но придётся РАЗРЕШЕННЫЕ на верхний уровень выносить.
26. e-9 60 16.09.21 13:28 Сейчас в теме
Вот что значит копипастить код из инетов....Стоило юзеру сделать сортировку по колонке - хана всему)
Все-таки Выборка.Количество(), без изменения текста запроса, как в (18) - надежнее
27. sano 67 16.09.21 21:12 Сейчас в теме
(26) надёжнее, спору нет, но контраргументы приведены.
Кстати, недавно столкнулся с проблемой, что в новых версиях платформы можно использовать временные таблицы в запросах динамических списков. Вышеприведенный алгоритм неправильно срабатывает. Но я уже переписал его на новый лад в своей конфе, осталось оформить и скорректировать статью.
Тогда можно будет снова копипастить ;)
Student1C; +1 Ответить
28. Student1C 57 22.10.21 16:30 Сейчас в теме
(27) ну скинь хотя бы для читающих комментарии )
29. sano 67 28.10.21 12:23 Сейчас в теме
(28) По просьбам трудящихся!
Кстати, старая процедура исправно работала, пока я вдруг не добавил в запрос динамического списка временную таблицу. Думаю, таких извращенцев не много.
Ну, и заодно добавил демо конфу, чтобы можно было пощупать.
Student1C; +1 Ответить
31. user635629_exter 37 07.04.22 10:17 Сейчас в теме
(29) Добрый день. Я периодически делаю ВТ в запросе динсписка - когда остатки надо собрать, например, сначала предвыборка для фильтра остатков, потом остатки, а потом остатки с левым соединением к основной таблице, ну и учесть, что отборы динсписка применяются к первой таблице запроса - где-то читал, что это так, поэтому в последнем запросе надо еще с первого запроса фильтр применить.
30. user635629_exter 37 07.04.22 10:06 Сейчас в теме
Добрый день.
{Задача.бпсЗадача.Форма.ФормаСписка.Форма(37,57)}: Переменная не определена (НаправлениеПоиска)
ПозВыбратьНачало = СтрНайти(Запрос.Текст, "ВЫБРАТЬ ", <<?>>НаправлениеПоиска.СКонца); (Проверка: Сервер)
Хотя в синтакс-помощнике написано, что доступно на сервере "НаправлениеПоиска".
Куда копать не пойму. УПП1,3 Платформа 8,3,20,1674

Возможно дело в том, что УПП не совсем УФ, но данная форма списка-УФ. Но даже если так, то "НаправлениеПоиска" не имеет отношения к УФ - это просто часть функции "СтрНайти". Мистика.
Прикрепленные файлы:
32. FilippovRI 71 17.04.22 22:07 Сейчас в теме
(30) режим совместимости у упп ниже, чем появилось Направления поиска, убери его, либо напиши аналог направления поиска с конца
33. user635629_exter 37 18.04.22 08:09 Сейчас в теме
(32) спасибо, понятно.
переписал форму на не УФ и в таблицу значений всё запихал - всё работает. не динсписок, ну и ладно.
34. 1v7 235 06.06.22 12:12 Сейчас в теме
&НаСервере
Процедура ПолучитьКоличествоСтрокВдинамическомСписке()

ТЗ_ДС = СписокВТЗ();
КолСтрокДС =ТЗ_ДС.Количество();
Сообщить("Количество строк динамического списка = "+КолСтрокДС);

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

&НаСервере
Функция СписокВТЗ()

//Получаем СКД с текстом запроса
СКД_запрос = Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();

//Получаем настройки пользователя (отборы, сортировки и т.п.)
Настройки = Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();

//Переводим динамический список в таблицу значений
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных();
МакетКомпоновки = КомпоновщикМакета.Выполнить(СКД_запрос, Настройки, , ,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));

ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки);

ПроцессорВыводаРезультата = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ТЗ = ПроцессорВыводаРезультата.Вывести(ПроцессорКомпоновкиДанных);// Таблица значений

Возврат ТЗ;

КонецФункции
35. Serg2000mr 311 22.08.22 06:05 Сейчас в теме
Сделал так:

&НаСервереБезКонтекста
Процедура СписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки)
	
	КоличествоСтрок = Строки.Количество();
 
	ХранилищеСистемныхНастроек.Сохранить("ДокументЗаказ.ФормаСписка", "КоличествоСтрокДинамическогоСписка", КоличествоСтрок);	
		
КонецПроцедуры

&НаКлиенте
Функция ПолучитьКоличествоСтрокДинамическогоСписка()
	
	КоличествоСтрокДинамическогоСписка = ВосстановитьЗначениеСервер("ДокументЗаказ.ФормаСписка", "КоличествоСтрокДинамическогоСписка");	
	
	Возврат КоличествоСтрокДинамическогоСписка; 

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

&НаСервереБезКонтекста
Функция ВосстановитьЗначениеСервер(КлючОбъекта, КлючНастроек = Неопределено) 
	
	Возврат ХранилищеСистемныхНастроек.Загрузить(КлючОбъекта, КлючНастроек);	
	
КонецФункции
Показать
36. Denic_01 46 24.08.22 11:01 Сейчас в теме
(35)
Сделал так:


интересная идея, замечу, что значение проще хранить в доп настройках списка, как то так

Настройки.ДополнительныеСвойства.Вставить("КоличествоСтрок", Строки.Количество());
37. Serg2000mr 311 25.08.22 00:53 Сейчас в теме
Этот код не будет работать во процедурах &НаСервереБезКонтекста, но так тоже можно, да.
38. balhomes 6 04.05.23 23:30 Сейчас в теме
Это не работает если в тексте запроса списка есть объединение
39. sano 67 05.05.23 11:57 Сейчас в теме
(38) Приведите ошибку, пожалуйста, которую выдаёт и, по-возможности, текст запроса. Можно в личку. Попробовал на простом объединении - работает (без временных таблиц и прочего).
40. Sher_Han 28.03.24 14:51 Сейчас в теме
Оставьте свое сообщение