Каталог решений - Использование флажков в динамических списках 2.0

Использование флажков в динамических списках 2.0

Использование флажков в динамических списках 2.0

В наличии

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

Категория:

Описание

На момент решения опубликовать данный материал на инфостарте была найдена уже существующая подобная тема, а точнее некий "Зародыш". Посему, решил назвать публикацию аналогично, как бы продолжением этой эпопеи связанной с прикручиванием флажкового функционала к ДС. И вот теперь здесь и сейчас, вашему чуткому вниманию, представлена реализация уже более полноценного и наглядного примера работы динамического списка с пометками в режиме множественного и единичного выбора. Изменение значения пометки строки происходит по двойному клику мышки (событие "Выбор"). Также, можно помечать только выделенные строки (кнопками: [v] "Установить пометки" или [ ] "Снять пометки"). Событие ДС ПриПолученииДанныхНаСервере реализовано в версии платформы 8.3.10.2168, а потому начиная именно с этой версии можно пользоваться данным приёмчиком. Больше пояснять думаю ничего и необязательно, остальное немного пройдясь по коду думаю и так всё понятно станет, но если что, спрашивайте в комментах.

Запрос динамического списка с пометками и реквизиты формы подбора:

Кот формы подбора:

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

 

 

События интеграции для открытия формы подбора:

Котэ интеграции для работы с формой подбора:

  #Область ОбработчикиКомандФормы
  
  &НаКлиенте
  Процедура Подобрать(Команда)
  	
  	Если Объект.ДокументыЗаказов.Количество() Тогда
  		КнопкиДиалога = Новый СписокЗначений;
  		КнопкиДиалога.Добавить(КодВозвратаДиалога.Да, "Очистить и Заполнить");
  		КнопкиДиалога.Добавить(КодВозвратаДиалога.Нет, "Добавить");
  		КнопкиДиалога.Добавить(КодВозвратаДиалога.Отмена, "Отмена");
  		ОписаниеОповещения = Новый ОписаниеОповещения("ПодобратьПослеВопроса", ЭтотОбъект);
  		ПоказатьВопрос(ОписаниеОповещения, "В таблице имеются строки, как поступить?", КнопкиДиалога,,, "Заполнение по заказам");
  	Иначе
  		ПодобратьПослеВопроса(КодВозвратаДиалога.Нет, Неопределено);
  	КонецЕсли;
  	
  КонецПроцедуры
  
  #КонецОбласти
  
  #Область ОбработчикиСобытийЭлементовФормы
  
  &НаКлиенте
  Процедура ПодобратьПослеВопроса(Результат, ДополнительныеПарамтеры) Экспорт
  	
  	Если Результат = КодВозвратаДиалога.Да Тогда
  		Объект.ДокументыЗаказов.Очистить();
  	КонецЕсли;
  	
  	Если Результат <> КодВозвратаДиалога.Отмена Тогда
  		ОткрытьФормуПодбора();
  	КонецЕсли;
  	
  КонецПроцедуры
  
  &НаКлиенте
  Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
  	
  	Если ВыбранноеЗначение = Неопределено Тогда
  		Возврат;
  	КонецЕсли;
  		
  	Если ИсточникВыбора.ИмяФормы = "ВнешняяОбработка.ДинамическийСписокСПометками.Форма.ФормаПодбора" Тогда
  		
  		Для Каждого ВыбранныйДокумент Из ВыбранноеЗначение.ВыбранныеДокументы Цикл
  			НоваяСтрока = Объект.ДокументыЗаказов.Добавить();
  			НоваяСтрока.Документ = ВыбранныйДокумент.Документ;
  		КонецЦикла;
  		
  	КонецЕсли;
  	
  КонецПроцедуры
  
  &НаКлиенте
  Процедура ДокументНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
  	
  	СтандартнаяОбработка = Ложь;
  	
  	ТекущаяСтрока = Элементы.ДокументыЗаказов.ТекущиеДанные;
  		
  	ПараметрыОткрытия = Новый Структура;
  	ПараметрыОткрытия.Вставить("РежимЕдиничногоВыбора", Истина);
  	ПараметрыОткрытия.Вставить("ТекущийДокумент", ТекущаяСтрока.Документ);
  	ОткрытьФормуПодбора(ПараметрыОткрытия);
  		
  КонецПроцедуры
  
  &НаКлиенте
  Процедура ДокументОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
  	
  	СтандартнаяОбработка = Ложь;
  	
  	Если ВыбранноеЗначение = Неопределено Тогда
  		Возврат;
  	КонецЕсли;
  	
  	ТекущаяСтрока = Элементы.ДокументыЗаказов.ТекущиеДанные;
  	ТекущаяСтрока.Документ = ВыбранноеЗначение.ВыбранныеДокументы[0].Документ;
  	
  КонецПроцедуры
  
  #КонецОбласти
  
  #Область СлужебныеПроцедурыИФункции
  
  &НаКлиенте
  Процедура ОткрытьФормуПодбора(ПараметрыОткрытия = Неопределено)
  	
  	Если ПараметрыОткрытия = Неопределено Тогда
  		ПараметрыОткрытия = Новый Структура;
  	КонецЕсли;
  	
  	//++ Необязательное: для случаев когда нужно исключить уже подобранные
  	ИсключаемыеДокументы = Новый Массив;
  	Для Каждого СтрокаТаблицы Из Объект.ДокументыЗаказов Цикл
  		Если ЗначениеЗаполнено(СтрокаТаблицы.Документ) Тогда
  			ИсключаемыеДокументы.Добавить(СтрокаТаблицы.Документ);
  		КонецЕсли;
  	КонецЦикла;
  	ПараметрыОткрытия.Вставить("ИсключаемыеДокументы", ИсключаемыеДокументы);
  	//--
  	
  	ОткрытьФорму("ВнешняяОбработка.ДинамическийСписокСПометками.Форма.ФормаПодбора", 
  		ПараметрыОткрытия, ЭтаФорма, УникальныйИдентификатор,,,, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
  	
  КонецПроцедуры
  
  #КонецОбласти

З.Ы.: Ну а если вдруг, у кого-то возникнет непреодолимое желание очень поблагодарить автора, то он может скачать обработку с примером, лично я не против)). Там задействованы ссылки на типовой документ ЗаказКлиента. По идее, подойдет для любой конфигурации, где есть такой документ, и даже если его не окажется, всегда можно на любой другой переназначить.

Пользуйтесь на благо! Всем Радости и Добра!

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