Как программно узнать тип данных таблицы внешнего источника (объектные или необъектные) в 1С?

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

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

Определение типа через метаданные

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

Метаданные.ВнешниеИсточникиДанных.ИмяИсточника.Таблицы.ИмяТаблицы

У данного объекта метаданных есть свойство ТипДанныхТаблицы. Однако выясним важную деталь: это свойство возвращает не стандартный тип платформы, а специальное системное перечисление свойств объектов метаданных. Поэтому проверять его нужно не через оператор ТипЗнч(), а путем прямого сравнения со значениями из Метаданные.СвойстваОбъектов.

Пример программной проверки на объектный тип

Рассмотрим подробнее, как программно проверить, содержит ли таблица внешнего источника объектные данные. Для этого напишем следующее условие:


// Получаем объект метаданных таблицы внешнего источника
ОбъектМДТаблица = Метаданные.ВнешниеИсточникиДанных.МойИсточник.Таблицы.МояТаблица;

// Проверяем тип данных на "Объектные данные"
Если ОбъектМДТаблица.ТипДанныхТаблицы = Метаданные.СвойстваОбъектов.ТипДанныхТаблицыВнешнегоИсточникаДанных.ОбъектныеДанные Тогда
    // Таблица содержит объектные данные (ведет себя как Справочник)
    Сообщить("Это объектная таблица!");
ИначеЕсли ОбъектМДТаблица.ТипДанныхТаблицы = Метаданные.СвойстваОбъектов.ТипДанныхТаблицыВнешнегоИсточникаДанных.НеобъектныеДанные Тогда
    // Таблица содержит необъектные данные (ведет себя как Регистр сведений)
    Сообщить("Это необъектная таблица!");
КонецЕсли;

Причины и условия назначения типа таблицам (ограничения платформы)

Почему одна таблица во внешнем источнике определяется платформой как объектная, а другая — как необъектная? Разберем правила и системные ограничения 1С, которые влияют на это поведение:

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

Посмотрим на это с практической точки зрения: если при подключении таблицы к внешнему источнику вы хотите получить от платформы возможность генерировать ссылки на записи и работать с таблицей как со справочником (объектный тип), обязательно обеспечьте наличие в СУБД суррогатного или естественного первичного ключа, состоящего строго из одной колонки, и укажите его как ключевое поле в 1С.

← На главную