Приветствуем вас, уважаемые разработчики! При поддержке и модернизации конфигураций на обычных формах (таких как «1С:Управление производственным предприятием 1.3», «1С:Бухгалтерия предприятия 2.0» или «1С:Управление торговлей 10.3») мы часто сталкиваемся с задачами тонкой настройки интерфейса. Одна из классических проблем — создание сложной многоуровневой шапки для табличного поля.
Представим стандартную бизнес-задачу: нам нужно сделать красивое объединение колонок. Сверху должна располагаться одна объединяющая ОбщаяКолонка, а прямо под ней — две подчиненные колонки (Колонка1 и Колонка2), предназначенные для ввода данных. Однако платформа 1С по умолчанию выводит под родительской шапкой пустую неактивную ячейку в каждой строке табличной части. Это существенно увеличивает высоту строк, загромождает экран и портит внешний вид формы. Сегодня мы подробно разберем, как сделать родительскую ячейку невидимой в строках, сохранив при этом саму общую шапку на форме.
Для начала проанализируем поведение платформы 1С:Предприятие 8 в обычных формах. В отличие от управляемого интерфейса, где группировка колонок реализуется декларативно через визуальные группы в дереве элементов, в обычных формах расположение колонок друг под другом настраивается через их взаимное позиционирование.
Когда мы настраиваем колонки многострочно, родительская колонка (ОбщаяКолонка) автоматически резервирует под себя физическую область в строках таблицы. Даже если мы:
Данные у родительской колонки;ТолькоПросмотр;Платформа все равно нарисует в строке пустое неактивное поле ввода. В результате под нашей красивой общей шапкой будет отображаться бесполезная серая область, а высота строки увеличится вдвое. Обычными свойствами колонки в конфигураторе решить эту проблему невозможно.
Чтобы получить идеальный интерфейс с общей шапкой над двумя колонками без лишних полей в строках, выполним настройку свойств колонок в конфигураторе и напишем небольшой обработчик события для управления оформлением строк.
Сначала нам нужно правильно задать взаимное расположение элементов. Откроем палитру свойств колонок нашего табличного поля и настроим свойство «Положение» для каждой из них:
Положение в «Новая колонка». Свойство Данные у этой колонки обязательно оставьте пустым. В поле ТекстШапки введите общее название группы колонок.Положение в «На следующей строке». Это заставит её визуально сместиться на второй уровень, ровно под родительскую колонку. В качестве данных привяжите соответствующий реквизит табличной части.Положение в «В той же колонке». Она встанет в один ряд (на второй строке) справа от первой подчиненной колонки.После этой настройки в конфигураторе шапка будет выглядеть правильно, но в режиме «1С:Предприятие» в строках останется пустая ячейка под общей шапкой. Перейдем к программному скрытию ячейки.
Для того чтобы убрать пустую область из строки данных, нам нужно использовать динамическое оформление ячеек. Платформа позволяет гибко управлять свойствами отображения ячеек «на лету» в момент их отрисовки на экране.
Рассмотрим два варианта решения этой задачи в зависимости от объема данных в вашей табличной части.
Этот способ идеально подходит для небольших документов и простых экранных форм. Перейдем к свойствам нашего табличного поля, найдем событие ПриВыводеСтроки, сгенерируем процедуру-обработчик в модуле формы и добавим в нее следующий код:
Процедура ТабличноеПоле1ПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
// Скрываем ячейку родительской колонки по ее имени в коллекции оформлений
ОформлениеСтроки.Ячейки.ОбщаяКолонка.Видимость = Ложь;
КонецПроцедуры
Как это работает: При выводе каждой строки на экран платформа передает в процедуру объект ОформлениеСтроки. Мы обращаемся к его коллекции Ячейки, находим нужную родительскую ячейку по её имени (ОбщаяКолонка) и принудительно устанавливаем свойство Видимость в значение Ложь. Платформа перестает отрисовывать саму ячейку внутри строки, при этом шапка колонки остается видимой на месте! Подчиненные колонки визуально «подтягиваются» вверх, и строка принимает красивый однострочный вид.
Если ваша табличная часть содержит сотни или тысячи строк (например, крупная спецификация или документ начисления заработной платы), использование события ПриВыводеСтроки может привести к «подлагиванию» интерфейса при быстрой прокрутке. В таких случаях рекомендуется использовать пакетный обработчик ПриПолученииДанных, который работает гораздо быстрее:
Процедура ТабличноеПоле1ПриПолученииДанных(Элемент, ОформленияСтрок)
// Пакетная обработка видимости ячеек для оптимизации отрисовки таблицы
Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
ОформлениеСтроки.Ячейки.ОбщаяКолонка.Видимость = Ложь;
КонецЦикла;
КонецПроцедуры
Преимущество этого подхода: Событие ПриПолученииДанных вызывается один раз для целой пачки строк, отображаемых в данный момент на экране. Мы за один проход цикла Для Каждого отключаем видимость нежелательных ячеек у всей выборки, что гарантирует плавную прокрутку и исключает задержки интерфейса.
Мы выяснили причину появления пустых ячеек под многоуровневыми шапками и нашли эффективное решение. Попытки скрыть пустые области через свойства редактирования или очистку данных не работают на уровне платформы. Единственным правильным способом является программное отключение видимости конкретной ячейки через коллекцию Ячейки объекта оформления строки в событиях ПриВыводеСтроки или ПриПолученииДанных.
Используйте этот несложный прием при проектировании сложных интерфейсов в обычных формах 1С, чтобы сделать работу ваших пользователей максимально комфортной и эффективной!