Как настроить отображение надписи характеристики не используются и убрать подчеркивание в табличной части?

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

При разработке собственных обработок загрузки данных или новых документов в среде 1С:Предприятие 8.3 (управляемые формы), программисты часто сталкиваются с задачей имитации стандартного поведения типовых конфигураций. Одной из таких задач является корректное отображение поля Характеристика. В типовых решениях, таких как 1С:Розница 2.2 или Управление торговлей 11, если для выбранной номенклатуры не ведется учет по характеристикам, ячейка не просто остается пустой, а выводит текст <характеристики не используются> и лишается красного подчеркивания (отметки незаполненного).

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

Разбор типичной ошибки: Данные против Оформления

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


Для каждого Строка из Объект.Товары Цикл
    Если Не Строка.Номенклатура.ИспользоватьХарактеристики Тогда
        Строка.Характеристика.ЦветТекста = WebЦвета.Серый; // ОШИБКА!
    КонецЕсли;
КонецЦикла;

Проанализируем ситуацию: в управляемом приложении 1С реализовано четкое разделение между данными (объектом на сервере или реквизитом формы) и их представлением (элементами формы). Реквизит Характеристика в строке таблицы — это ссылка на справочник или пустая ссылка. У ссылки нет и не может быть свойства ЦветТекста, Видимость или Текст. Все визуальные свойства принадлежат исключительно элементам формы.

Однако простое изменение свойства элемента формы Элементы.ТоварыХарактеристика.ТолькоПросмотр = Истина не решит задачу, так как это изменит состояние всей колонки для всех строк сразу. Чтобы изменить оформление конкретной ячейки в зависимости от условий строки, в 1С предусмотрен мощный механизм — Условное оформление формы.

Решение 1: Настройка условного оформления через конфигуратор

Это наиболее простой и быстрый способ, не требующий написания программного кода. Рассмотрим его по шагам:

  1. Откроем форму вашей обработки или документа в конфигураторе.
  2. Перейдем на вкладку Условное оформление (находится в нижней части окна редактора формы, рядом с вкладками «Реквизиты» и «Команды»).
  3. Добавим новый элемент оформления:
    • Оформление: Нажмем на кнопку выбора и установим значения для нужных параметров. Для нашей задачи выберем Текст и впишем туда <характеристики не используются>. Также установим параметр Отметка незаполненного в значение Ложь. Можно дополнительно установить Цвет текста (например, серый), чтобы надпись выглядела как подсказка.
    • Условие: Здесь мы определяем, когда оформление должно сработать. Нажмем «Добавить» и выберем поле Объект.Товары.Номенклатура.ИспользоватьХарактеристики (или аналогичный признак в вашей структуре). Вид сравнения — Равно, Значение — Ложь.
    • Оформляемые поля: Укажем колонку табличной части, к которой применится правило. В нашем случае это ТоварыХарактеристика.

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

Решение 2: Программное управление условным оформлением

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Очистим или добавим новое правило в коллекцию УсловноеОформление
    ЭлементОформления = УсловноеОформление.Элементы.Добавить();
    
    // 1. Что меняем (Оформление)
    ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Текст", "<характеристики не используются>");
    ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ОтметкаНезаполненного", Ложь);
    ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстВторостепеннойНадписи);
    ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
    
    // 2. Когда меняем (Условие)
    ЭлементУсловия = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементУсловия.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Номенклатура.ИспользоватьХарактеристики");
    ЭлементУсловия.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ЭлементУсловия.ПравоеЗначение = Ложь;
    
    // 3. Где меняем (Оформляемые поля)
    ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
    ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ТоварыХарактеристика");
    
КонецПроцедуры

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

Использование скрытых вспомогательных колонок для оптимизации

Выясним причину, по которой в сложных документах часто создают скрытую колонку ХарактеристикиИспользуются (тип Булево) прямо в табличной части. Если в условии оформления мы обращаемся через точку к реквизиту номенклатуры (Номенклатура.ИспользоватьХарактеристики), платформа вынуждена делать дополнительные неявные запросы к базе данных при каждой отрисовке строки. Для больших табличных частей это может привести к замедлению интерфейса.

Рассмотрим более производительный подход:

  1. Добавим в табличную часть Товары реквизит ХарактеристикиИспользуются (Булево).
  2. На форме для этого элемента установим свойство Видимость = Ложь.
  3. В процедуре ПриИзмененииНоменклатуры будем заполнять этот реквизит:
    
    &НаКлиенте
    Процедура ТоварыНоменклатураПриИзменении(Элемент)
        СтрокаТаблицы = Элементы.Товары.ТекущиеДанные;
        // Получаем признак использования характеристик (через серверный вызов или кэш)
        СтрокаТаблицы.ХарактеристикиИспользуются = ПолучитьПризнакХарактеристик(СтрокаТаблицы.Номенклатура);
    КонецПроцедуры
    
  4. В условном оформлении в качестве условия укажем поле самой таблицы: Объект.Товары.ХарактеристикиИспользуются = Ложь.

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

Работа с подсказкой ввода

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

Таким образом, мы выяснили, что ключ к решению задачи лежит не в программном переборе строк, а в декларативном описании правил оформления формы. Используя эти методы, вы сможете создавать интерфейсы, которые будут привычны и удобны пользователям программ 1С.

← На главную