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

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

Анализ задачи и архитектурные особенности

Рассмотрим распространенную практическую задачу: необходимо подсветить цветом (например, красным) строки в списке номенклатуры, у которых значение дополнительного реквизита булева типа равно Истина.

В типовых конфигурациях 1С (таких как «1С:ERP Управление предприятием») дополнительные реквизиты хранятся в табличной части ДополнительныеРеквизиты справочника Номенклатура. Так как это поле не является базовым реквизитом объекта, его необходимо вывести в динамический список путем доработки текста запроса основной схемы списка с последующей передачей параметра свойства.

Шаг 1. Модификация запроса динамического списка

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

Чтобы избежать дублирования строк в случае наличия нескольких схожих записей, во вложенном запросе следует применять группировку или производить точечное соединение по конкретному свойству.

Посмотрим на пример запроса с левым соединением с табличной частью:


ВЫБРАТЬ
	СпрНоменклатура.Ссылка КАК Ссылка,
	СпрНоменклатура.Код КАК Код,
	СпрНоменклатура.Наименование КАК Наименование,
	СпрНоменклатура.Артикул КАК Артикул,
	СпрНоменклатура.ВидНоменклатуры КАК ВидНоменклатуры,
	СпрНоменклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
	СпрНоменклатура.СтавкаНДС КАК СтавкаНДС,
	СпрНоменклатура.Родитель КАК Родитель,
	ЕСТЬNULL(ДопРеквизит.Значение, ЛОЖЬ) КАК ФлагВыделения
ИЗ
	Справочник.Номенклатура КАК СпрНоменклатура
	ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК ДопРеквизит
		ПО СпрНоменклатура.Ссылка = ДопРеквизит.Ссылка
		И (ДопРеквизит.Свойство = &СвойствоФлага)
ГДЕ
	НЕ СпрНоменклатура.ЭтоГруппа

Также можно использовать вариант со вложенным запросом и агрегатной функцией:


ВЫБРАТЬ
	СпрНоменклатура.Ссылка КАК Ссылка,
	СпрНоменклатура.Наименование КАК Наименование,
	ЕСТЬNULL(ВложенныйЗапрос.Значение, ЛОЖЬ) КАК ФлагВыделения
ИЗ
	Справочник.Номенклатура КАК СпрНоменклатура
	ЛЕВОЕ СОЕДИНЕНИЕ (
		ВЫБРАТЬ
			НоменклатураДопРекв.Ссылка КАК Ссылка,
			МАКСИМУМ(НоменклатураДопРекв.Значение) КАК Значение
		ИЗ
			Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДопРекв
		ГДЕ
			НоменклатураДопРекв.Свойство = &СвойствоФлага
		ГРУППИРОВАТЬ ПО
			НоменклатураДопРекв.Ссылка
	) КАК ВложенныйЗапрос
		ПО СпрНоменклатура.Ссылка = ВложенныйЗапрос.Ссылка
ГДЕ
	НЕ СпрНоменклатура.ЭтоГруппа

Шаг 2. Передача параметра в динамический список

Проанализируем процесс установки значения параметра СвойствоФлага. Параметр должен передавать ссылку на нужный элемент плана видов характеристик ДополнительныеРеквизитыИСведения.

Установку параметра выполняем в программном модуле формы в обработчике события ПриСозданииНаСервере:


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

КонецПроцедуры

Шаг 3. Настройка условного оформления

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

Посмотрим на пример программной настройки условного оформления:


&НаСервере
Процедура НастроитьУсловноеОформление()

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

КонецПроцедуры

Важные замечания по производительности и архитектуре

Выясним возможные нюансы работы данного решения на реальных базах данных:

  1. Производительность СУБД: Прямое соединение динамического списка с табличной частью объемного справочника может вызвать снижения скорости считывания данных. В крупных базах это может проявляться в задержках при прокрутке списка.
  2. Доработка без снятия с поддержки: Если конфигурация находится на типовой поддержке, изменение текста запроса и установку параметров рекомендуется производить через расширение конфигурации в обработчике &После("ПриСозданииНаСервере").
  3. Использование регистров сведений: Если требуется частый анализ признака без нагрузки на табличную часть справочника, альтернативным решением является хранение признака в отдельном регистре сведений (например, механизмом дополнительных сведений).
← На главную