Как найти элемент справочника, если его тип указан в колонке таблицы значений?

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

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

Определение типа справочника через метаданные

Когда вы получаете тип значения из колонки ТаблицыЗначений, система возвращает объект типа Тип. Чтобы найти конкретный справочник, с которым работает эта колонка, необходимо перебрать коллекцию Метаданные.Справочники и сопоставить типы. Рассмотрим пример кода, который позволяет это реализовать:


// Получаем колонку таблицы значений
Колонка = ТЗ.Колонки.Найти("Реквизит1");

// Перебираем типы, если колонка может содержать несколько типов (составной тип)
Для Каждого ТипЗнч Из Колонка.ТипЗначения.Типы() Цикл
    // Сравниваем тип значения с метаданными всех справочников
    Для Каждого МетСправочник Из Метаданные.Справочники Цикл
        Если Тип("СправочникСсылка." + МетСправочник.Имя) = ТипЗнч Тогда
            // Мы нашли нужный справочник
            ИмяСправочника = МетСправочник.Имя;
            Сообщить("Справочник определен: " + ИмяСправочника);
            Прервать;
        КонецЕсли;
    КонецЦикла;
КонецЦикла;

Если вы уверены, что колонка имеет строго определенный тип и не является составной, вы можете значительно упростить этот код, обратившись напрямую к первому элементу массива типов:


// Упрощенный вариант, если тип точно не составной
ТипЗнч = Колонка.ТипЗначения.Типы()[0];
// Далее выполняем поиск по полученному типу

Как выполнить поиск элемента справочника

После того как мы выяснили имя справочника, нам нужно обратиться к его менеджеру для выполнения поиска. В 1С доступ к объектам осуществляется через коллекцию Справочники. Используя динамическое имя, полученное ранее, мы можем вызвать метод НайтиПоНаименованию или НайтиПоКоду:


// Использование динамического обращения к менеджеру справочника
СправочникМенеджер = Справочники[ИмяСправочника];
НайденныйЭлемент = СправочникМенеджер.НайтиПоНаименованию("ИскомоеЗначение");

// Всегда проверяем результат на пустоту
Если НЕ НайденныйЭлемент.Пустая() Тогда
    Сообщить("Элемент найден: " + НайденныйЭлемент);
Иначе
    Сообщить("Элемент не найден");
КонецЕсли;

Рекомендации по работе с типами данных

При работе с колонками таблиц значений важно учитывать следующие нюансы:

  1. Составные типы данных: Если колонка может содержать ссылки на разные справочники или документы, всегда используйте цикл по Типы(). Не пытайтесь получить тип напрямую, так как это приведет к ошибке при обращении к индексу несуществующего типа.
  2. Безопасность поиска: Метод НайтиПоНаименованию может вернуть пустую ссылку. Всегда используйте метод Пустая() для проверки результата, прежде чем пытаться обратиться к реквизитам полученного объекта.
  3. Оптимизация: Старайтесь избегать лишних преобразований типов в строки, если это не требуется для логики поиска. Работа через метаданные позволяет системе 1С выполнять код быстрее и с меньшим риском ошибок.
  4. Использование метаданных: Для более сложных задач, где нужно не только найти элемент, но и узнать структуру справочника (реквизиты, табличные части), используйте функцию Метаданные.НайтиПоПолномуИмени(). Это позволит работать с объектом метаданных на более глубоком уровне.

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

← На главную