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

01.02.16

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

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

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

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

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

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

 

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

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

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

 

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

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

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

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

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

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

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


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

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


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

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

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

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

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

См. также

Богатый редактор картинок, хранимых в базе, с возможностью РИСОВАНИЯ. Редактор внешних файлов картинок. Объект, расширяющий возможности работы с картинками из встроенного языка (Три в одном) + Обработка «Стандартизация картинок»

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

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

6000 руб.

16.01.2015    61792    43    59    

80

[Расширения] Динамическое управление видимостью и доступностью элементов форм (УФ) (8.3.6+)

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

Механизм «Динамическое управление доступом к элементам форм объектов 1С8» предназначен для обеспечения возможности оперативного управления видимостью и доступностью элементов форм документов и справочников продуктов фирмы «1С» «1С:Предприятие 8». Решение универсальное, встраивается в любую конфигурацию с минимальными доработками, что позволяет без проблем обновлять типовые решения.

5000 руб.

14.01.2016    54394    16    21    

42

Управление дашбордами

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

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

2400 руб.

29.06.2020    16695    21    4    

35

Новогоднее оформление для 1С

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

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

27.12.2023    10732    750    elcoan    45    

106

Конструктор HTML, CSS и javascript

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

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

2 стартмани

10.04.2023    9606    151    acces969    31    

118

Модель состояния для MVC

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

"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.

1 стартмани

05.07.2022    3663    kalyaka    2    

27

Табло очереди заказов на экран телевизора

WEB-интеграция Работа с интерфейсом Платформа 1С v8.3 1С:Розница 2 Платные (руб)

Связка из веб-приложения и расширения для 1С: Розница 2.3.

3600 руб.

29.04.2022    12077    1    5    

10
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
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 190 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Сочка сразу все поймет.

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

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

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


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

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