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