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



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

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

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

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

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

 

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

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

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

 

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

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

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

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

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

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

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


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

&НаСервере
Функция ОтметитьВсеНаСервере(МассивВыбранныхСсылок)
//продублируем получение данных в динамический список
ТекстЗапроса = ПолучитьТекстЗапросаСписка();
СхемаКомпоновки = Новый СхемаКомпоновкиДанных();

Источник = СхемаКомпоновки.ИсточникиДанных.Добавить();
Источник.Имя = "Исток";
Источник.СтрокаСоединения="";
Источник.ТипИсточникаДанных = "local";

НаборДанных = СхемаКомпоновки.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
НаборДанных.Запрос = ТекстЗапроса;
НаборДанных.Имя = "Запрос";
НаборДанных.АвтоЗаполнениеДоступныхПолей = Истина;
НаборДанных.ИсточникДанных = "Исток";

НастройкиКомпоновки = МобильныеПриложения.СкомпоноватьНастройки(СхемаКомпоновки);

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


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

ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки);

ТЗ = Новый ТаблицаЗначений;

ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ПроцессорВывода.УстановитьОбъект(ТЗ);
ПроцессорВывода.НачатьВывод();

Пока Истина Цикл
ЭлементРезультатаКомпоновкиДанных = ПроцессорКомпоновкиДанных.Следующий();
Если ЭлементРезультатаКомпоновкиДанных = Неопределено Тогда
Прервать;
КонецЕсли;
ПроцессорВывода.ВывестиЭлемент(ЭлементРезультатаКомпоновкиДанных);
КонецЦикла;

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


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

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

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

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

7 Comments

  1. KiLLius

    Спасибо за пример.

    А что делать, если в списке не ссылки документов, а записи независимого РС? И необходимо их отметить и тоже групповую обработку провести.

    Reply
  2. Sardukar

    (1) KiLLius, так как набор всех измерений РС уникален для каждой строки, то по идее можно в запросе формировать уникальный идентификатор путем сложения измерений, преобразуя, например, сначала в строку их представление (или их уникальные реквизиты) и потом при выборе этот идентификатор загонять в МассивВыбранныхСсылок и соответственно в запросе для Отмечено проверять входит ли этот идентификатор в МассивВыбранныхСсылок . Это то что сразу в голову пришло.

    Reply
  3. igormiro

    Для вашей задачи мне не понятно:

    1) Почему вам не подошло условное оформление в Динамическом списке?

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

    Reply
  4. Sardukar

    (3) igormiro,

    1) если вы имеете в виду выделение цветом выбранной строки, то моему заказчику по душе галочки.

    2)Буду благодарен за пример.

    Reply
  5. Zircool

    Есть другой способ как работать с выделенными строками в динамическом списке.

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

    КоличествоСтрок = Элементы.Список.ВыделенныеСтроки.Количество();
    Счетчик = 0;
    Для каждого Строка из Элементы.Список.ВыделенныеСтроки Цикл
    Счетчик = Счетчик + 1;
    ТвояПроцедура(Строка);
    Состояние(«»+Строка+ » «+Счетчик+» из «+КоличествоСтрок);
    ОбработкаПрерыванияПользователя();
    КонецЦикла;
    

    Показать

    Reply
  6. ledidinka

    Спасибо!

    Сделала как в статье (для таблицы формы «Список» в процедуру СписокПриАктивизацииСтроки) — не понравился процесс «отметка — снятие отметки»: при повторном нажатии на выбранную строку ранее установленная отметка на снимается.

    Переназначила процедуру на событие таблицы формы «Выбор» — теперь по двойному щелчку мыши можно устанавливать — снимать галочку сколько угодно раз. (1С:Предприятие 8.3.12.1440)

    Reply
  7. katavyjob

    Спасибо! мне тоже очень пригодилось, очень удобный алгоритм!

    Немного информации для новичков(сама такая), вдруг кому пригодится. При использовании в настройках списка основной таблицы в дин.списке, то лучше использовать только событие «ПриАктивацииСтроки». Ну а если основная таблица не указана, то удобнее использовать оба события дин.списка «Выбор» и «ПриАктивацииСтроки». Пользователям удобнее будет сниматьустанавливать флажки в текущей строке.

    Только в «Выбор» лучше в процедуре такой алгоритм применить:

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

    Показать

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

    Тогда при двойном щелчке мыши по полю «Флаг» будет проходить выделение/снятие отметки, добавление в массив, а по остальным другим полям обычное открытие документа текущей строки списка.

    Reply

Leave a Comment

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