Способ программного определения видимых строк пользователю, если пользователь отфильтровал строки таблицы формы, введя текст в строке поиска

26.08.22

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

В статье описан способ определить видимые пользователю строки, когда строки отфильтрованы текстом в строке поиска.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Пометка строк табличной части по строке поиска:
.epf 7,90Kb
0
0 Скачать (1 SM) Купить за 1 850 руб.

Друзья, попалась нетривиальная задача, установить пометку строк в таблице на форме, тип которой ТаблицаЗначений. Как оказалось, а может и я не нашел, нет способа определить какие строки видны пользователю, если пользователь ввёл в поиске слово, отфильтровав тем самым строки табличной части, как на рис. 1.

Перепробовав все известные мне способы получения строк, наконец обнаружил интересную фичу табличной части. Оказалось, что свойству ТекущаяСтрока, для строк которые не отображаются пользователю, невозможно установить значение идентификатора строки. При установке идентификатора видимых строк, свойство ТекущаяСтрока остается быть установленным в Неопределено, а если устанавливается идентификатор видимой строки, то в присвоенное значение. Друзья, если всё-таки существует стандартный способ получения видимых строк для таблицы формы, тип которой именно ТаблицаЗначений, так как с динамическим способом стандартные способы известны, прошу написать в комментарии, если же другого варианта нет, то думаю, что такая неочевидная особенность может пригодиться. 

Тестовый пример прилагаю. Тестирование проводилось на платформе 8.3.21.1302.

 

	//Установка пометок для строк только отображаемых пользователю
	//замечено, что для строк которые скрыты от пользователя ТекущаяСтрока принимает значение Неопределено
	КоличествоСтрок = ТаблицаЗначений.Количество();
	ТекущееПоложение = Элементы.ТаблицаЗначений.ТекущаяСтрока;
	Элементы.ТаблицаЗначений.ТекущаяСтрока = Неопределено;
	ПометкиУстановлены = Ложь;
	Для каждого Строка из ТаблицаЗначений Цикл
		
		Ид = Строка.ПолучитьИдентификатор();
		Элементы.ТаблицаЗначений.ТекущаяСтрока = Ид; 
		Если НЕ Элементы.ТаблицаЗначений.ТекущаяСтрока = Неопределено Тогда
			Строка.Пометка = Истина;
		Иначе                       
			Строка.Пометка = Ложь;
		КонецЕсли;
		
	КонецЦикла;
	
	Элементы.ТаблицаЗначений.ТекущаяСтрока = ТекущееПоложение;

 

См. также

Работа с интерфейсом Программист Платформа 1С v8.3 1C:Бухгалтерия 1С:ERP Управление предприятием 2 Платные (руб)

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

2400 руб.

29.06.2020    20066    28    6    

44

Работа с интерфейсом Программист Платформа 1С v8.3 1C:Бухгалтерия Абонемент ($m)

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

1 стартмани

05.07.2022    8339    kalyaka    6    

34

Работа с интерфейсом Программист Пользователь Платформа 1С v8.3 8.3.14 1C:Бухгалтерия 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Абонемент ($m)

Ещё с времен платформы 8.3.13 можно изменять цвет стилей интерфейса главного окна. Данное расширение позволит вам выбрать из подготовленных десятка стилей на свой вкус.

1 стартмани

01.07.2022    27162    426    rpgshnik    72    

103

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

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

3600 руб.

29.04.2022    14482    2    10    

13

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

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

6000 руб.

18.01.2022    10356    1    2    

6

Работа с интерфейсом Программист Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Реализовал простой способ программного создания новых элементов, команд и реквизитов на форме.

25.11.2021    11782    AtamanovYS    19    

150

Работа с интерфейсом Мобильная разработка Программист Платформа 1С v8.3 Мобильная платформа 1C:Бухгалтерия Бесплатно (free)

Разберем методы переноса HTML интерфейса на 1С на примере реализации нижнего меню для мобильного приложения. Сравним методы между собой. Данные методы можно применять не только для мобильной разработки, но и для веб-клиента и т.д

02.11.2020    18990    leobrn    83    

122

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

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

1500 руб.

06.10.2020    10934    7    7    

11
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. basicmaster 2 26.08.22 07:34 Сейчас в теме
ай молодца, ай догада :-)
2. tormozit 7269 26.08.22 09:46 Сейчас в теме
Только выделенные строки не восстановил
3. dhurricane 26.08.22 09:56 Сейчас в теме
Все намного проще:
Для каждого ТекущаяСтрока Из Таблица Цикл
		
	ТекущаяСтрока.Пометка = Элементы.Таблица.ПроверитьСтроку(ТекущаяСтрока.ПолучитьИдентификатор());
		
КонецЦикла;
marku; Nikitos_NSK; user1692948; user1481466; malenushka1; golod; RomanUzmov; bulpi; SlavaKron; ltfriend; dimanich70; DrAku1a; binx; Nikola23; tormozit; +15 Ответить
17. Риник 15 13.03.23 17:59 Сейчас в теме
(3) если видимость скрыта через условное оформление - не сработает
user1481466; Areal; +2 Ответить
20. VKislitsin 1025 08.05.24 15:32 Сейчас в теме
(3) У вас источником данных для ТаблицыФормы является ТабличнаяЧасть или НаборЗаписей. А у автора речь идет про источник данных - реквизит формы типа ТаблицаЗначений. В этом случае метод ПроверитьСтроку() не работает.

Правда, на 24-й платформе и метод, предложенный в статье, тоже не работает.
user1481466; +1 Ответить
21. dhurricane 08.05.24 15:38 Сейчас в теме
(20) Проверил на платформе 8.3.23.2040 на таблице значений - работает.
22. VKislitsin 1025 08.05.24 19:34 Сейчас в теме
(21) Тут не понял что работает - ПроверитьСтроку() или метод автора публикации?
23. dhurricane 09.05.24 01:57 Сейчас в теме
(22) ПроверитьСтроку. Я держу ответ только за свой предложенный алгоритм.
24. VKislitsin 1025 09.05.24 09:12 Сейчас в теме
(23) Да, работает. Я тоже уже понял где ошибся - процедура была в серверном контексте, а я не обратил на это внимания.
user1481466; +1 Ответить
28. Serg2000mr 725 15.01.25 02:12 Сейчас в теме
(3) Для дерева значений этот способ не работает
4. binx 173 26.08.22 13:06 Сейчас в теме
Супер, я так и знал что должен быть способ. Спасибо. Но хотелось бы вообще обойтить без перебора, чтобы стандартные методы работали без перебора строк, возвращая готовый набор видимых строк, но видимо чего нет, того нет. По крайней мере, теперь мы знаем как метод ПроверитьСтроку работает 👍
5. dhurricane 26.08.22 13:42 Сейчас в теме
А можете привести пример, когда информация о видимых строках вообще нужна? Делал однажды похожую задачу - расчет итогов для дин. списка. Здесь также? Или есть какие-то еще задачи?

А то про метод "ПроверитьСтроку" то я знаю, но вот ни разу пользоваться не приходилось. :-)
6. binx 173 26.08.22 13:58 Сейчас в теме
(5) да, согласен ситуация нечастая. Задача стояла такая, я описал её в статье. Клиенту удобно фильтровать поиском строки табличной части, по части строки, пример можно посмотреть на картинках, а над видимыми строками выполнять различные действия.
7. Cyberhawk 135 01.09.22 10:15 Сейчас в теме
(5) Отметить флажками пачку отобранных (поиском или отбором) строк
8. dhurricane 01.09.22 11:35 Сейчас в теме
(7) Как правило, я такие задачи решаю проще: что выделил пользователь, то и отмечать флажками. Аналогичным образом работают и типовые списки, поэтому такое поведение пользователю будет привычнее. Как мне кажется.
9. Cyberhawk 135 01.09.22 11:52 Сейчас в теме
(8) Вариант через выделение строк действительно избавляет от необходимости пользоваться флажками, но он:
- довольно хрупок: одним ошибочным кликом мышки мы обнуляем весь накопленный результат
- если критериев отбора (т.е. этапов добавления порций кандидатов в итоговый перечень) больше одного, то чаще всего неприменим
.
Тут-то флажки (с возможностью помечать ими все отображаемые, т.е. попавшие в фильтр, строки таблицы) и пригождаются.
11. binx 173 01.09.22 15:13 Сейчас в теме
(9) Дело в том что строк много, поэтому пользователю проще так, тем более что они не подряд, выделять, разрозненные строки, с помощью Ctrl не тренированному пользователю, трудно, легко сбиться и потерять весь результат выделения.
Я не защищаю этот способ, была задача, надо было решать. Насчет ошибочного движения мышки, не могу согласиться.
- если критериев отбора (т.е. этапов добавления порций кандидатов в итоговый перечень) больше одного, то чаще всего неприменим
по факту критериев может быть несколько, если в строке поиска, несколько слов отделенных пробелами, опять же никто не говорит что это решение универсальное и заменяет отбор с группами ИЛИ, И, НЕ, >, <, =, !=. Просто способ фильтрации удобный для определенного пользователя.
13. Cyberhawk 135 01.09.22 15:17 Сейчас в теме
(11) Не очень понимаю, почему написанное адресовано мне. Пока кажется, что ты ошибся при выборе сообщения для ответа.
12. dhurricane 01.09.22 15:17 Сейчас в теме
(9) Не, Вы меня неверно поняли. Я не предлагал отказаться от флажков. Я говорил как раз про установку флажков в выделенных строках. В т.ч. и по клику на флажке в одной из выделенных строк. Как раз в типовых такое поведение и подсмотрел.
14. Cyberhawk 135 01.09.22 15:22 Сейчас в теме
(12) Получается твой способ для пометки всех попавших в отбор строк требует сначала выделить их все через нажатие Ctrl+A, так?
Сценарий в (7) пригождается для возможности пометить все одной кнопкой (одним кликом мышки) без необходимости предварительного выделения этих всех строк.
15. dhurricane 01.09.22 15:39 Сейчас в теме
(14) Да, собственно, из первого приведенного для меня примера я так и понял.
10. binx 173 01.09.22 15:08 Сейчас в теме
(8) Ну что тут скажешь, он пользователь, он так видит.
18. RomanUzmov 40 11.06.23 18:26 Сейчас в теме
(5) Ну, например, когда в таблице на форме документа пользователь вводит в строке поиска какое-либо значение для поиска, либо накладывает фильтр, и строки выводятся на форме согласно заданному поиску/фильтру, надо чтобы итоги по столбцам при этом пересчитались. Крайне удобная вещь. В стоковом варианте итоги будут равны итогам по всей таблице, невзирая на фильтры, что неудобно для пользователя.
19. dhurricane 13.06.23 00:52 Сейчас в теме
(18) Как поймать момент, когда пользователь ввел строку поиска?
16. bulpi 217 02.09.22 02:55 Сейчас в теме
"При установке идентификатора видимых строк, свойство ТекущаяСтрока остается быть установленным в Неопределено, а если устанавливается идентификатор видимой строки, то в присвоенное значение. "

Сам то понял, что написал?
25. KHoroshulinAV 171 15.08.24 10:30 Сейчас в теме
26. FoxSv 07.09.24 01:53 Сейчас в теме
Автор, дай бог тебе здоровья!!! :)
27. sir 18 10.10.24 14:25 Сейчас в теме
У меня на форме данные таблицы значений , "ПроверитьСтроку" не работает, пришлось изгаляться

&НаКлиенте
Процедура ОбновитьИтогиПослеОтбора()
		
	мТекущийЭлемент = ЭтотОбъект.ТекущийЭлемент;
	мТекущаяСтрока  = Элементы.СписокЗаказов.ТекущаяСтрока;
	
	ВыделитьСтрокиЗаказов(); 
	 
	ПодключитьОбработчикОжидания("ЗакончитьОбновитьИтогиПослеОтбора", 0.5, Истина);
	
КонецПроцедуры  

&НаКлиенте
Процедура ЗакончитьОбновитьИтогиПослеОтбора()
	
	СуммаДоходов = 0;
			
	ВыделенныеСтроки = Элементы.СписокЗаказов.ВыделенныеСтроки;
	
	Если ВыделенныеСтроки.Количество() > 1 Тогда
		Для Каждого с Из ВыделенныеСтроки Цикл
			стр = СписокЗаказов.НайтиПоИдентификатору(с);
			СуммаДоходов = СуммаДоходов + стр.СуммаДоходов;
		КонецЦикла;
	КонецЕсли;
	
	ЭтотОбъект.ТекущийЭлемент = мТекущийЭлемент;
	
	ВыделенныеСтроки.Очистить();;
	ВыделенныеСтроки.Добавить(мТекущаяСтрока);
	
	Элементы.СписокЗаказовНовыйСуммаДоходов.ТекстПодвала     = Формат(СуммаДоходов,"ЧДЦ=2; ЧН=' '"); ;
     
КонецПроцедуры

&НаКлиенте
Процедура АдресОтправленияОтборОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, СтандартнаяОбработка)
	
	ОбновитьИтогиПослеОтбора();

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

&НаКлиенте
Процедура ВыделитьСтрокиЗаказов()
	
	ЭтотОбъект.ТекущийЭлемент = Элементы.СписокЗаказов;
	
	ОбъектShell = Новый COMОбъект("Wscript.Shell");
	ОбъектShell.SendKeys("^A"); 
	 
КонецПроцедуры	

Показать


то есть после того как я установить отбор по строкам (это происходит при редактировании строчного реквизита "АдресОтправленияОтбор"),
я выделяю строки , обсчитываю и снимаю выделение.
Оставьте свое сообщение