gifts2017

Выделение документов в динамическом списке

Опубликовал Сергей Кирпо (Sardukar) в раздел Программирование - Работа с интерфейсом

Допустим, пользователю конфигурации на управляемых формах захотелось  выделять документы в списке привычным образом и производить какие-то манипуляции с выделенными документами. Например, делать на их основании какие-то документы.

Приведу пример, как это делается в форме списка документов "Заказы клиентов".

Для начала в реквизитах формы находим "Список", который имеет тип "ДинамическийСписок". В его свойствах рядом с "Настройка списка" нажимаем "Открыть"

 и добавляем в запрос перед "ИЗ" строку:

",
 Выбор Когда ДокументЗаказКлиента.Ссылка В (&МассивВыбранныхСсылок) ТОГДА ИСТИНА Иначе ЛОЖЬ КОНЕЦ КАК Отмечено".

 

После этого у вас в списке появится реквизит "Отмечено", который можете отразить на форме.

Затем правим модуль формы.

Добавляем переменные (у меня на основании выделенных будут создаваться реализации, отсюда переменная СоздаетсяРеализация, для себя сделаете что-то другое):

 

&НаКлиенте
Перем МассивВыбранныхСсылок;
&НаКлиенте
Перем ПерваяАктивизация;
&НаКлиенте
Перем СоздаетсяРеализация;

В процедуру ПриОткрытии() добавляем инициацию:

ПерваяАктивизация = Истина;
СоздаетсяРеализация = Ложь;
МассивВыбранныхСсылок=Новый Массив; 
Список.Параметры.УстановитьЗначениеПараметра("МассивВыбранныхСсылок",МассивВыбранныхСсылок);

Затем для таблицы формы "Список" в процедуру СписокПриАктивизацииСтроки добавляем:

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

Собственно все, но я знаю вам еще захочется сделать кнопки "Отметить все" и "Снять все отметки" :-). Ок, код ниже:

&НаКлиенте
Процедура СнятьВсеОтметки(Команда)
	МассивВыбранныхСсылок.Очистить();	
	Список.Параметры.УстановитьЗначениеПараметра("МассивВыбранныхСсылок",МассивВыбранныхСсылок);
КонецПроцедуры


&НаКлиенте
Процедура ОтметитьВсе(Команда)
	МассивВыбранныхСсылок = ОтметитьВсеНаСервере(МассивВыбранныхСсылок);	
	Список.Параметры.УстановитьЗначениеПараметра("МассивВыбранныхСсылок",МассивВыбранныхСсылок);	
КонецПроцедуры

&НаСервере
Функция ОтметитьВсеНаСервере(МассивВыбранныхСсылок)
	//продублируем получение данных в динамический список
	ТекстЗапроса = ПолучитьТекстЗапросаСписка();
	СхемаКомпоновки = Новый СхемаКомпоновкиДанных();
	
	Источник = СхемаКомпоновки.ИсточникиДанных.Добавить();
	Источник.Имя = "Исток";
	Источник.СтрокаСоединения="";
	Источник.ТипИсточникаДанных = "local";
	
	НаборДанных = СхемаКомпоновки.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));	
	НаборДанных.Запрос = ТекстЗапроса;		
	НаборДанных.Имя = "Запрос";
	НаборДанных.АвтоЗаполнениеДоступныхПолей = Истина;
	НаборДанных.ИсточникДанных = "Исток";
	
	НастройкиКомпоновки = МобильныеПриложения.СкомпоноватьНастройки(СхемаКомпоновки);
	
	ОбщегоНазначенияУТКлиентСервер.СкопироватьЭлементы(НастройкиКомпоновки.Отбор, Список.Отбор);
	ОбщегоНазначенияУТКлиентСервер.СкопироватьЭлементы(НастройкиКомпоновки.Порядок, Список.Порядок);
	ОбщегоНазначенияУТКлиентСервер.ЗаполнитьЭлементы(НастройкиКомпоновки.ПараметрыДанных, Список.Параметры);
	
	
	МакетКомпоновки = ОбщегоНазначенияУТ.ПолучитьМакетКомпоновки(СхемаКомпоновки, НастройкиКомпоновки);
	
	ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки);
	
	ТЗ = Новый ТаблицаЗначений;
	
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
	ПроцессорВывода.УстановитьОбъект(ТЗ);
	ПроцессорВывода.НачатьВывод();
	
	Пока Истина Цикл		
		ЭлементРезультатаКомпоновкиДанных = ПроцессорКомпоновкиДанных.Следующий();		
		Если ЭлементРезультатаКомпоновкиДанных = Неопределено Тогда 
			Прервать;
		КонецЕсли;		
		ПроцессорВывода.ВывестиЭлемент(ЭлементРезультатаКомпоновкиДанных);		
	КонецЦикла;
	
	ПроцессорВывода.ЗакончитьВывод();
	//теперь по полученной копии списка пометим все
	Для каждого стр из ТЗ Цикл
		ДокСсылка = стр.Ссылка;
		ИндексСтрокиМассива=МассивВыбранныхСсылок.Найти(ДокСсылка);
		Если ИндексСтрокиМассива=Неопределено Тогда
			МассивВыбранныхСсылок.Добавить(ДокСсылка);       
		КонецЕсли;		
	КонецЦикла;
	Возврат МассивВыбранныхСсылок;	
КонецФункции


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

Ну и для примера создаем реализацию:

&НаКлиенте
Процедура СоздатьРеализацииДляОтмеченных(Команда)	
	СоздаетсяРеализация = Истина;
	Для каждого стр из  МассивВыбранныхСсылок цикл
		//чо то делаем с ссылками	
	КонецЦикла;	
	СоздаетсяРеализация = Ложь;
КонецПроцедуры

Спасибо всем за внимание!

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Олег Балобанов (KiLLius) 02.02.16 08:54
Спасибо за пример.
А что делать, если в списке не ссылки документов, а записи независимого РС? И необходимо их отметить и тоже групповую обработку провести.
2. Сергей Кирпо (Sardukar) 02.02.16 10:31
(1) KiLLius, так как набор всех измерений РС уникален для каждой строки, то по идее можно в запросе формировать уникальный идентификатор путем сложения измерений, преобразуя, например, сначала в строку их представление (или их уникальные реквизиты) и потом при выборе этот идентификатор загонять в МассивВыбранныхСсылок и соответственно в запросе для Отмечено проверять входит ли этот идентификатор в МассивВыбранныхСсылок . Это то что сразу в голову пришло.
3. Игорь Мирошниченко (igormiro) 02.02.16 17:20
Для вашей задачи мне не понятно:
1) Почему вам не подошло условное оформление в Динамическом списке?
2) Выбор Когда ДокументЗаказКлиента.Ссылка В (&МассивВыбранныхСсылок) ТОГДА ИСТИНА Иначе ЛОЖЬ КОНЕЦ КАК Отмечено". МассивВыбранныхСсылок можно было получить вложенным запросом.
4. Сергей Кирпо (Sardukar) 03.02.16 02:08
(3) igormiro,
1) если вы имеете в виду выделение цветом выбранной строки, то моему заказчику по душе галочки.
2)Буду благодарен за пример.
5. Михаил Щербак (Zircool) 03.02.16 23:58
Есть другой способ как работать с выделенными строками в динамическом списке.

Элементы.Список.ВыделенныеСтроки - содержит массив выделенных строк.

КоличествоСтрок = Элементы.Список.ВыделенныеСтроки.Количество(); 
		Счетчик = 0; 
		Для каждого Строка из Элементы.Список.ВыделенныеСтроки Цикл
			Счетчик = Счетчик + 1; 
			ТвояПроцедура(Строка);
			Состояние(""+Строка+ " "+Счетчик+" из "+КоличествоСтрок); 
			ОбработкаПрерыванияПользователя();
		КонецЦикла;
...Показать Скрыть
bird21; cheiser1982; lextor; марксист; Anything; config; +6 Ответить