При разработке интерфейсов в конфигурациях на платформе 1С:Предприятие с использованием Обычных форм (ОФ) разработчики часто сталкиваются с жесткими ограничениями визуальной настройки элементов. Одна из таких задач — необходимость скрыть или изменить рамки (границы) у конкретных ячеек или колонок в табличной части (или табличном поле) динамического списка. Например, когда нужно визуально объединить несколько колонок или выделить группу ячеек цветом без отображения стандартной сетки вокруг них.
В этой статье мы подробно разберем, почему стандартные свойства колонок не приносят желаемого результата, проанализируем внутреннее устройство табличного поля в Обычных формах и рассмотрим три эффективных альтернативных метода решения этой задачи с практическими примерами кода.
Давайте проанализируем ситуацию, с которой сталкивается большинство разработчиков при попытке решить задачу «в лоб». Открыв свойства колонки табличного поля в конфигураторе, мы можем обнаружить свойства Рамка и Цвет рамки в категории «Оформление». Логично предположить, что если установить значение рамки в «Нет линии» или задать ей цвет, совпадающий с цветом фона, то границы ячейки исчезнут. Однако на практике в режиме «Предприятие» визуально ничего не меняется.
Выясним причину такого поведения платформы. Эти свойства относятся не к самой ячейке таблицы как к элементу сетки, а к элементу управления (например, ПолеВвода, ПолеФлажка или ПолеВыбора), который размещен внутри этой колонки. Данный элемент управления активизируется и отрисовывает свои собственные границы исключительно в тот момент, когда ячейка переходит в режим редактирования (когда пользователь дважды кликает по ней или начинает вводить текст). В обычном режиме просмотра строки табличное поле отрисовывается платформой как единый монолитный объект, где за сетку отвечает само поле, а не индивидуальные элементы колонок. Именно поэтому интерактивное изменение свойств рамки в конфигураторе для просмотра строк не дает никакого результата.
Кроме того, если мы обратимся к программному коду и попытаемся использовать объект ОформлениеЯчейки в обработчиках событий ПриВыводеСтроки или ПриПолученииДанных, то обнаружим следующее ограничение: данный объект **не имеет свойств для управления рамками, границами или толщиной линий конкретной ячейки**. Доступные свойства ограничиваются лишь следующими параметрами:
ЦветФона — позволяет задать фоновую заливку;ЦветТекста — управляет цветом шрифта;Шрифт — определяет гарнитуру и размер текста;Видимость и Доступность;Напрямую обратиться к рамке единичной ячейки табличного поля в обычном приложении невозможно. Что же делать в такой ситуации? Рассмотрим по шагам обходные пути решения этой задачи.
---
Если нам принципиально нужно использовать стандартное табличное поле (например, это связанный динамический список или табличная часть документа), но границы определенных ячеек мешают интерфейсу, мы можем пойти от обратного: отключить сетку для всего табличного поля, а визуальное разделение строк и колонок реализовать программно.
Проанализируем этот алгоритм по шагам:
ПриОткрытии):
Процедура ПриОткрытии()
// Отключаем вертикальные и горизонтальные линии сетки
ЭлементыФормы.ИмяТабличнойЧасти.ГоризонтальныеЛинии = Ложь;
ЭлементыФормы.ИмяТабличнойЧасти.ВертикальныеЛинии = Ложь;
КонецПроцедуры
ЭлементыФормы.ИмяТабличнойЧасти.ЧередованиеЦветовСтрок = Истина;
// Зададим легкий серый цвет для четных строк
ЭлементыФормы.ИмяТабличнойЧасти.ЦветФонаЧередованияСтрок = Новый Цвет(245, 245, 245);
ПриВыводеСтроки. Посмотрим на практический пример:
Процедура ТабличнаяЧастьПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
// Определяем текущий цвет фона строки (с учетом чередования)
ТекущийЦветФона = ?(ОформлениеСтроки.ЦветФона = Неопределено, Новый Цвет(255, 255, 255), ОформлениеСтроки.ЦветФона);
// Для определенной колонки, где нужно убрать видимость границ,
// принудительно устанавливаем цвет фона, совпадающий с фоном всей строки
ОформлениеСтроки.Ячейки.ИмяКолонкиБезРамки.ЦветФона = ТекущийЦветФона;
// Если требуется выделить ячейку зеленым цветом (как планировал автор темы)
Если ДанныеСтроки.Статус = Перечисления.СтатусыНоменклатуры.Активен Тогда
ОформлениеСтроки.Ячейки.ИмяКолонкиБезРамки.ЦветФона = Новый Цвет(200, 255, 200); // Светло-зеленый
КонецЕсли;
КонецПроцедуры
Преимущества метода: Работает со стандартными табличными частями и динамическими списками, не требует переписывания логики заполнения данных, минимально нагружает систему.
Недостатки: Мы полностью лишаемся сетки во всей таблице, что может не соответствовать первоначальному дизайну формы.
---
Если для бизнес-логики или интерфейса критически важно управлять границами конкретных ячеек (например, делать их пунктирными, утолщенными, скрывать только левую или только нижнюю границу), то стандартное табличное поле нам не подойдет. В этом случае лучшим решением будет замена элемента управления на Поле табличного документа (ПолеТабличногоДокумента).
Табличный документ в 1С устроен по принципу электронных таблиц (подобно Excel). Каждая ячейка в нем является независимым объектом метаданных отображения, и мы имеем полный доступ к управлению свойствами линий каждой отдельной ячейки.
Рассмотрим, как реализовать вывод данных и управление рамками по шагам:
ПолеТабличногоДокумента (назовем его, например, ПолеТаблицыДанных).Посмотрим на пример кода, который выводит строки и убирает границы у конкретных ячеек:
Процедура ОбновитьТабличныйДокумент()
ТабДок = ЭлементыФормы.ПолеТаблицыДанных;
ТабДок.Очистить();
// Создаем линию "Нет линии" для скрытия границ
ЛинияБезГраниц = Новый Линия(ТипЛинииРисункаТабличногоДокумента.НетЛинии);
// Создаем стандартную тонкую линию для остальных ячеек
ОбычнаяЛиния = Новый Линия(ТипЛинииРисункаТабличногоДокумента.Тонкая);
// Заполняем шапку таблицы
ТабДок.Область("R1C1").Текст = "Номенклатура";
ТабДок.Область("R1C2").Текст = "Количество";
ТабДок.Область("R1C3").Текст = "Примечание";
НомерСтроки = 2;
Для Каждого СтрокаТЧ Из СсылкаНаОбъект.Товары Цикл
// Получаем области ячеек
ЯчейкаНоменклатура = ТабДок.Область(НомерСтроки, 1);
ЯчейкаКоличество = ТабДок.Область(НомерСтроки, 2);
ЯчейкаПримечание = ТабДок.Область(НомерСтроки, 3);
// Заполняем значениями
ЯчейкаНоменклатура.Текст = СтрокаТЧ.Номенклатура;
ЯчейкаКоличество.Текст = СтрокаТЧ.Количество;
ЯчейкаПримечание.Текст = СтрокаТЧ.Примечание;
// Пример условия: убираем рамки для примечаний у определенных товаров
Если СтрокаТЧ.Номенклатура.Услуга Тогда
// Метод Обвести(Лево, Верх, Право, Низ) позволяет детально настроить каждую грань ячейки
ЯчейкаПримечание.Обвести(ЛинияБезГраниц, ОбычнаяЛиния, ЛинияБезГраниц, ОбычнаяЛиния);
ЯчейкаПримечание.ЦветФона = Новый Цвет(240, 240, 240); // Выделим серым фоном
Иначе
// Оставляем стандартные рамки со всех сторон
ЯчейкаПримечание.Обвести(ОбычнаяЛиния, ОбычнаяЛиния, ОбычнаяЛиния, ОбычнаяЛиния);
КонецЕсли;
НомерСтроки = НомерСтроки + 1;
КонецЦикла;
КонецПроцедуры
Преимущества метода: Абсолютный контроль над визуальным стилем. Мы можем задавать индивидуальные рамки (цвет, толщину, тип линии — пунктир, двойная и т.д.) для любой ячейки таблицы.
Недостатки: Теряется встроенное поведение табличной части (автоматическое добавление строк пользователем, быстрое редактирование «на лету» без дополнительного программирования обработчиков событий интерактивного изменения ячеек).
---
Для создания максимально сложных, «дизайнерских» интерфейсов в Обычных формах 1С часто прибегают к использованию Поля HTML-документа. Этот метод позволяет полностью уйти от стандартного рендеринга платформы и сформировать таблицу с помощью стандартной разметки HTML и каскадных таблиц стилей (CSS).
Сформулируем краткий алгоритм реализации такого подхода:
ПолеHTMLДокумента.<table>.border: none; или border-right: transparent;).Рассмотрим пример генерации такого HTML-кода в модуле формы:
Функция СформироватьHTMLТаблицу()
ТекстHTML = "<html><head><style>
|table { border-collapse: collapse; width: 100%; }
|td, th { border: 1px solid #cccccc; padding: 8px; font-family: Arial; font-size: 12px; }
|.no-border { border: none !important; } /* Специальный класс для скрытия рамок */
|.green-bg { background-color: #d4edda; }
|</style></head><body>";
ТекстHTML = ТекстHTML + "<table>";
ТекстHTML = ТекстHTML + "<tr><th>Товар</th><th>Кол-во</th><th>Статус</th></tr>";
Для Каждого СтрокаТЧ Из СсылкаНаОбъект.Товары Цикл
КлассЯчейки = "";
Если СтрокаТЧ.СкрыватьРамку Тогда
КлассЯчейки = " class='no-border'";
ИначеЕсли СтрокаТЧ.СтатусАктивен Тогда
КлассЯчейки = " class='green-bg'";
КонецЕсли;
ТекстHTML = ТекстHTML + "<tr>";
ТекстHTML = ТекстHTML + "<td>" + СтрокаТЧ.Номенклатура.Наименование + "</td>";
ТекстHTML = ТекстHTML + "<td>" + СтрокаТЧ.Количество + "</td>";
// Применяем класс со скрытием границ или подсветкой к конкретной ячейке
ТекстHTML = ТекстHTML + "<td" + КлассЯчейки + ">" + СтрокаТЧ.Статус + "</td>";
ТекстHTML = ТекстHTML + "</tr>";
КонецЦикла;
ТекстHTML = ТекстHTML + "</table></body></html>";
Возврат ТекстHTML;
КонецФункции
Процедура ОбновитьОтображениеДанных()
ЭлементыФормы.ПолеHTMLДокумента.УстановитьТекст(СформироватьHTMLТаблицу());
КонецПроцедуры
Преимущества метода: Неограниченные возможности кастомизации таблиц: скругление углов ячеек, градиенты, тени, интерактивная реакция на наведение мыши (эффект ховера) и скрытие границ по любым сложным условиям.
Недостатки: Метод требует от разработчика базовых знаний HTML/CSS и усложняет обратную связь (обработку кликов по ячейкам для изменения данных в 1С).
---
Подводя итог нашему анализу, сделаем ключевые выводы: