В процессе работы с типовыми конфигурациями, такими как УТ 11, ERP или Комплексная автоматизация, часто возникает задача визуально выделить определенные позиции номенклатуры в окне подбора товаров. Например, менеджеру по продажам необходимо сразу видеть товары, участвующие в акции, чтобы предложить их клиенту. В данной статье мы подробно разберем, как реализовать такую подсветку с помощью расширения, используя дополнительные реквизиты и механизмы условного оформления динамического списка.
Предположим, у нас есть дополнительный реквизит номенклатуры с названием "Акция" (тип Булево). Нам необходимо, чтобы в форме ПодборТоваровВДокументПродажи строки с такими товарами подсвечивались определенным цветом (например, бледно-зеленым). Рассмотрим поэтапно, как это реализовать, проанализируем возможные ошибки и найдем наиболее оптимальный путь.
Для начала рассмотрим вариант, когда мы напрямую модифицируем запрос динамического списка в обработчике ПриСозданииНаСервере. Это позволяет «вытащить» значение дополнительного реквизита непосредственно в выборку данных списка.
Разберем пример кода, который необходимо добавить в модуль формы расширения:
&После("ПриСозданииНаСервере")
Процедура РА_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Модифицируем текст запроса для получения значения дополнительного реквизита
ТекстЗапроса = СписокНоменклатура.ТекстЗапроса;
// Добавляем поле в выборку
ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
"СправочникНоменклатура.Артикул КАК Артикул,",
"СправочникНоменклатура.Артикул КАК Артикул, ДопРеквизит.Значение КАК АкцияЗначение,");
// Присоединяем таблицу дополнительных реквизитов
ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
"Справочник.Номенклатура КАК СправочникНоменклатура",
"Справочник.Номенклатура КАК СправочникНоменклатура
|ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК ДопРеквизит
|ПО (СправочникНоменклатура.Ссылка = ДопРеквизит.Ссылка)
|И (ДопРеквизит.Свойство.Заголовок = ""Акция"")");
СписокНоменклатура.ТекстЗапроса = ТекстЗапроса;
// Программное добавление невидимой колонки для использования в оформлении
Если Элементы.Найти("АкцияЗначение") = Неопределено Тогда
НовЭлемент = Элементы.Добавить("АкцияЗначение", Тип("ПолеФормы"), Элементы.СписокСтандартныйПоискНоменклатура);
НовЭлемент.Вид = ВидПоляФормы.ПолеФлажка;
НовЭлемент.ПутьКДанным = "СписокНоменклатура.АкцияЗначение";
НовЭлемент.Видимость = Ложь; // Нам не нужно показывать саму колонку, только использовать её данные
КонецЕсли;
// Установка условного оформления
УстановитьОформлениеАкций();
КонецПроцедуры
Важное предостережение: использование ЛЕВОЕ СОЕДИНЕНИЕ с табличной частью дополнительных реквизитов по заголовку — это рискованный метод. Если в системе окажется два свойства с одинаковым заголовком "Акция" или у одного товара по ошибке будет заполнено два значения этого свойства, в динамическом списке возникнет дублирование строк. Это приведет к ошибке «Обнаружено дублирование ключевых значений в колонке Ссылка».
После того как поле АкцияЗначение доступно в динамическом списке, нам нужно настроить само выделение цветом. Проанализируем, как правильно добавить элемент условного оформления программно:
Процедура УстановитьОформлениеАкций()
Элемент = УсловноеОформление.Элементы.Добавить();
// Определяем, какое поле будем раскрашивать (например, наименование)
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных("СписокСтандартныйПоискНоменклатураНаименование");
// Настраиваем условие: АкцияЗначение = Истина
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СписокНоменклатура.АкцияЗначение");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Истина;
// Устанавливаем цвет фона
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.БледноЗеленый);
КонецПроцедуры
Рассмотрим несколько критических моментов, которые часто возникают при реализации подобных задач через расширения.
ПриПолученииДанныхНаСервере.СписокНоменклатура в ваше расширение. Также рекомендуется обращаться к нему через ЭтаФорма.СписокНоменклатура, чтобы исключить конфликты контекста.ТекстЗапроса через СтрЗаменить.Для максимально быстрой и корректной работы, особенно в высоконагруженных системах, лучше использовать обработчик ПриПолученииДанныхНаСервере. Этот метод позволяет дозаполнить данными только те строки, которые в данный момент отображаются на экране пользователя (обычно это 30-40 строк), а не пересчитывать весь запрос для тысяч позиций.
Алгоритм действий следующий:
ПриПолученииДанныхНаСервере для таблицы списка.Строки.Такой подход исключает дублирование строк и значительно повышает отзывчивость интерфейса подбора товаров.
Подведем итог: для простой реализации достаточно модифицировать ТекстЗапроса и добавить УсловноеОформление, но всегда следует помнить о риске дублей при левом соединении с табличными частями. Если ваша конфигурация позволяет, используйте штатный механизм вывода доп. реквизитов в списки — это самый надежный и поддерживаемый путь.