Как в 1С получить имена таблиц, полей и индексов на уровне СУБД (SQL)?

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

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

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

Синтаксис и возможности метода ПолучитьСтруктуруХраненияБазыДанных

Для решения задачи в глобальном контексте платформы 1С предусмотрена штатная функция ПолучитьСтруктуруХраненияБазыДанных. Метод доступен на сервере, в толстом клиенте и во внешнем соединении.

Рассмотрим синтаксис метода:

ПолучитьСтруктуруХраненияБазыДанных(<ОбъектыМетаданных>, <ИменаБазыДанных>)

Параметры функции:

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

Метод возвращает ТаблицаЗначений, содержащую следующие ключевые колонки верхнего уровня:

  1. ИмяТаблицыХранения — физическое имя таблицы в СУБД (например, _Document200 или _Reference122).
  2. ИмяТаблицы — имя таблицы в терминах языка запросов 1С.
  3. Метаданные — полное имя объекта метаданных.
  4. Назначение — назначение таблицы (Основная, ТабличнаяЧасть, Итоги, Обороты и т.д.).
  5. Поля — вложенная таблица значений со списком всех колонок таблицы.
  6. Индексы — вложенная таблица значений со списком индексов таблицы и входящих в них полей.

Получение соответствия полей и табличных частей: пошаговый пример

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

Посмотрим на пример кода, который выводит физические имена таблиц СУБД и все входящие в них реквизиты (включая табличные части):


МассивИменМетаданных = Новый Массив();
МассивИменМетаданных.Добавить("Справочник.ФизическиеЛица");

// Получаем структуру хранения
ТаблицаСтруктуры = ПолучитьСтруктуруХраненияБазыДанных(МассивИменМетаданных, Истина);

Для Каждого СтрТаблица Из ТаблицаСтруктуры Цикл
    ОбработкаПрерыванияПользователя();
    
    Сообщить("Таблица: " + СтрТаблица.Метаданные + " -> SQL Таблица: " + СтрТаблица.ИмяТаблицыХранения);
    Сообщить("Назначение: " + СтрТаблица.Назначение);
    
    // Обходим вложенную таблицу полей
    Для Каждого СтрПоле Из СтрТаблица.Поля Цикл
        Сообщить("    Поле 1С: " + СтрПоле.ИмяПоля + " -> SQL Поле: " + СтрПоле.ИмяПоляХранения);
    КонецЦикла;
    
    // Обходим вложенную таблицу индексов
    Для Каждого СтрИндекс Из СтрТаблица.Индексы Цикл
        Сообщить("    Индекс SQL: " + СтрИндекс.ИмяИндексаХранения);
        Для Каждого СтрПолеИндекса Из СтрИндекс.Поля Цикл
            Сообщить("        Входит в индекс: " + СтрПолеИндекса.ИмяПоля + " (" + СтрПолеИндекса.ИмяПоляХранения + ")");
        КонецЦикла;
    КонецЦикла;
    
КонецЦикла;

Особенности хранения реквизитов и составных типов

Разберем важные нюансы, с которыми можно столкнуться при сопоставлении полей платформы и колонок СУБД:

  1. Составные типы данных: если реквизит 1С имеет составной тип (например, ссылка на несколько видов документов или примитивный тип), платформа разделяет его в СУБД на несколько физических колонок:
    1. ..._TYPE — код типа сохраненного значения.
    2. ..._RTRef — идентификатор таблицы ссылочного типа.
    3. ..._RRRef — бинарная ссылка (UUID) на объект.
    4. ..._N, ..._S, ..._B, ..._T — поля для хранения примитивных типов (число, строка, булево, дата).
  2. Ограничения по индексам: функция ПолучитьСтруктуруХраненияБазыДанных возвращает только те индексы, которые генерируются платформой 1С на основе метаданных (первичные ключи, реквизиты с включенным признаком «Индексировать», измерения регистров). Если администратор СУБД создал кастомные индексы вручную через SQL, метод 1С их не вернет.
  3. Отложенная реструктуризация: метод возвращает целевое описание структуры метаданных. Если в конфигураторе были добавлены реквизиты или изменены типы, но реструктуризация еще не была выполнена, метод вернет будущую структуру, а не фактически существующую в СУБД на текущий момент.

Важное предупреждение о прямой работе с СУБД

Выясним причину, по которой прямое изменение или вставка записей в таблицы 1С через SQL категорически не рекомендуется:

  1. Бинарный формат UUID: поле ссылки _IDRRef хранит GUID в бинарном представлении с переупорядоченными байтами. Генерация стандартного SQL GUID приведет к повреждению ссылочной целостности базы.
  2. Служебные поля: в таблицах 1С обязательно должны быть корректно заполнены системные реквизиты (_Version, _Marked, _Folder, _PredefinedID).
  3. Итоги регистров: при прямой записи движений в SQL не происходит пересчета итогов регистров накопления и бухгалтерии, из-за чего стандартные отчеты и виртуальные таблицы будут выдавать неверные результаты.
  4. Кэширование: сервер приложений 1С кэширует данные в оперативной памяти и не узнает об изменениях, сделанных в обход платформы через СУБД.

Для загрузки и синхронизации данных всегда используйте штатные механизмы платформы: HTTP/Web-сервисы, OData, внешние источники данных (ВИД) или COM-соединение.

← На главную