Каталог решений - Выделение документов в динамическом списке

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

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

В наличии

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

Категория:

Описание

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

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

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

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

 

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

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

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

 

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

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

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

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

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

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

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


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

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


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

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

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

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

has been added to your cart:
Оформление заказа