Как сопоставить имена SQL таблиц и полей с объектами метаданных 1С:Предприятие

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

При работе с базами данных 1С на уровне SQL-запросов одной из самых сложных задач является идентификация таблиц и полей. Платформа 1С:Предприятие хранит данные в таблицах с именами вида _Reference45 или _Document120, а реквизиты — в колонках типа _Fld1234. В этой статье мы подробно разберем, как получить человекочитаемые соответствия этих имен, рассмотрим стандартные и продвинутые методы извлечения метаданных.

Метод 1: Использование встроенной функции 1С (Рекомендуемый)

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

Рассмотрим пример кода, который позволяет выгрузить эту структуру. Мы можем запустить его в обработке и сохранить результат в отдельную SQL-таблицу, которую затем будем использовать как «словарь» для наших внешних запросов. При необходимости можно воспользоваться готовой внешней обработкой для сопоставления SQL-таблиц с объектами 1С.


СтруктураБазы = ПолучитьСтруктуруХраненияБазыДанных();
Для Каждого Таблица Из СтруктураБазы Цикл
    ИмяТаблицы1С = Таблица.ИмяМетаданных;
    ИмяТаблицыSQL = Таблица.ИмяТаблицыХранения;
    
    Для Каждого Поле Из Таблица.Поля Цикл
        Сообщить("1С: " + Поле.ИмяМетаданных + " -> SQL: " + Поле.ИмяПоляХранения);
    КонецЦикла;
КонецЦикла;

Преимущества этого метода:

  1. Официальная поддержка платформой.
  2. Корректная обработка всех типов объектов (справочники, документы, регистры).
  3. Простота реализации.

Проанализируем ситуацию: этот метод требует запуска сеанса 1С. Если ваша задача — получать данные строго на стороне SQL без участия 1С, вам придется настроить регламентное задание, которое будет периодически обновлять «таблицу-словарь» в вашей базе SQL.

Метод 2: Прямое чтение системных таблиц 1С в SQL

Иногда возникают ситуации, когда запуск 1С невозможен или нежелателен. В этом случае мы можем обратиться к системным таблицам самой базы данных SQL. Платформа хранит информацию о соответствии имен в таблице Params (в некоторых версиях Config) в записи с идентификатором dbnames.

Разберем по шагам, как устроено хранение данных в dbnames:

  1. Данные в этой записи хранятся в бинарном виде (поле BinaryData).
  2. Содержимое сжато по алгоритму Deflate.
  3. После распаковки мы получаем текстовый или бинарный поток, содержащий UUID объектов метаданных и соответствующие им номера таблиц и полей.

Чтобы реализовать чтение этих данных напрямую из SQL Server, необходимо использовать CLR-процедуры (Common Language Runtime). Рассмотрим алгоритм:

  1. Подключаем к SQL Server библиотеку для работы с Zlib/Deflate.
  2. Создаем SQL-функцию, которая принимает содержимое поля BinaryData и возвращает разжатый текст.
  3. Парсим полученный результат. В современных версиях 8.3 это будет список соответствий: UUID объекта — SQL-имя — Тип объекта.

Выясним причину сложности: структура dbnames не является публично документированной и может меняться между версиями платформы. Поэтому прямой доступ к этой таблице считается «хакерским» методом и требует осторожности.

Особенности именования полей для составных типов данных

При анализе полей _Fld<n> важно понимать, что реквизит в 1С не всегда соответствует одной колонке в SQL. Посмотрим на пример составного типа данных (например, когда реквизит может быть и Справочником, и Документом).

В этом случае платформа создает несколько колонок в SQL для одного реквизита 1С:

Важно: Если вы строите SQL-запрос вручную, вам необходимо объединять эти поля или фильтровать их, чтобы получить корректное значение реквизита.

Системные поля, которые есть в каждой таблице

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

Работа с расширениями конфигурации

Проанализируем ситуацию с расширениями. Если в вашей базе активно используются расширения, которые добавляют свои реквизиты в существующие таблицы или создают новые, информация о них не будет находиться в основной таблице dbnames.

Для каждого расширения в таблице Params создаются отдельные записи, такие как ExtensionDBSchema и аналоги DBNames. Структура маппинга там схожа, но SQL-имена таблиц расширений могут иметь дополнительные префиксы (например, _InfoRgX1). Для их получения лучше всего также использовать метод ПолучитьСтруктуруХраненияБазыДанных(), так как он автоматически собирает данные из всех активных расширений.

Рекомендации по реализации

Если ваша цель — создание стабильной системы отчетности на базе SQL, мы рекомендуем следующий подход:

  1. Создайте в базе данных SQL техническую таблицу MetadataMapping.
  2. Напишите простую внешнюю обработку 1С, которая раз в сутки (или после каждого обновления конфигурации) заполняет эту таблицу данными из ПолучитьСтруктуруХраненияБазыДанных().
  3. В ваших SQL-представлениях (Views) или запросах делайте JOIN с этой таблицей или используйте её для генерации динамического SQL.

Этот подход убережет вас от проблем при обновлении платформы или реструктуризации базы данных, когда номера _Fld<n> могут измениться. Помните, что после удаления и повторного создания реквизита с тем же именем в 1С, его SQL-идентификатор гарантированно изменится.

← На главную