Как перенести активную ячейку на другую колонку при удалении колонки в таблице 1С

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

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

Выясним причину сброса фокуса

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

Решение для управляемых форм

Рассмотрим, как управлять фокусом в управляемом интерфейсе. На управляемых формах переключение активной ячейки выполняется через установку свойства ТекущийЭлемент формы или свойства ТекущаяКолонка элемента таблицы.

Разберем пример кода, где перед удалением колонки или сразу после него фокус переносится на нужный элемент:


// Устанавливаем активную колонку через свойство таблицы
Элементы.Таблица1.ТекущаяКолонка = Элементы.Таблица1ИмяНовойКолонки;

// Или передаем фокус непосредственно на элемент-поле новой колонки
ЭтаФорма.ТекущийЭлемент = Элементы.Таблица1ИмяНовойКолонки;

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

Решение для обычных форм

Проанализируем алгоритм работы с обычными формами. Здесь процесс состоит из нескольких шагов:

  1. Предварительно определяем целевую соседнюю колонку (следующую или предыдущую) из коллекции Колонки табличного поля.
  2. Выполняем удаление требуемой колонки.
  3. Программно назначаем новую текущую колонку в свойство ТекущаяКолонка.
  4. Возвращаем фокус на само табличное поле через свойство формы ТекущийЭлемент.

Рассмотрим практический пример реализации:


// 1. Запоминаем целевую колонку, на которую перейдет фокус
НоваяКолонка = ЭлементыФормы.ТабличноеПоле1.Колонки.ИмяСледующейКолонки;

// 2. Удаляем колонку из таблицы значений
ТЗ.Колонки.Удалить("УдаляемаяКолонка");

// 3. Назначаем новую текущую колонку для табличного поля
ЭлементыФормы.ТабличноеПоле1.ТекущаяКолонка = НоваяКолонка;

// 4. Гарантированно возвращаем фокус на табличное поле
ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.ТабличноеПоле1;

// При необходимости сразу открываем ячейку для редактирования
ЭлементыФормы.ТабличноеПоле1.ИзменитьСтроку();

Ограничения и важные нюансы

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

Альтернативный вариант: управление видимостью

Если нет жесткого требования физически удалять данные из структуры таблицы значений, рекомендуем использовать скрытие колонки вместо её удаления. Для этого достаточно изменить свойство Видимость элемента формы на Ложь:


// Для управляемых форм
Элементы.Таблица1УдаляемаяКолонка.Видимость = Ложь;

// Для обычных форм
ЭлементыФормы.ТабличноеПоле1.Колонки.УдаляемаяКолонка.Видимость = Ложь;

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

← На главную