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