При работе с интерактивными таблицами на формах 1С часто возникает задача динамического удаления колонок. Однако при программном удалении колонки из таблицы значений или коллекции элементов формы выделение ячейки пропадает, а фокус с таблицы сбрасывается. Разберем, почему это происходит и как автоматизировать переход активной ячейки на соседнюю колонку.
Проблема заключается в том, что когда колонка удаляется из таблицы, элемент управления теряет связь с удаленным объектом. Свойство активной колонки табличного поля сбрасывается в Неопределено. Платформа 1С не переставляет фокус на соседнюю ячейку автоматически, поэтому выделение снимется, пока мы не зададим новую активную колонку программно.
Рассмотрим, как управлять фокусом в управляемом интерфейсе. На управляемых формах переключение активной ячейки выполняется через установку свойства ТекущийЭлемент формы или свойства ТекущаяКолонка элемента таблицы.
Разберем пример кода, где перед удалением колонки или сразу после него фокус переносится на нужный элемент:
// Устанавливаем активную колонку через свойство таблицы
Элементы.Таблица1.ТекущаяКолонка = Элементы.Таблица1ИмяНовойКолонки;
// Или передаем фокус непосредственно на элемент-поле новой колонки
ЭтаФорма.ТекущийЭлемент = Элементы.Таблица1ИмяНовойКолонки;
Обратите внимание: если удаление структуры реквизитов выполняется на сервере через метод ИзменитьРеквизиты, переключение текущего элемента необходимо выполнять на клиенте после завершения серверного вызова.
Проанализируем алгоритм работы с обычными формами. Здесь процесс состоит из нескольких шагов:
Колонки табличного поля.ТекущаяКолонка.ТекущийЭлемент.Рассмотрим практический пример реализации:
// 1. Запоминаем целевую колонку, на которую перейдет фокус
НоваяКолонка = ЭлементыФормы.ТабличноеПоле1.Колонки.ИмяСледующейКолонки;
// 2. Удаляем колонку из таблицы значений
ТЗ.Колонки.Удалить("УдаляемаяКолонка");
// 3. Назначаем новую текущую колонку для табличного поля
ЭлементыФормы.ТабличноеПоле1.ТекущаяКолонка = НоваяКолонка;
// 4. Гарантированно возвращаем фокус на табличное поле
ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.ТабличноеПоле1;
// При необходимости сразу открываем ячейку для редактирования
ЭлементыФормы.ТабличноеПоле1.ИзменитьСтроку();
При реализации переключения фокуса важно учитывать режим редактирования ячейки. Если удаляемая колонка находилась в состоянии ввода данных в момент вызова процедуры, необходимо предварительно завершить редактирование вызовом метода ЗавершитьРедактированиеСтроки(). В противном случае платформа может выдать ошибку выполнения или некорректно сбросить состояние формы.
Если нет жесткого требования физически удалять данные из структуры таблицы значений, рекомендуем использовать скрытие колонки вместо её удаления. Для этого достаточно изменить свойство Видимость элемента формы на Ложь:
// Для управляемых форм
Элементы.Таблица1УдаляемаяКолонка.Видимость = Ложь;
// Для обычных форм
ЭлементыФормы.ТабличноеПоле1.Колонки.УдаляемаяКолонка.Видимость = Ложь;
Данный подход сохраняет целостность структуры данных, предотвращает сбои фокуса и позволяет при необходимости быстро вернуть отображение колонки пользователю.