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