Как добавить отступ или пробелы перед текстом в условном оформлении управляемой формы 1С?

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

Разработчики при проектировании интерфейсов на управляемых формах часто сталкиваются с задачей визуального выделения строк табличной части. Например, требуется визуально отобразить подчиненность элементов, добавив несколько пробелов (отступ) перед наименованием или артикулом номенклатуры при выполнении определенного условия (например, если строка является группой или подчиненным элементом).

Первое очевидное решение, которое приходит на ум — использовать механизм Условного оформления (УО) управляемой формы и программно установить параметр оформления Текст. Однако при попытке реализовать это «в лоб» разработчики сталкиваются со странным поведением платформы: вместо значения поля с пробелом на экране отображается служебное наименование самого поля компоновки данных. Давайте подробно разберем, почему так происходит, и какие существуют эффективные и красивые способы обхода этого ограничения.

Выясняем причину: почему стандартный код не работает?

Рассмотрим типичный пример кода, который часто пытаются написать разработчики для решения этой задачи:


ЭлементОформления = УсловноеОформление.Элементы.Добавить();

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

// Указываем оформляемое поле таблицы
ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
ПолеОформления.Pole = Новый ПолеКомпоновкиДанных("ТоварыАртикул");

// Попытка задать текст с отступом (пробелами)
ПолеТекста = Новый ПолеКомпоновкиДанных("Объект.Товары.Артикул");
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Текст", "   " + ПолеТекста);

После запуска этого кода вместо ожидаемого отступа и значения артикула (например, " ART-12345") в колонке таблицы отобразится текст: " Объект.Товары.Артикул".

Почему так происходит?

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

  1. Статическое значение (строка, число, дата), которое будет жестко выведено во всех ячейках, подходящих под отбор.
  2. Объект типа ПолеКомпоновкиДанных, указывающий на конкретный реквизит строки. В этом случае платформа динамически берет значение из этого реквизита для каждой строки при отрисовке на клиенте.

Когда мы пишем выражение " " + ПолеТекста, на сервере происходит обычная конкатенация (сложение) строк. Так как вторым слагаемым выступает объект типа ПолеКомпоновкиДанных, среда исполнения 1С неявно преобразует его в строку, вызывая получение его строкового представления. Строковым представлением объекта ПолеКомпоновкиДанных является путь к данным в виде текста — "Объект.Товары.Артикул". В результате в параметр условного оформления записывается статическая строка " Объект.Товары.Артикул", которую платформа и выводит на экран.

В управляемых формах (в отличие от полноценной Системы компоновки данных в отчетах) отсутствует интерпретатор выражений для условного оформления. Платформа не умеет «на лету» вычислять выражения вида «сложить строку и значение поля» при выводе строк таблицы.

Также отметим, что в оформлении ячеек таблицы управляемой формы, в отличие от СКД, отсутствует параметр Отступ, поэтому решить задачу простым изменением свойств оформления тоже не получится.

---

Вариант решения А: Создание вычисляемой колонки на форме (Рекомендуемый)

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

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

Рассмотрим реализацию этого метода по шагам:

Шаг 1. Создание реквизита формы

В редакторе управляемой формы перейдите на вкладку «Реквизиты». Найдите вашу табличную часть (например, Товары) и добавьте в нее новый реквизит. Назовем его АртикулДляВывода, тип данных — Строка (длину укажите с запасом, например, 150 символов).

Шаг 2. Размещение на форме

Перетащите созданный реквизит АртикулДляВывода в элементы таблицы формы. В свойствах добавленного элемента установите флажок ТолькоПросмотр = Истина. Исходную колонку Артикул скройте с формы, сняв у нее флажок Видимость (или удалив элемент из дерева элементов формы, при этом сам реквизит в данных ТЧ должен остаться).

Шаг 3. Заполнение данных при открытии формы

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Заполняем вычисляемую колонку при открытии формы
    Для Каждого СтрокаТЧ Из Объект.Товары Цикл
        ЗаполнитьАртикулСОтступом(СтрокаТЧ);
    КонецЦикла;
    
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ЗаполнитьАртикулСОтступом(ТекущаяСтрока)
    
    // Проверяем условие, по которому нужен отступ
    Если ТекущаяСтрока.ЭлементГруппы Тогда
        ТекущаяСтрока.АртикулДляВывода = "   " + ТекущаяСтрока.Артикул;
    Иначе
        ТекущаяСтрока.АртикулДляВывода = ТекущаяСтрока.Артикул;
    КонецЕсли;
    
КонецПроцедуры

Шаг 4. Поддержание актуальности данных при изменении

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

Создадим обработчик события ПриИзменении для поля Артикул (если оно редактируется) или для всей таблицы в событии ПриАктивизацииСтроки / ПередНачаломДобавления. Самым правильным решением будет вызов расчета при изменении ключевых реквизитов строки:


&НаКлиенте
Процедура ТоварыАртикулПриИзменении(Элемент)
    
    ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
    Если ТекущаяСтрока <> Неопределено Тогда
        // Выполняем аналогичный расчет на клиенте
        Если ТекущаяСтрока.ЭлементГруппы Тогда
            ТекущаяСтрока.АртикулДляВывода = "   " + ТекущаяСтрока.Артикул;
        Иначе
            ТекущаяСтрока.АртикулДляВывода = ТекущаяСтрока.Артикул;
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

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

---

Вариант решения Б: Форматирование на уровне запроса (для Динамических списков и отчетов)

Если ваша таблица на форме является результатом запроса (например, это Динамический список документов/справочников или таблица значений, формируемая программно в отчете или обработке), то добавлять пробелы проще и эффективнее всего непосредственно в самом тексте запроса.

Рассмотрим, как изменить запрос динамического списка для автоматического добавления отступа:


ВЫБРАТЬ
    СправочникНоменклатура.Ссылка КАК Ссылка,
    СправочникНоменклатура.Код КАК Код,
    СправочникНоменклатура.Артикул КАК Артикул,
    ВЫБОР
        КОГДА СправочникНоменклатура.ЭтоГруппа = ИСТИНА
            ТОГДА СправочникНоменклатура.Наименование
        ИНАЧЕ "   " + СправочникНоменклатура.Наименование
    КОНЕЦ КАК НаименованиеДляВывода
ИЗ
    Справочник.Номенклатура КАК СправочникНоменклатура

Проанализируем этот запрос подробнее. В конструкции ВЫБОР...КОНЕЦ мы проверяем условие и конкатенируем строку из пробелов с наименованием элемента непосредственно средствами СУБД. На форму мы выводим поле НаименованиеДляВывода, которое изначально содержит нужный визуальный отступ для элементов, не являющихся группами.

---

Вариант решения В: Переход на использование Дерева значений

Если ваша цель — отобразить иерархическую структуру данных (например, разделы, подразделы и конечные товары) с соответствующими отступами, то использование плоской табличной части — не самое лучшее архитектурное решение.

Платформа 1С предоставляет мощный инструмент для работы с иерархией — Дерево значений. При выводе дерева значений на управляемую форму:

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

Подведем итог. Мы проанализировали ограничение условного оформления управляемых форм 1С, выяснили причины его поведения и разобрали три надежных и проверенных на практике метода обхода этой проблемы. Выбирайте вариант с вычисляемой колонкой для интерактивных табличных частей и форматирование в запросе — для списков и отчетов. Это позволит вашему коду оставаться производительным, чистым и понятным.

← На главную