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

01.02.16

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

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

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

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

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

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

 

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

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

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

 

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

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

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

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

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

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

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


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

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


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

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

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

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

динамический список выделение

См. также

Работа с интерфейсом Рабочее место Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Богатый редактор картинок 1С предназначен для обработки изображений в режиме «Предприятие», с возможностью РИСОВАТЬ на них. Поддерживается работа как в обычных формах (толстый клиент) так и на управляемых формах (тонкий клиент). Обработка позволяет редактировать как картинки, хранимые в базе, так и графические файлы с диска на файловой системе. Помимо базовых функций (изменение размеров, преобразование формата, обрезание картинки, повороты и т.п.) – редактор имеет богатый набор инструментов для рисования. Доступна функция вставки изображения из буфера обмена. Объект может быть использован: на стороне клиента, на стороне сервера, из внешнего соединения. Обработка будет особенно полезна тем, кто вносит картинки в базу (изображения номенклатуры, фотографии физических лиц и т.п.). Функционал реализуется с использованием JavaScript и бесплатного ПО ImageMagick (без использования внешних компонент).

6000 руб.

16.01.2015    62985    44    59    

82

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

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

2400 руб.

29.06.2020    18854    26    6    

41

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

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

1500 руб.

06.10.2020    10224    7    7    

10

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

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

20.08.2024    16796    mrXoxot    43    

121

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

Пример простого и симпатичного прогресс-бара в динамическом списке, без картинок, используя редактирование запроса.

27.05.2024    7349    smielka    37    

100

Работа с интерфейсом Платформа 1С v8.3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 Бесплатно (free)

Добавьте новогоднего настроения! Расширение создает декорацию в виде гирлянды на некоторых формах объектов.

27.12.2023    14787    913    elcoan    47    

117

Инструментарий разработчика Работа с интерфейсом Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

2 стартмани

10.04.2023    11913    162    acces969    31    

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

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

КоличествоСтрок = Элементы.Список.ВыделенныеСтроки.Количество(); 
		Счетчик = 0; 
		Для каждого Строка из Элементы.Список.ВыделенныеСтроки Цикл
			Счетчик = Счетчик + 1; 
			ТвояПроцедура(Строка);
			Состояние(""+Строка+ " "+Счетчик+" из "+КоличествоСтрок); 
			ОбработкаПрерыванияПользователя();
		КонецЦикла;
Показать
maXon777; bird21; cheiser1982; lextor; марксист; Anything; config; +7 Ответить
6. пользователь 09.04.18 01:34
Сообщение было скрыто модератором.
...
7. ledidinka 18.12.18 06:49 Сейчас в теме
Спасибо!
Сделала как в статье (для таблицы формы "Список" в процедуру СписокПриАктивизацииСтроки) - не понравился процесс "отметка - снятие отметки": при повторном нажатии на выбранную строку ранее установленная отметка на снимается.
Переназначила процедуру на событие таблицы формы "Выбор" - теперь по двойному щелчку мыши можно устанавливать - снимать галочку сколько угодно раз. (1С:Предприятие 8.3.12.1440)
8. katavy 20.09.19 13:49 Сейчас в теме
Спасибо! мне тоже очень пригодилось, очень удобный алгоритм!
Немного информации для новичков(сама такая), вдруг кому пригодится. При использовании в настройках списка основной таблицы в дин.списке, то лучше использовать только событие "ПриАктивацииСтроки". Ну а если основная таблица не указана, то удобнее использовать оба события дин.списка "Выбор" и "ПриАктивацииСтроки". Пользователям удобнее будет снимать\устанавливать флажки в текущей строке.
Только в "Выбор" лучше в процедуре такой алгоритм применить:
 Если Поле.Имя = "Флаг" Тогда
		ВыделенныйЭлемент = Элемент.ТекущиеДанные.[ВашаСсылка];
		ИндексСтрокиМассива = МассивВыбранныхСсылок.Найти(ВыделенныйЭлемент);
		Если ИндексСтрокиМассива = Неопределено Тогда			
			МассивВыбранныхСсылок.Добавить(ВыделенныйЭлемент);									
		Иначе    
			МассивВыбранныхСсылок.Удалить(ИндексСтрокиМассива);			
		КонецЕсли;		
		
		Список.Параметры.УстановитьЗначениеПараметра("МассивВыбранныхСсылок",МассивВыбранныхСсылок);	
	Иначе
		СтандартнаяОбработка = Ложь;
		ПоказатьЗначение(, Элемент.ТекущиеДанные.[ВашаСсылка]);
	КонецЕсли 
Показать


А в "ПриАктивацииСтроки" применить полностью алгоритм (процедуру) автора.

Тогда при двойном щелчке мыши по полю "Флаг" будет проходить выделение/снятие отметки, добавление в массив, а по остальным другим полям обычное открытие документа текущей строки списка.
9. valika 03.06.20 12:21 Сейчас в теме
СкомпоноватьНастройки - что там в этой процедуре?
10. Sardukar 58 04.06.20 09:42 Сейчас в теме
(9)
СкомпоноватьНастройки
Это типовая в УТ.
11. valika 08.06.20 10:17 Сейчас в теме
(10) спасибо, очень все понятно сразу стало, как хорошо что можно написать в коде не типовой не ут "так этож типовая ут" и 1Сочка сразу все поймет.

Нашла сама.
&НаСервере
Функция СкомпоноватьНастройки(СхемаКомпоновки) Экспорт

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

КонецФункции
Показать


Заодно и про макет фишечку вместо МакетКомпоновки = ОбщегоНазначенияУТ.ПолучитьМакетКомпоновки(СхемаКомпоновки, НастройкиКомпоновки);

КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновки, НастройкиКомпоновки,,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
Оставьте свое сообщение