Использование флажков в динамических списках
В статье расскажу как в динамических списках можно использовать поле флажка для отметки строк. Используемый прием можно использовать не только для галочек, но и для любого поля ввода. Несмотря на то, что редактирование динамических списков напрямую невозможно, есть способ обойти платформу. Подробности в публикации.
- Описание
- Подробнее
Описание
Итак, исходные данные:
Для примера нам понадобится любая конфигурация (хоть созданная с нуля) со справочником "Номенклатура". Остальное не важно.
Подготавливаем галочки. К слову, они могут быть любыми, если вам не нравятся стандартные флажки создайте свои. Главное, чтобы первой стояла картинка с флажком, а потом уже без флажка. У меня получился вот такой файл:
Создаем внешнюю обработку. Размещаем на ней реквизит с типом "Динамический список" и устанавливаем галочку "Произвольный запрос"
Нажимаем на "Открыть" рядом с настройкой списка и устанавливаем запрос. Запрос выглядит следующим образом:
ВЫБРАТЬ
Номенклатура.Ссылка,
Номенклатура.Ссылка В (&ВыбраннаяНоменклатура) КАК Пометка
ИЗ
Справочник.Номенклатура КАК Номенклатура
Добавляем на форму список и его реквизиты "Пометка", "Ссылка"
В поле "Пометка" устанавливаем следующие свойства элемента:
- Вид — Поле картинки
- Положение заголовка — Нет
- Картинка значений — Наша картинка с галочками
- Гиперссылка ячейки — Да
Для элемента формы "Список" установите событие "Выбор" с названием процедуры "СписокВыбор".
Скопируйте код ниже в модуль формы:
&НаКлиенте
Перем ВыбраннаяНоменклатура; //Массив, хранящий отмеченную галочками номенклатуру для отображения в списке
&НаКлиенте
Процедура ПриОткрытии(Отказ)
//Инициализация массива
ВыбраннаяНоменклатура = Новый Массив;
//Без параметра, даже пустого, список выдаст ошибку и будет прав
Список.Параметры.УстановитьЗначениеПараметра("ВыбраннаяНоменклатура", ВыбраннаяНоменклатура);
КонецПроцедуры
&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
//Нас интересует только событие нажатия на чекбокс
Если Поле = Элементы.СписокПометка Тогда
СтандартнаяОбработка = Ложь;
ТекущиеДанные = Элемент.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено Тогда
Если ТекущиеДанные.Пометка Тогда
СнятьПометку(ТекущиеДанные.Ссылка);
Иначе
ПоставитьПометку(ТекущиеДанные.Ссылка);
КонецЕсли;
КонецЕсли;
КонецЕсли;
//Параметр в динамическом списке нужно обновить
Список.Параметры.УстановитьЗначениеПараметра("ВыбраннаяНоменклатура", ВыбраннаяНоменклатура);
Элементы.Список.Обновить();
КонецПроцедуры
&НаКлиенте
Процедура СнятьПометку(Номенклатура)
Индекс = ВыбраннаяНоменклатура.Найти(Номенклатура);
Если Индекс >= 0 Тогда
ВыбраннаяНоменклатура.Удалить(Индекс);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПоставитьПометку(Номенклатура)
Индекс = ВыбраннаяНоменклатура.Найти(Номенклатура);
Если Индекс = Неопределено Тогда
ВыбраннаяНоменклатура.Добавить(Номенклатура);
КонецЕсли;
КонецПроцедуры
Поздравляю, теперь в вашем динамическом списке есть галочки!
А теперь как всё это работает.
Особенностью динамических списков является невозможность ввода данных непосредственно в список. Когда-то раньше такая возможность была, но нас ее лишили по техническим причинам. Поэтому вся информация, которая отображается в динамическом списке не может редактироваться и получается запросом.