Как найти колонку таблицы значений по заголовку в 1С

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

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

В чем разница между именем и заголовком колонки

В платформе 1С каждая колонка в коллекции КоллекцияКолонокТаблицыЗначений имеет два принципиально разных свойства:

  1. Имя — уникальный идентификатор колонки в коде. Оно формируется по правилам именования переменных в 1С. Встроенный метод ТЗ.Колонки.Найти() осуществляет поиск исключительно по этому полю.
  2. Заголовок — текстовое представление колонки, отображаемое пользователю. Оно может содержать пробелы, специальные символы и не должно быть уникальным. Если при программном создании колонки заголовок не задавался явно, то свойство Заголовок останется пустой строкой "".

Поскольку прямого встроенного метода вроде НайтиПоЗаголовку() в платформе нет, рассмотрим проверенные способы решения этой задачи.

Способ 1. Безопасный перебор колонок таблицы значений

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

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


ИскомоеНазвание = ВРег(СократЛП(НужныйЗаголовок));
НайденнаяКолонка = Неопределено;

Для Каждого Колонка Из ТЗ.Колонки Цикл
    ТекстЗаголовка = СократЛП(Колонка.Заголовок);
    Если ПустаяСтрока(ТекстЗаголовка) Тогда
        ТекстЗаголовка = Колонка.Имя;
    КонецЕсли;

    Если ВРег(ТекстЗаголовка) = ИскомоеНазвание Тогда
        НайденнаяКолонка = Колонка;
        Прервать;
    КонецЕсли;
КонецЦикла;

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

Способ 2. Использование соответствия для повторных поисков

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

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

Посмотрим на реализацию этого метода:


// Формирование кэша колонок
КэшКолонок = Новый Соответствие;

Для Каждого Колонка Из ТЗ.Колонки Цикл
    ТекстКлюча = СократЛП(Колонка.Заголовок);
    Если ПустаяСтрока(ТекстКлюча) Тогда
        ТекстКлюча = Колонка.Имя;
    КонецЕсли;
    КэшКолонок.Вставить(ВРег(ТекстКлюча), Колонка);
КонецЦикла;

// Быстрое получение колонки по заголовку
НайденнаяКолонка = КэшКолонок.Получить(ВРег(СократЛП(НужныйЗаголовок)));

Этот способ позволяет сократить время выполнения операций при многократном поиске реквизитов в больших таблицах значений.

← На главную