Приведу пример, как это делается в форме списка документов «Заказы клиентов».
Для начала в реквизитах формы находим «Список», который имеет тип «ДинамическийСписок». В его свойствах рядом с «Настройка списка» нажимаем «Открыть»
и добавляем в запрос перед «ИЗ» строку:
«,
Выбор Когда ДокументЗаказКлиента.Ссылка В (&МассивВыбранныхСсылок) ТОГДА ИСТИНА Иначе ЛОЖЬ КОНЕЦ КАК Отмечено».
После этого у вас в списке появится реквизит «Отмечено», который можете отразить на форме.
Затем правим модуль формы.
Добавляем переменные (у меня на основании выделенных будут создаваться реализации, отсюда переменная СоздаетсяРеализация, для себя сделаете что-то другое):
&НаКлиенте
Перем МассивВыбранныхСсылок;
&НаКлиенте
Перем ПерваяАктивизация;
&НаКлиенте
Перем СоздаетсяРеализация;
В процедуру ПриОткрытии() добавляем инициацию:
ПерваяАктивизация = Истина;
СоздаетсяРеализация = Ложь;
МассивВыбранныхСсылок=Новый Массив;
Список.Параметры.УстановитьЗначениеПараметра("МассивВыбранныхСсылок",МассивВыбранныхСсылок);
Затем для таблицы формы «Список» в процедуру СписокПриАктивизацииСтроки добавляем:
&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)
Если НЕ СоздаетсяРеализация Тогда
ДокСсылка = Элемент.ТекущиеДанные.Ссылка;
ИндексСтрокиМассива=МассивВыбранныхСсылок.Найти(ДокСсылка);
Если ИндексСтрокиМассива=Неопределено Тогда
Если НЕ ПерваяАктивизация Тогда
МассивВыбранныхСсылок.Добавить(ДокСсылка);
КонецЕсли;
Иначе
МассивВыбранныхСсылок.Удалить(ИндексСтрокиМассива);
КонецЕсли;
ПерваяАктивизация = Ложь;
Список.Параметры.УстановитьЗначениеПараметра("МассивВыбранныхСсылок",МассивВыбранныхСсылок);
КонецЕсли
КонецПроцедуры
Собственно все, но я знаю вам еще захочется сделать кнопки «Отметить все» и «Снять все отметки» :-). Ок, код ниже:
&НаКлиенте
Процедура СнятьВсеОтметки(Команда)
МассивВыбранныхСсылок.Очистить();
Список.Параметры.УстановитьЗначениеПараметра("МассивВыбранныхСсылок",МассивВыбранныхСсылок);
КонецПроцедуры
&НаКлиенте
Процедура ОтметитьВсе(Команда)
МассивВыбранныхСсылок = ОтметитьВсеНаСервере(МассивВыбранныхСсылок);
Список.Параметры.УстановитьЗначениеПараметра("МассивВыбранныхСсылок",МассивВыбранныхСсылок);
КонецПроцедуры
&НаСервере
Функция ОтметитьВсеНаСервере(МассивВыбранныхСсылок)
//продублируем получение данных в динамический список
ТекстЗапроса = ПолучитьТекстЗапросаСписка();
СхемаКомпоновки = Новый СхемаКомпоновкиДанных();
Источник = СхемаКомпоновки.ИсточникиДанных.Добавить();
Источник.Имя = "Исток";
Источник.СтрокаСоединения="";
Источник.ТипИсточникаДанных = "local";
НаборДанных = СхемаКомпоновки.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
НаборДанных.Запрос = ТекстЗапроса;
НаборДанных.Имя = "Запрос";
НаборДанных.АвтоЗаполнениеДоступныхПолей = Истина;
НаборДанных.ИсточникДанных = "Исток";
НастройкиКомпоновки = МобильныеПриложения.СкомпоноватьНастройки(СхемаКомпоновки);
ОбщегоНазначенияУТКлиентСервер.СкопироватьЭлементы(НастройкиКомпоновки.Отбор, Список.Отбор);
ОбщегоНазначенияУТКлиентСервер.СкопироватьЭлементы(НастройкиКомпоновки.Порядок, Список.Порядок);
ОбщегоНазначенияУТКлиентСервер.ЗаполнитьЭлементы(НастройкиКомпоновки.ПараметрыДанных, Список.Параметры);
МакетКомпоновки = ОбщегоНазначенияУТ.ПолучитьМакетКомпоновки(СхемаКомпоновки, НастройкиКомпоновки);
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки);
ТЗ = Новый ТаблицаЗначений;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ПроцессорВывода.УстановитьОбъект(ТЗ);
ПроцессорВывода.НачатьВывод();
Пока Истина Цикл
ЭлементРезультатаКомпоновкиДанных = ПроцессорКомпоновкиДанных.Следующий();
Если ЭлементРезультатаКомпоновкиДанных = Неопределено Тогда
Прервать;
КонецЕсли;
ПроцессорВывода.ВывестиЭлемент(ЭлементРезультатаКомпоновкиДанных);
КонецЦикла;
ПроцессорВывода.ЗакончитьВывод();
//теперь по полученной копии списка пометим все
Для каждого стр из ТЗ Цикл
ДокСсылка = стр.Ссылка;
ИндексСтрокиМассива=МассивВыбранныхСсылок.Найти(ДокСсылка);
Если ИндексСтрокиМассива=Неопределено Тогда
МассивВыбранныхСсылок.Добавить(ДокСсылка);
КонецЕсли;
КонецЦикла;
Возврат МассивВыбранныхСсылок;
КонецФункции
&НаСервере
Функция ПолучитьТекстЗапросаСписка()
Возврат Список.ТекстЗапроса;
КонецФункции
Ну и для примера создаем реализацию:
&НаКлиенте
Процедура СоздатьРеализацииДляОтмеченных(Команда)
СоздаетсяРеализация = Истина;
Для каждого стр из МассивВыбранныхСсылок цикл
//чо то делаем с ссылками
КонецЦикла;
СоздаетсяРеализация = Ложь;
КонецПроцедуры
Спасибо всем за внимание!
Спасибо за пример.
А что делать, если в списке не ссылки документов, а записи независимого РС? И необходимо их отметить и тоже групповую обработку провести.
(1) KiLLius, так как набор всех измерений РС уникален для каждой строки, то по идее можно в запросе формировать уникальный идентификатор путем сложения измерений, преобразуя, например, сначала в строку их представление (или их уникальные реквизиты) и потом при выборе этот идентификатор загонять в МассивВыбранныхСсылок и соответственно в запросе для Отмечено проверять входит ли этот идентификатор в МассивВыбранныхСсылок . Это то что сразу в голову пришло.
Для вашей задачи мне не понятно:
1) Почему вам не подошло условное оформление в Динамическом списке?
2) Выбор Когда ДокументЗаказКлиента.Ссылка В (&МассивВыбранныхСсылок) ТОГДА ИСТИНА Иначе ЛОЖЬ КОНЕЦ КАК Отмечено». МассивВыбранныхСсылок можно было получить вложенным запросом.
(3) igormiro,
1) если вы имеете в виду выделение цветом выбранной строки, то моему заказчику по душе галочки.
2)Буду благодарен за пример.
Есть другой способ как работать с выделенными строками в динамическом списке.
Элементы.Список.ВыделенныеСтроки — содержит массив выделенных строк.
Показать
Спасибо!
Сделала как в статье (для таблицы формы «Список» в процедуру СписокПриАктивизацииСтроки) — не понравился процесс «отметка — снятие отметки»: при повторном нажатии на выбранную строку ранее установленная отметка на снимается.
Переназначила процедуру на событие таблицы формы «Выбор» — теперь по двойному щелчку мыши можно устанавливать — снимать галочку сколько угодно раз. (1С:Предприятие 8.3.12.1440)
Спасибо! мне тоже очень пригодилось, очень удобный алгоритм!
Немного информации для новичков(сама такая), вдруг кому пригодится. При использовании в настройках списка основной таблицы в дин.списке, то лучше использовать только событие «ПриАктивацииСтроки». Ну а если основная таблица не указана, то удобнее использовать оба события дин.списка «Выбор» и «ПриАктивацииСтроки». Пользователям удобнее будет сниматьустанавливать флажки в текущей строке.
Только в «Выбор» лучше в процедуре такой алгоритм применить:
Показать
А в «ПриАктивацииСтроки» применить полностью алгоритм (процедуру) автора.
Тогда при двойном щелчке мыши по полю «Флаг» будет проходить выделение/снятие отметки, добавление в массив, а по остальным другим полям обычное открытие документа текущей строки списка.