Как реализовать подсветку выбранных позиций и синхронизацию строк в динамическом списке?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке удобных интерфейсов подбора в системе «1С:Предприятие 8.3» часто возникает задача визуального выделения тех позиций, которые пользователь уже перенес в документ. Это критически важно для предотвращения дублирования строк и общего удобства работы. Кроме того, качественный механизм подбора требует синхронного позиционирования: если пользователь выбирает товар в списке «Выбранное», курсор в основном списке должен автоматически переходить на эту же позицию. Разберем пошагово, как реализовать эти механизмы в управляемых формах.

Реализация визуального выделения через условное оформление и параметры запроса

Первая задача — подсветить строки в основном динамическом списке (ДС), которые уже присутствуют в таблице выбранных товаров. Самый простой путь — использование Условного оформления, но ключевой вопрос заключается в том, как передать данные о выбранных позициях в динамический список.

Рассмотрим наиболее производительный метод — использование вычисляемого поля непосредственно в тексте запроса динамического списка. Это позволит нам избежать сложного анализа коллекции на стороне клиента. Проанализируем пример модификации запроса ДС:


ВЫБРАТЬ
    СправочникНоменклатура.Ссылка КАК Ссылка,
    СправочникНоменклатура.Наименование КАК Наименование,
    ВЫБОР
        КОГДА СправочникНоменклатура.Ссылка В (&МассивВыбранных) ТОГДА ИСТИНА
        ИНАЧЕ ЛОЖЬ
    КОНЕЦ КАК ЭтоВыбранныйТовар
ИЗ
    Справочник.Номенклатура КАК СправочникНоменклатура

В данном примере мы добавили поле ЭтоВыбранныйТовар. Теперь в настройках динамического списка на форме (вкладка «Условное оформление») мы можем задать правило: если ЭтоВыбранныйТовар равно Истина, то устанавливаем цвет фона или цвет текста для строки.

Однако список не обновится сам по себе при добавлении товара. Выясним, как заставить ДС «перерисоваться». Для этого необходимо обновлять параметр МассивВыбранных при каждом изменении состава выбранных товаров (например, в обработчиках ПослеЗаписи или при нажатии кнопки выбора). Пропишем следующий код:


// Получаем массив ссылок из таблицы выбранных товаров
МассивСсылок = Объект.Товары.ВыгрузитьКолонку("Номенклатура");

// Устанавливаем параметр в динамический список
Элементы.СписокПодбора.Период.УстановитьЗначениеПараметра("МассивВыбранных", МассивСсылок);

Важный нюанс: если массив содержит тысячи элементов, запрос может начать работать медленно. В таких случаях рекомендуется использовать временные таблицы, но так как ДС накладывает ограничения на работу с ВТ, альтернативой может стать использование признака во временном регистре сведений, если подбор является сложным и длительным процессом.

Синхронизация позиционирования курсора между списками

Вторая часть задачи — сделать так, чтобы при пролистывании списка выбранных товаров основной список подбора «прыгал» на соответствующую строку. Рассмотрим, как это реализовать программно, используя свойство ТекущаяСтрока.

Для реализации нам понадобится событие ПриАктивизацииСтроки у таблицы, в которой отображаются уже выбранные товары. Разберем программную логику:


&НаКлиенте
Процедура ВыбранныеТоварыПриАктивизацииСтроки(Элемент)
    
    ТекущиеДанные = Элементы.ВыбранныеТовары.ТекущиеДанные;
    
    Если ТекущиеДанные <> Неопределено Тогда
        // Позиционируем основной список на выбранной номенклатуре
        Элементы.СписокПодбора.ТекущаяСтрока = ТекущиеДанные.Номенклатура;
    КонецЕсли;
    
КонецПроцедуры

Посмотрим на ситуацию с обратной стороны: что если мы хотим, чтобы при перемещении по основному списку подсвечивалась строка в выбранных товарах? Здесь кроется опасность рекурсивного вызова. Если оба списка будут пытаться активизировать друг друга, система может войти в бесконечный цикл или начать «моргать» интерфейсом.

Чтобы этого избежать, проанализируем использование флага блокировки синхронизации. В модуле формы объявим переменную:


&НаКлиенте
Перем мБлокировкаСинхронизации;

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

Оптимизация UX: Иконки и задержка обновления

Рассмотрим профессиональные приемы, которые сделают подбор еще более качественным. Сплошная заливка цветом часто мешает чтению текста. Вместо этого попробуем использовать картинки строк.

В запросе динамического списка можно вычислить индекс картинки. Например, если товар выбран — выводить иконку «галочки». В свойствах таблицы на форме установите ПутьКДаннымКартинкиСтроки, указав на созданное в запросе поле. Это выглядит гораздо эстетичнее и не перегружает зрение пользователя.

Также проанализируем проблему производительности при быстром добавлении товаров. Если при каждом клике вызывать установку параметров ДС, интерфейс может «подтормаживать» из-за постоянных запросов к серверу. Решением станет использование обработчика ожидания:

  1. При добавлении товара в список выбранных мы не обновляем ДС сразу.
  2. Вместо этого вызываем ПодключитьОбработчикОжидания("ОбновитьПодсветкуПодбора", 0.5, Истина).
  3. Если пользователь кликает быстро, обработчик переподключается, и реальное обновление параметров ДС произойдет только после паузы в 0.5 секунды.

Выясним причину, почему это эффективно: СУБД получает один тяжелый запрос после завершения активных действий пользователя, а не десяток мелких запросов подряд. Это существенно повышает отзывчивость интерфейса, особенно в условиях работы через тонкий клиент с нестабильным интернетом.

Таким образом, комбинируя программную установку параметров запроса, условное оформление по вычисляемым полям и грамотное управление событием ПриАктивизацииСтроки, мы получаем надежный и быстрый механизм подбора, отвечающий современным требованиям к UI/UX на платформе 1С.

← На главную