Как реализовать выделение выбранных строк в форме подбора 1С

Программист IT и автоматизация бизнеса
← На главную

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

Анализ задачи и выбор подхода

Рассмотрим стандартную ситуацию: у нас есть форма документа с табличной частью Товары и кнопка "Подбор", вызывающая форму выбора справочника. Нам необходимо, чтобы после нажатия кнопки "Выбрать" (или при двойном клике) в форме подбора строка окрашивалась в зеленый цвет или помечалась флажком. Основная сложность заключается в том, что форма подбора часто строится на ДинамическомСписке, данные в котором напрямую не редактируются. Следовательно, мы не можем просто изменить свойство ячейки "на лету".

Проанализируем два основных способа решения:

  1. Использование вычисляемого поля в запросе с последующим обновлением параметров списка.
  2. Программная настройка Условного оформления формы для управления цветом фона или шрифта.

Способ 1. Модификация запроса динамического списка (Флажки)

Этот метод считается наиболее стабильным и простым в реализации. Суть заключается в том, чтобы заставить базу данных саму определять, входит ли текущая строка в список уже выбранных товаров.

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


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

Теперь в динамическом списке появилось новое поле Добавлено типа Булево. Вынесем его на форму. Чтобы оно выглядело как иконка или флажок, можно отключить текст заголовка и настроить отображение в виде картинки.

Далее нам необходимо реализовать логику обновления этого списка при выборе товара. Разберем код в модуле формы выбора:


&НаКлиенте
Перем ВыбраннаяНоменклатура; // Массив для хранения ссылок в памяти клиента

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

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

    // Добавляем выбранную номенклатуру в наш массив
    ПоставитьПометку(ТекущиеДанные.Ссылка);
    
    // Обновляем параметр динамического списка
    Список.Параметры.УстановитьЗначениеПараметра("ВыбраннаяНоменклатура", ВыбраннаяНоменклатура);
    
    // Принудительно обновляем отображение списка
    Элементы.Список.Обновить();
КонецПроцедуры

&НаКлиенте
Процедура ПоставитьПометку(Номенклатура)
    Индекс = ВыбраннаяНоменклатура.Найти(Номенклатура);
    Если Индекс = Неопределено Тогда
        ВыбраннаяНоменклатура.Добавить(Номенклатура);
    КонецЕсли;
КонецПроцедуры

Способ 2. Реализация цветовой индикации через Условное оформление

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

Рассмотрим пример кода, который добавит правило оформления для всей строки:


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

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

Продвинутые приемы и оптимизация

Разберем несколько важных моментов, которые помогут сделать ваш подбор профессиональным и надежным.

1. Передача уже выбранных товаров при открытии. Проанализируем ситуацию: пользователь уже добавил 5 позиций, закрыл подбор, а потом открыл его снова. Чтобы ранее выбранные товары сразу подсветились, необходимо передать их из документа в форму выбора. В форме документа при вызове ОткрытьФорму передавайте массив ссылок в структуре параметров:


ПараметрыПодбора = Новый Структура;
ПараметрыПодбора.Вставить("ВыбранныеТовары", Объект.Товары.ВыгрузитьКолонку("Товар"));
ОткрытьФорму("Справочник.ТоварыИУслуги.ФормаВыбора", ПараметрыПодбора, ЭтаФорма);

В форме выбора в процедуре ПриСозданииНаСервере считайте этот параметр и сразу установите его в параметр запроса Список.Параметры.УстановитьЗначениеПараметра("ВыбраннаяНоменклатура", ...).

2. Использование временного хранилища. Если количество товаров в документе исчисляется тысячами, передача огромного массива через параметры структуры может вызвать задержки в работе интерфейса. В таких случаях рекомендуется поместить массив во ВременноеХранилище, а в форму подбора передавать только Адрес этого хранилища. Это оптимизирует передачу данных между сервером и клиентом.

3. Иерархия справочника. Выясним причину, по которой папки могут не подсвечиваться. Запрос Ссылка В (&Массив) работает только для конкретных ссылок. Если вы хотите, чтобы папка тоже подсвечивалась (например, если внутри нее есть выбранный товар), потребуется значительно усложнить запрос с использованием соединений, что может негативно сказаться на производительности. Для большинства задач подбора достаточно подсветки самих элементов.

4. Метод Обновить(). Проанализируем использование Элементы.Список.Обновить(). В последних версиях платформы 8.3 динамический список зачастую автоматически реагирует на изменение параметров запроса. Если вы заметили, что список обновляется слишком медленно, попробуйте обойтись только установкой параметра — платформа сама инициирует перерисовку в ближайший свободный такт.

Заключение

Мы рассмотрели комплексный подход к визуализации процесса подбора. Комбинируя произвольный запрос динамического списка и условное оформление, можно создать отзывчивый и понятный интерфейс. Помните, что хранить данные о раскраске в базе данных не нужно — достаточно передавать актуальный список выбранных товаров между формами в процессе работы пользователя.

← На главную