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

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

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

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

Почему не работают стандартные свойства «Рамка» и «Цвет рамки» в свойствах колонки?

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

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

Кроме того, если мы обратимся к программному коду и попытаемся использовать объект ОформлениеЯчейки в обработчиках событий ПриВыводеСтроки или ПриПолученииДанных, то обнаружим следующее ограничение: данный объект **не имеет свойств для управления рамками, границами или толщиной линий конкретной ячейки**. Доступные свойства ограничиваются лишь следующими параметрами:

Напрямую обратиться к рамке единичной ячейки табличного поля в обычном приложении невозможно. Что же делать в такой ситуации? Рассмотрим по шагам обходные пути решения этой задачи.

---

Вариант А: Глобальное отключение сетки табличного поля + визуальная имитация

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

Проанализируем этот алгоритм по шагам:

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

Процедура ПриОткрытии()
    // Отключаем вертикальные и горизонтальные линии сетки
    ЭлементыФормы.ИмяТабличнойЧасти.ГоризонтальныеЛинии = Ложь;
    ЭлементыФормы.ИмяТабличнойЧасти.ВертикальныеЛинии = Ложь;
КонецПроцедуры
  1. Настройка чередования цветов строк. Чтобы данные в таблице не сливались в сплошной текст и таблица оставалась читаемой, включим стандартный механизм чередования строк. Это также можно сделать в свойствах элемента или кодом:

ЭлементыФормы.ИмяТабличнойЧасти.ЧередованиеЦветовСтрок = Истина;
// Зададим легкий серый цвет для четных строк
ЭлементыФормы.ИмяТабличнойЧасти.ЦветФонаЧередованияСтрок = Новый Цвет(245, 245, 245); 
  1. Программное управление фоном «бесшовных» ячеек. В тех ячейках, где границы должны отсутствовать, мы можем принудительно закрашивать фон в цвет фона строки. Для этого используем событие ПриВыводеСтроки. Посмотрим на практический пример:

Процедура ТабличнаяЧастьПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
    
    // Определяем текущий цвет фона строки (с учетом чередования)
    ТекущийЦветФона = ?(ОформлениеСтроки.ЦветФона = Неопределено, Новый Цвет(255, 255, 255), ОформлениеСтроки.ЦветФона);
    
    // Для определенной колонки, где нужно убрать видимость границ,
    // принудительно устанавливаем цвет фона, совпадающий с фоном всей строки
    ОформлениеСтроки.Ячейки.ИмяКолонкиБезРамки.ЦветФона = ТекущийЦветФона;
    
    // Если требуется выделить ячейку зеленым цветом (как планировал автор темы)
    Если ДанныеСтроки.Статус = Перечисления.СтатусыНоменклатуры.Активен Тогда
        ОформлениеСтроки.Ячейки.ИмяКолонкиБезРамки.ЦветФона = Новый Цвет(200, 255, 200); // Светло-зеленый
    КонецЕсли;

КонецПроцедуры

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

Недостатки: Мы полностью лишаемся сетки во всей таблице, что может не соответствовать первоначальному дизайну формы.

---

Вариант Б: Использование «Поля табличного документа» вместо табличного поля

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

Табличный документ в 1С устроен по принципу электронных таблиц (подобно Excel). Каждая ячейка в нем является независимым объектом метаданных отображения, и мы имеем полный доступ к управлению свойствами линий каждой отдельной ячейки.

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

  1. Разместим на форме элемент управления типа ПолеТабличногоДокумента (назовем его, например, ПолеТаблицыДанных).
  2. Напишем процедуру программного заполнения этого поля данными из нашей табличной части или запроса.

Посмотрим на пример кода, который выводит строки и убирает границы у конкретных ячеек:


Процедура ОбновитьТабличныйДокумент()
    
    ТабДок = ЭлементыФормы.ПолеТаблицыДанных;
    ТабДок.Очистить();
    
    // Создаем линию "Нет линии" для скрытия границ
    ЛинияБезГраниц = Новый Линия(ТипЛинииРисункаТабличногоДокумента.НетЛинии);
    // Создаем стандартную тонкую линию для остальных ячеек
    ОбычнаяЛиния = Новый Линия(ТипЛинииРисункаТабличногоДокумента.Тонкая);
    
    // Заполняем шапку таблицы
    ТабДок.Область("R1C1").Текст = "Номенклатура";
    ТабДок.Область("R1C2").Текст = "Количество";
    ТабДок.Область("R1C3").Текст = "Примечание";
    
    НомерСтроки = 2;
    Для Каждого СтрокаТЧ Из СсылкаНаОбъект.Товары Цикл
        
        // Получаем области ячеек
        ЯчейкаНоменклатура = ТабДок.Область(НомерСтроки, 1);
        ЯчейкаКоличество   = ТабДок.Область(НомерСтроки, 2);
        ЯчейкаПримечание   = ТабДок.Область(НомерСтроки, 3);
        
        // Заполняем значениями
        ЯчейкаНоменклатура.Текст = СтрокаТЧ.Номенклатура;
        ЯчейкаКоличество.Текст   = СтрокаТЧ.Количество;
        ЯчейкаПримечание.Текст   = СтрокаТЧ.Примечание;
        
        // Пример условия: убираем рамки для примечаний у определенных товаров
        Если СтрокаТЧ.Номенклатура.Услуга Тогда
            // Метод Обвести(Лево, Верх, Право, Низ) позволяет детально настроить каждую грань ячейки
            ЯчейкаПримечание.Обвести(ЛинияБезГраниц, ОбычнаяЛиния, ЛинияБезГраниц, ОбычнаяЛиния);
            ЯчейкаПримечание.ЦветФона = Новый Цвет(240, 240, 240); // Выделим серым фоном
        Иначе
            // Оставляем стандартные рамки со всех сторон
            ЯчейкаПримечание.Обвести(ОбычнаяЛиния, ОбычнаяЛиния, ОбычнаяЛиния, ОбычнаяЛиния);
        КонецЕсли;
        
        НомерСтроки = НомерСтроки + 1;
    КонецЦикла;
    
КонецПроцедуры

Преимущества метода: Абсолютный контроль над визуальным стилем. Мы можем задавать индивидуальные рамки (цвет, толщину, тип линии — пунктир, двойная и т.д.) для любой ячейки таблицы.

Недостатки: Теряется встроенное поведение табличной части (автоматическое добавление строк пользователем, быстрое редактирование «на лету» без дополнительного программирования обработчиков событий интерактивного изменения ячеек).

---

Вариант В: Использование «Поля HTML-документа»

Для создания максимально сложных, «дизайнерских» интерфейсов в Обычных формах 1С часто прибегают к использованию Поля HTML-документа. Этот метод позволяет полностью уйти от стандартного рендеринга платформы и сформировать таблицу с помощью стандартной разметки HTML и каскадных таблиц стилей (CSS).

Сформулируем краткий алгоритм реализации такого подхода:

  1. Добавим на форму элемент управления ПолеHTMLДокумента.
  2. Программным путем сгенерируем текст HTML-страницы, содержащий описание таблицы <table>.
  3. Для ячеек таблицы, у которых необходимо скрыть рамки, применим CSS-стили (например, 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С).

---

Резюме и рекомендации

Подводя итог нашему анализу, сделаем ключевые выводы:

← На главную