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