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