Выделение строки динамического списка

1. Gendelf 25.06.18 16:19 Сейчас в теме
Добрый день, 1С 8.3 КА 2.4
На форме есть ТЧ "Товары", при выделение строки необходимо выделить строку динамического списка "Список" с той же номенклатурой... казалось бы задача не сложная, но у меня трудности =(
Нашел нужный метод, но что туда передать??

Номенклатура здесь
Элементы.Товары.ТекущиеДанные.Номенклатура


Элементы.Список.ВыделенныеСтроки.Добавить( .... 
Найденные решения
25. spacecraft 26.06.18 15:45 Сейчас в теме
(1) да легко:
	ВыбранныеСтроки = Элементы.Список.ВыделенныеСтроки;
	к=0;
	Пока Истина Цикл
		к = к + 1;
		ТекущаяСтрока = Элементы.Список.ДанныеСтроки(к);
		Если ТекущаяСтрока = Неопределено Тогда
			Прервать;
		КонецЕсли;
		Если ТекущаяСтрока.Номенклатура = Номенклатура Тогда
			ВыбранныеСтроки.Добавить(к);
		КонецЕсли;
	КонецЦикла;
Показать
Gendelf; yaguarrr; independ; +3 Ответить
Остальные ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
5. dandykry 5 25.06.18 16:47 Сейчас в теме
(1) Выделить или сделать текущей строку в ДС проблематично. Можно наложить отбор


&НаКлиенте
Процедура ТабличнаяЧасть1ПриАктивизацииСтроки(Элемент)
	ПодключитьОбработчикОжидания("ОбработатьАктивизациюСтрокиСписка", 0.2, Истина);
КонецПроцедуры



&НаКлиенте
Процедура ОбработатьАктивизациюСтрокиСписка()
	
	ТекущаяСтрока = Элементы.ТабличнаяЧасть1.ТекущиеДанные;
	Если Не ТекущаяСтрока = Неопределено Тогда
		
		ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(ДинамическийСписок, "Ссылка", ТекущаяСтрока.Реквизит1, ВидСравненияКомпоновкиДанных.Равно,, ,РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный);  
		
	Иначе
		ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(ДинамическийСписок, "Ссылка", ТекущаяСтрока.Реквизит1, ВидСравненияКомпоновкиДанных.Равно,,Ложь ,РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный);  
	КонецЕсли;
	
КонецПроцедуры
Показать
7. herfis 367 25.06.18 16:55 Сейчас в теме
(5)
Выделить или сделать текущей строку в ДС проблематично

Нужно себя заставить? :)
22. dandykry 5 26.06.18 15:09 Сейчас в теме
(7) ох уж это словоблудство.....
Сделать строку текущей: Только если есть основная таблица. Тогда да. Достаточно

Элементы.Реквизит2.ТекущаяСтрока = Элементы.Реквизит1.ТекущиеДанные.Реквизит1;

С учетом того, что ТекущиеДанные.Реквизит1 есть ссылка на ссылку основной таблицы.

выделить строки:

Тип: Массив.
Содержит массив идентификаторов выделенных строк.

Как вы собираетесь искать идентификаторы строк динамического списка?

нужно Элементы.Реквизит2.ВыделенныеСтроки.Добавить(Число);

Где число это номер строки ДС.

Поэтому проблематично :)


UP: Я попробовал. Можно и ссылки добавлять в массив, если указана основная таблица. Вопрос снимается.
24. herfis 367 26.06.18 15:32 Сейчас в теме
(22)
Сделать строку текущей: Только если есть основная таблица. Тогда да. Достаточно

Динамические списки без основной таблицы - это исключение, а не правило. ТС вроде ничего такого не упоминал. И вы тоже. Просто сказали, что это мол "в ДС проблематично". Нехило так обобщив и вводя людей в заблуждение. Ну и кто после этого словоблуд?
С выделенными строками аналогично. Если у ДС есть основная таблица - то там ссылки. Это описано в справке по расширению таблицы формы для динамического списка и это проверено в (10) на практике.
26. spacecraft 26.06.18 15:50 Сейчас в теме
(24) в (20) было уточнение, что ДС без основной таблицы.
27. herfis 367 26.06.18 15:52 Сейчас в теме
Кстати, раз уж затронули вопрос.
Кто-нибудь мне объяснит смысл использования динамического списка без основной таблицы? Ведь никакой "динамичности" в этом случае уже не будет (порционное считывание невозможно, будет его эмуляция) и все другие плюшки ДС с основной таблицей тоже теряются. Получаем тормозящий на больших объемах список, из плюсов только то, что он не тянется весь на клиента, а пересчитывается на сервере. Что на практике очень сомнительное преимущество, так как тормоза - обратная сторона этой плюшки.
Ну, то есть в отличие от динамического списка с основной таблицей юзабельность будет сохранятся только при определенных условиях и с ростом объема данных легко может потеряться.
Или я ошибаюсь?
(26) В (20), насколько я понял, основная таблица очищалась только в качестве эксперимента.
ЗЫ. Хотя, я вообще не понял, зачем в (20) такой запрос динамического списка. Если для ТЧ - то вообще не нужен динамический список.
28. spacecraft 26.06.18 15:55 Сейчас в теме
(27) "если заполнено свойство Основная таблица - выходит ошибка "Основная таблица динамического списка задано не верно". " Наоборот. Пробовалось установить.
Да и основная таблица не факт, что Номенклатура была бы.

Основная таблица для ДС нужна только для возможности изменения.
Не всегда можно указать основную таблицу при сложном соединении. Т.к. не будет возможности вносить изменения, а без этого основная таблица не отрабатывает.
29. herfis 367 26.06.18 15:59 Сейчас в теме
(28)
Основная таблица для ДС нужна только для возможности изменения.

Не только.
Или объясните дураку, как вы организуете порционное/динамическое считывание данных при скроллинге с использованием абсолютно произвольного запроса.
30. spacecraft 26.06.18 16:01 Сейчас в теме
(29) насколько помню, все данные получаются сразу из БД и сохраняются в серверном кеше. И уже из него порциями показываются.
31. herfis 367 26.06.18 16:06 Сейчас в теме
(30) Фига себе. То есть другими словами, если я открою таблицу проводок без привязки к основной таблице то в серверный кэш загонится копия всей таблицы проводок? :) В любом случае вы сами же себя опровергаете. Потому что если вы откроете таблицу проводок с установленной основной таблицей, то все будет совсем не так печально. И значит, основная таблица для ДС нужна не только для возможности изменения.
32. spacecraft 26.06.18 16:14 Сейчас в теме
(31) возможно, если установлена основная таблица и указан флаг "динамическое считывание", и основная таблица имеет индекс, и нет соединений, тогда возможно и получение данных из БД порциями. Точно не скажу. Но должны соблюдаться все эти перечисленные условия.
Вот голове отложилась цифра в 1000. Возможно порция размеров в 1000. Но не уверен :)
Когда-то читал про это. Там несколько раз переделывали механику.
33. herfis 367 26.06.18 16:22 Сейчас в теме
(32) Естественно, я про динамическое считывание данных. Основная таблица всегда имеет ключ. А соединения не мешают, если не плодят строки.
34. spacecraft 26.06.18 16:27 Сейчас в теме
(33) да. Вот что в 1С сказано:

Динамическое считывание данных включено (рекомендуется). Используются запросы, выбирающие записи в количестве приблизительно соответствующем количеству видимых строк в таблице;
Динамическое считывание данных выключено, задана не виртуальная основная таблица или одна из следующих таблиц: СрезПервых, СрезПоследних, ЗадачиПоИсполнителю, КритерииОтбора, ДвижениеСубконто. Используются запросы, выбирающие по 1000 записей в буфер на сервере, по мере необходимости данные передаются на клиент. Менее эффективно, чем динамическое считывание;
Динамическое считывание данных выключено, основная таблица не задана. Запрос выполняется «как есть». В буфере накапливаются данные, начиная с 1000 записей. Чем ближе к концу списка, тем больше записей. Можно использовать только для заведомо маленьких выборок.

Но там еще про соединения и сортировку. Динамическое считывание может быть выключено при определенных настройках сортировки и выборки.
35. herfis 367 26.06.18 16:35 Сейчас в теме
(34) Вот вообще непонятно, зачем может понадобиться режим с основной таблицей и отключенным динамическим считыванием. Подозреваю, что исключительно для некоторых из перечисленных таблиц, где включить динамическое считывание попросту невозможно.
37. spacecraft 26.06.18 16:53 Сейчас в теме
(35)
зачем может понадобиться режим с основной таблицей и отключенным динамическим считыванием

Еще для списков, которые будут часто листать. Если будет динамическое считывание, то будет чаще обращаться к СУБД.
39. herfis 367 26.06.18 17:00 Сейчас в теме
(37) Спорный аргумент.
(38) Я в курсе. И это как бы логично.
18. Boneman 263 26.06.18 14:08 Сейчас в теме
(1)
необходимо выделить строку динамического списка "Список"

выделить, в смысле прямо программно выбрать-множественным выбором, типа как мышкой в журналах, для распечатывания ?
или выделить, в смысле оформить визуально (подсветить там, пожирнее сделать, или фон строки изменить) ?
25. spacecraft 26.06.18 15:45 Сейчас в теме
(1) да легко:
	ВыбранныеСтроки = Элементы.Список.ВыделенныеСтроки;
	к=0;
	Пока Истина Цикл
		к = к + 1;
		ТекущаяСтрока = Элементы.Список.ДанныеСтроки(к);
		Если ТекущаяСтрока = Неопределено Тогда
			Прервать;
		КонецЕсли;
		Если ТекущаяСтрока.Номенклатура = Номенклатура Тогда
			ВыбранныеСтроки.Добавить(к);
		КонецЕсли;
	КонецЦикла;
Показать
Gendelf; yaguarrr; independ; +3 Ответить
40. SlavaKron 26.06.18 20:10 Сейчас в теме
(25) В рамках постпвленной задачи - отлично, но выделяете вы все же не сущности, а строки, которые удовлетворяют задаче в рамках текущей сортировки. Впрочем, каков вопрос - таков ответ.
41. spacecraft 26.06.18 21:22 Сейчас в теме
(40) а при ручном выделении будет абсолютно тоже самое. Нет данных для привязки.
49. Andy_NTG 4 06.09.19 18:42 Сейчас в теме
(25) Есть только свойство ВыделенныйТекст. А ВыделенныеСтроки почему-то отсутствуют. Может, от версии платформы зависит? У меня 8.3.15
43. Elnur54442 28.06.18 13:10 Сейчас в теме
(1) Проблема все еще не решена?
44. Gendelf 28.06.18 13:12 Сейчас в теме
(43) да, сейчас пробую через таблицу значений, вместо динамического списка.
45. Elnur54442 28.06.18 13:17 Сейчас в теме
(44) Тема интересная. Мне кажется что можно решить. Если не получится напишите.
2. herfis 367 25.06.18 16:25 Сейчас в теме
В качестве значений для свойств ТекущаяСтрока, ТекущийРодитель и элемента коллекции, содержащейся в свойстве ВыделенныеСтроки, используются значения ссылок на объекты, которые содержит главная таблица динамического списка.

ЗЫ. Короче просто пишешь в свойство "ТекущаяСтрока" таблицы формы динамического списка ссылку на нужную номенклатуру.
3. Xershi 1003 25.06.18 16:35 Сейчас в теме
Судя по справке:
ТаблицаФормы (FormTable)
ВыделенныеСтроки (SelectedRows)
Использование:

Только чтение.
Описание:

Тип: Массив.
Содержит массив идентификаторов выделенных строк.

Доступность:

Тонкий клиент, веб-клиент, сервер, толстый клиент, мобильное приложение(клиент), мобильное приложение(сервер).
Показать

Добавить в выделенное нельзя, почему выделил жирным.
6. herfis 367 25.06.18 16:51 Сейчас в теме
(3) Не пробовал, но подозреваю что добавлять можно.
Так часто пишут в СП для свойств-коллекций.
ДРУГУЮ коллекцию присвоить свойству нельзя, но менять содержимое часто можно.
8. Xershi 1003 25.06.18 17:04 Сейчас в теме
(6) другой справки нет.
Как пишут так и будет работает!
Иначе не документированная функциональность / баг, нужное подчеркнуть!
9. spacecraft 25.06.18 17:10 Сейчас в теме
(8)
Нельзя сделать так:
...ВыделенныеСтроки = Новый Массив();
А в массив, который содержится в ВыделенныеСтроки можно добавлять.
11. herfis 367 25.06.18 17:16 Сейчас в теме
(8) Да подчеркивай, что хочешь. Я просто сообщаю о том, что в справке пометку "Только чтение" имеют ВСЕ свойства-коллекции, которые нельзя перезаписывать. Независимо от того, можно менять содержимое коллекций или нет. Поступай с этой информацией как тебе угодно.
12. Xershi 1003 25.06.18 17:50 Сейчас в теме
(11) в примере показали, что там таблица формы. И то что я написал в справке.
Редактировали массив, который был в выделенных строках. Массив конечно редактировать можно.

(9)
ВыделенныеСтрокиТабличногоПоля
нет там все как по справке. Что-то тоже путаете!
10. SlavaKron 25.06.18 17:15 Сейчас в теме
Да, можно. И добавлять и удалять, только желательно через ПодключитьОбработчикОжидания
Пример:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	НоваяСтрока = Товары.Добавить();
	НоваяСтрока.Реквизит1 = "Кабель";
	
	НоваяСтрока = Товары.Добавить();
	НоваяСтрока.Реквизит1 = "Щебень";
	
	НоваяСтрока = Товары.Добавить();
	НоваяСтрока.Реквизит1 = "Пруток";
КонецПроцедуры

&НаКлиенте
Процедура ТоварыПриАктивизацииСтроки(Элемент)
	ПодключитьОбработчикОжидания("ВыделитьСтроки", 0.1, Истина);
КонецПроцедуры

&НаКлиенте
Процедура ВыделитьСтроки()
	ВыделенныеСтроки = Элементы.Список.ВыделенныеСтроки;
	ВыделенныеСтроки.Очистить();
	СтрокаПоиска = Элементы.Товары.ТекущиеДанные.Реквизит1;
	МассивСсылок = ПолучитьСсылки(СтрокаПоиска);
	Для Каждого НайденнаяСсылка Из МассивСсылок	Цикл
		ВыделенныеСтроки.Добавить(НайденнаяСсылка);
	КонецЦикла;
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьСсылки(ПодстрокаПоиска)
	Запрос = Новый Запрос(
	"ВЫБРАТЬ
	|	Номенклатура.Ссылка КАК Ссылка
	|ИЗ
	|	Справочник.Номенклатура КАК Номенклатура
	|ГДЕ
	|	Номенклатура.Наименование ПОДОБНО &Наименование");
	Запрос.УстановитьПараметр("Наименование", "%" + ПодстрокаПоиска + "%");
	Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку(0)
КонецФункции
Показать
Прикрепленные файлы:
ВнешняяОбработка2.epf
13. Gendelf 26.06.18 09:54 Сейчас в теме
(10) Спасибо за подробный код, номенклатура попадает в Элементы.СписокИсходящихЗаявок.ВыделенныеСтроки, но строка не выделяется. Я так думаю туда должна попадать вся строка или поле Номенклатура должна быть как то выделена в динамическом списке (типа "Ведущее") чтобы по нему срабатывал данный код ?

  ВыделенныеСтроки = Элементы.СписокИсходящихЗаявок.ВыделенныеСтроки;
    ВыделенныеСтроки.Очистить();
    СтрокаПоиска = Элементы.Товары.ТекущиеДанные.Номенклатура;
    МассивСсылок = ПолучитьСсылки(СтрокаПоиска);
    Для Каждого НайденнаяСсылка Из МассивСсылок Цикл
        ВыделенныеСтроки.Добавить(НайденнаяСсылка);
    КонецЦикла;
Показать
Прикрепленные файлы:
14. SlavaKron 26.06.18 10:49 Сейчас в теме
(13) В вашем случае в массив выделенных строк нужно добавлять ссылки на исходящие заявки.
15. Gendelf 26.06.18 13:54 Сейчас в теме
(14) я думаю тут дело в Основной таблице, когда я выбираю ссылку на документ, то выходит ошибка (см скрин). Приходится делать динамический список без основной таблицы. Как раз основную таблицу и нужно добавлять в ВыделенныеСтроки.Добавить(). Верно?
Прикрепленные файлы:
16. SlavaKron 26.06.18 14:02 Сейчас в теме
17. Gendelf 26.06.18 14:05 Сейчас в теме
(16) а можно эту ошибку обойти?
19. SlavaKron 26.06.18 14:40 Сейчас в теме
(17) Динамический список с произвольным запросом? Если да, покажите запрос, если нет, то что мешает указать основную таблицу?
20. Gendelf 26.06.18 14:44 Сейчас в теме
(19) Запрос элементарный, все данные с одного документа, но если заполнено свойство Основная таблица - выходит ошибка "Основная таблица динамического списка задано не верно". Если это поле очищаю, то произвольный запрос отрабатывает как нужно.

ВЫБРАТЬ
	СВХ_ИсходящийЗаказТовары.Ссылка КАК Ссылка,
	СВХ_ИсходящийЗаказТовары.Ссылка.Статус КАК Статус,
	СВХ_ИсходящийЗаказТовары.Номенклатура КАК Номенклатура,
	СВХ_ИсходящийЗаказТовары.Количество КАК Количество,
	СВХ_ИсходящийЗаказТовары.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
	СВХ_ИсходящийЗаказТовары.СрокПоставки КАК СрокПоставки,
	СВХ_ИсходящийЗаказТовары.Цена КАК Цена,
	СВХ_ИсходящийЗаказТовары.Сумма КАК Сумма,
	СВХ_ИсходящийЗаказТовары.Валюта КАК Валюта,
	СВХ_ИсходящийЗаказТовары.КодЗаказа КАК КодЗаказа
ИЗ
	Документ.СВХ_ИсходящийЗаказ.Товары КАК СВХ_ИсходящийЗаказТовары
ГДЕ
	СВХ_ИсходящийЗаказТовары.КодЗаказа = &КодЗаказа
	И СВХ_ИсходящийЗаказТовары.Ссылка.Проведен

Показать
21. SlavaKron 26.06.18 15:02 Сейчас в теме
(20) Возможно стоит отказаться от динамического списка в пользу таблицы значений, заполняемой программно при активации строки ТЧ.
23. dandykry 5 26.06.18 15:13 Сейчас в теме
(20) Внешка с текущей строкой.
Почему не сможете выделить ответил в 22
Прикрепленные файлы:
ВнешняяОбработка1.epf
42. Gendelf 28.06.18 13:05 Сейчас в теме
Вот смотрю я конструкторе, там динамическое считывание стоит и основная таблица тоже. Но при этом не работает ни (10) ни (23) способ, а всё из-за произвольного запроса.
Прикрепленные файлы:
46. spacecraft 28.06.18 13:18 Сейчас в теме
(42) потому что основная таблица не Номенклатура, а в (10) передается массив номенклатуры.
Если все же используется основная таблица, то нужно искать не номенклатуру, а документы, в которых используется номенклатура, и уже ссылки на документы передавать.
Или как в (25) в цикле находить строки и уже передавать строки вместо номера.
47. Gendelf 28.06.18 13:22 Сейчас в теме
(46)
(42) потому что основная таблица не Номенклатура, а в (10) передается массив номенклатуры.
Если все же используется основная таблица, то нужно искать не номенклатуру, а документы, в которых используется номенклатура, и уже ссылки на документы передавать.

Пробовал передать ссылку на документ основной таблицы - не сработало. Ссылка попадает в Элементы.СписокИсходящихЗаявок.ВыделенныеСтроки, но выделения при этом нет.
Или как в (25) в цикле находить строки и уже передавать строки вместо номера.

Попробую
48. Gendelf 28.06.18 13:52 Сейчас в теме
(46) Работает! (25)
Только
ВыбранныеСтроки.Очистить();
добавил и всё.
4. Xershi 1003 25.06.18 16:36 Сейчас в теме
Можно отбор наложить, вот такое вполне реально!
36. herfis 367 26.06.18 16:40 Сейчас в теме
Да и ДС без основной таблицы и динамического считывания лично я тоже никогда не использую. Да и в типовых не видел (но тут не поручусь).
Потому что вот вот это вот "В буфере накапливаются данные, начиная с 1000 записей. Чем ближе к концу списка, тем больше записей." дает непрогнозируемую масштабируемость. А "для заведомо маленьких выборок" сплошь и рядом выгоднее и удобнее вычитывать полностью в ТЗ, гарантировав бизнес-процессом ограниченность объема вычитываемых данных.
38. spacecraft 26.06.18 16:56 Сейчас в теме
(36)
ДС без основной таблицы и динамического считывания лично я тоже никогда не использую. Да и в типовых не видел (но тут не поручусь).

А динамическое считывание без основной таблицы физически невозможно включить.
Оставьте свое сообщение
Вопросы с вознаграждением