Как реализовать подсветку акционного товара в форме подбора через расширение 1С?

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

В процессе работы с типовыми конфигурациями, такими как УТ 11, ERP или Комплексная автоматизация, часто возникает задача визуально выделить определенные позиции номенклатуры в окне подбора товаров. Например, менеджеру по продажам необходимо сразу видеть товары, участвующие в акции, чтобы предложить их клиенту. В данной статье мы подробно разберем, как реализовать такую подсветку с помощью расширения, используя дополнительные реквизиты и механизмы условного оформления динамического списка.

Постановка задачи и выбор метода

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

Способ 1: Изменение текста запроса динамического списка

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

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


&После("ПриСозданииНаСервере")
Процедура РА_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Модифицируем текст запроса для получения значения дополнительного реквизита
    ТекстЗапроса = СписокНоменклатура.ТекстЗапроса;
    
    // Добавляем поле в выборку
    ТекстЗапроса = СтрЗаменить(ТекстЗапроса, 
        "СправочникНоменклатура.Артикул КАК Артикул,", 
        "СправочникНоменклатура.Артикул КАК Артикул, ДопРеквизит.Значение КАК АкцияЗначение,");
    
    // Присоединяем таблицу дополнительных реквизитов
    ТекстЗапроса = СтрЗаменить(ТекстЗапроса, 
        "Справочник.Номенклатура КАК СправочникНоменклатура", 
        "Справочник.Номенклатура КАК СправочникНоменклатура 
        |ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК ДопРеквизит 
        |ПО (СправочникНоменклатура.Ссылка = ДопРеквизит.Ссылка) 
        |И (ДопРеквизит.Свойство.Заголовок = ""Акция"")");
        
    СписокНоменклатура.ТекстЗапроса = ТекстЗапроса;

    // Программное добавление невидимой колонки для использования в оформлении
    Если Элементы.Найти("АкцияЗначение") = Неопределено Тогда
        НовЭлемент = Элементы.Добавить("АкцияЗначение", Тип("ПолеФормы"), Элементы.СписокСтандартныйПоискНоменклатура);
        НовЭлемент.Вид = ВидПоляФормы.ПолеФлажка;
        НовЭлемент.ПутьКДанным = "СписокНоменклатура.АкцияЗначение";
        НовЭлемент.Видимость = Ложь; // Нам не нужно показывать саму колонку, только использовать её данные
    КонецЕсли;

    // Установка условного оформления
    УстановитьОформлениеАкций();
    
КонецПроцедуры

Важное предостережение: использование ЛЕВОЕ СОЕДИНЕНИЕ с табличной частью дополнительных реквизитов по заголовку — это рискованный метод. Если в системе окажется два свойства с одинаковым заголовком "Акция" или у одного товара по ошибке будет заполнено два значения этого свойства, в динамическом списке возникнет дублирование строк. Это приведет к ошибке «Обнаружено дублирование ключевых значений в колонке Ссылка».

Способ 2: Использование механизма условного оформления

После того как поле АкцияЗначение доступно в динамическом списке, нам нужно настроить само выделение цветом. Проанализируем, как правильно добавить элемент условного оформления программно:


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

Анализ проблем и оптимизация

Рассмотрим несколько критических моментов, которые часто возникают при реализации подобных задач через расширения.

  1. Проблема производительности. Прямое соединение в запросе динамического списка может замедлить работу подбора, если номенклатуры в базе очень много. Выясним причину: при каждом скроллинге система выполняет сложный стык таблиц. В качестве альтернативы можно использовать обработчик ПриПолученииДанныхНаСервере.
  2. Ошибка "Переменная не определена (СписокНоменклатура)". Если вы столкнулись с такой ошибкой в коде расширения, проверьте, добавлен ли сам реквизит формы СписокНоменклатура в ваше расширение. Также рекомендуется обращаться к нему через ЭтаФорма.СписокНоменклатура, чтобы исключить конфликты контекста.
  3. Встроенные возможности БСП. Проанализируем современный подход: в актуальных версиях конфигураций дополнительные реквизиты можно выводить в списки штатными средствами. В настройках самого дополнительного реквизита (в режиме 1С:Предприятие) есть флаг «Выводить в списках». Если его включить, поле автоматически появится в схеме компоновки данных динамического списка, и вам не придется вручную менять ТекстЗапроса через СтрЗаменить.

Рекомендованный метод: ПриПолученииДанныхНаСервере

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

Алгоритм действий следующий:

Такой подход исключает дублирование строк и значительно повышает отзывчивость интерфейса подбора товаров.

Подведем итог: для простой реализации достаточно модифицировать ТекстЗапроса и добавить УсловноеОформление, но всегда следует помнить о риске дублей при левом соединении с табличными частями. Если ваша конфигурация позволяет, используйте штатный механизм вывода доп. реквизитов в списки — это самый надежный и поддерживаемый путь.

← На главную