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