При разработке интерфейсов на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с задачей визуального выделения определенных данных. Одним из самых интуитивно понятных способов кажется изменение цвета рамки конкретной ячейки в табличной части документа. Однако при попытке установить свойство ЦветРамки у поля ввода, размещенного в таблице, разработчик обнаруживает, что визуально ничего не меняется. В то же время ЦветФона и ЦветТекста работают корректно.
В данной статье мы разберем, почему стандартный механизм не приносит желаемого результата, и рассмотрим альтернативные способы реализации этой задачи, от простых визуальных хитростей до сложных архитектурных изменений формы.
Прежде чем переходить к решениям, выясним причину такого поведения системы. В управляемом приложении отрисовка таблиц (элемент формы типа Таблица) оптимизирована для обеспечения высокой производительности и единообразия интерфейса. Сетка таблицы отрисовывается системным рендерером целиком. Свойство ЦветРамки, доступное в палитре свойств Поля ввода, корректно отрабатывает только тогда, когда это поле расположено на форме как самостоятельный элемент.
Как только поле становится частью колонки таблицы, управление его границами передается объекту Таблица. Индивидуальное переопределение границ для каждой отдельной ячейки через стандартные свойства или механизм Условного оформления на уровне ядра платформы не предусмотрено. Система игнорирует эти настройки, чтобы не нарушать целостность отрисовки сетки. Рассмотрим, как можно обойти это ограничение.
Проанализируем наиболее изящный способ имитации рамки, который не требует переработки всей формы. Мы можем использовать свойство КартинкаФона в совокупности с механизмом Условного оформления.
Суть метода заключается в создании специального изображения (например, в формате PNG), которое представляет собой пустую рамку нужного цвета с прозрачной центральной частью. Шаги реализации выглядят следующим образом:
Рассмотрим пример программной настройки такого оформления в модуле формы:
&НаСервере
Процедура НастроитьВыделениеРамкой()
// Создаем новый элемент условного оформления
ЭлементОформления = УсловноеОформление.Элементы.Добавить();
// Указываем оформляемое поле (имя колонки в таблице)
ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ТоварыЦена");
// Устанавливаем условие (например, если цена > 1000)
ЭлементУсловия = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементУсловия.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Цена");
ЭлементУсловия.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;
ЭлементУсловия.ПравоеЗначение = 1000;
// Самое важное: устанавливаем картинку фона вместо цвета рамки
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("КартинкаФона", БиблиотекаКартинок.КраснаяРамка);
КонецПроцедуры
Этот метод позволяет визуально "обмануть" систему: рамка будет отрисована как часть фона ячейки, что создаст нужный эффект выделения, не конфликтуя с системными настройками сетки.
Если требования к визуальному оформлению очень жесткие (нужны разные типы линий, разные цвета для каждой стороны ячейки), стандартный элемент формы Таблица нам не подойдет. В этом случае разберем вариант замены табличной части на элемент Поле табличного документа.
Объект ТабличныйДокумент обладает колоссальной гибкостью в плане оформления. Для него свойство ЦветРамки является рабочим и штатным. Посмотрим на фрагмент кода, который позволяет разукрасить границы в табличном документе:
&НаСервере
Процедура ОформитьЯчейкуВТабДоке(ТабДок, НомерСтроки, НомерКолонки)
Область = ТабДок.Область(НомерСтроки, НомерКолонки);
// Устанавливаем тип линии
Область.Обвести(Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная, 2),
Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная, 2),
Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная, 2),
Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная, 2));
// Устанавливаем цвет рамки
Область.ЦветРамки = Новый Цвет(255, 0, 0); // Красный
КонецПроцедуры
Важный нюанс: при использовании табличного документа вместо стандартной таблицы вы теряете автоматическую связь с данными объекта. Вам придется самостоятельно описывать обработчики событий ПриИзменении, Выбор и программно синхронизировать данные между ТабличнымДокументом и коллекцией Объект.Товары. Это трудоемкий процесс, но он дает полную свободу в дизайне.
Для реализации максимально сложного интерфейса проанализируем возможность использования Поля HTML-документа. Этот метод позволяет отрисовать таблицу с помощью языка разметки HTML и стилей CSS. Как известно, в CSS свойства границ (border-color, border-style, border-width) работают безупречно для любого элемента <td>.
Рассмотрим пример формирования строки таблицы с красной рамкой у одной из ячеек:
ТекстHTML = "<table style='width:100%; border-collapse: collapse;'>
| <tr>
| <td style='border: 1px solid #ccc;'>Товар 1</td>
| <td style='border: 2px solid red;'>Внимание! Ошибка в цене</td>
| </tr>
|</table>";
Элементы.ПолеHTML.УстановитьТекст(ТекстHTML);
Этот способ крайне редко применяется для редактируемых табличных частей, но идеально подходит для информационных панелей, дашбордов и отчетов, где визуальная составляющая важнее возможности быстрого ввода данных "в ячейку".
Выяснив, что прямое изменение цвета рамки в табличной части невозможно, подведем итог по выбору методики:
ЦветФона или ЦветТекста. Это стандартный путь 1С, привычный пользователям.Также помните, что свойство ЦветРамки игнорируется платформой, если у элемента установлен стиль Выпуклая или Вдавленная. Для корректной работы (там, где это поддерживается) всегда выбирайте стиль Линия. Мы проанализировали основные подходы и выяснили, что даже при наличии платформенных ограничений, у разработчика всегда есть несколько путей для достижения цели.