Как получить имя таблицы и структуру полей 1С в СУБД SQL и найти их в SSMS

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

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

Почему таблица не видна в SSMS или подчёркивается как несуществующая

Проанализируем основные причины, по которым запрос вида SELECT TOP 100 * FROM dbo._InfoRg10175 успешно выполняется, но SSMS сигнализирует об ошибке или не показывает таблицу в дереве объектов:

  1. Кэширование автодополнения (IntelliSense): В SSMS встроен встроенный механизм подстановки имён. Если таблица или регистр были созданы относительно недавно, кэш IntelliSense может содержать устаревшие данные. Для принудительного обновления кэша автодополнения нажмите комбинацию клавиш Ctrl + Shift + R.
  2. Кэш дерева обозревателя объектов (Object Explorer): Дерево баз данных и таблиц не обновляется в режиме реального времени. Чтобы увидеть новые или изменённые таблицы, выделите узел «Таблицы» (Tables) нужной базы данных в SSMS и нажмите клавишу F5.
  3. Недостаток прав на просмотр метаданных: Если учетная запись имеет права только на чтение данных (SELECT), но у нее отсутствует разрешение VIEW DEFINITION, SQL Server позволит выполнить запрос, но скроет объект из списка в интерфейсе SSMS.
  4. Разные базы данных или экземпляры СУБД: Если на сервере развернуто несколько баз или экземпляров SQL Server, убедитесь, что сеанс 1С и контекст запроса в SSMS подключены к одной и той же базе данных. В тексте запроса можно явно указывать схему и базу: [ИмяБазы].[dbo].[_InfoRg10175].

Получение структуры хранения базы данных через код 1С

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

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


ЧтоИщем = "InfoRg11512"; // Имя таблицы СУБД для поиска
СтруктураХранения = ПолучитьСтруктуруХраненияБазыДанных(, Истина); 

Для Каждого Таблица Из СтруктураХранения Цикл
    Если Таблица.ИмяТаблицыХранения = ЧтоИщем Тогда
        Сообщить(Таблица.ИмяТаблицыХранения + " (" + Таблица.Метаданные + ")");
        
        Для Каждого Поле Из Таблица.Поля Цикл
            Если Найти(Сред(Поле.ИмяПоляХранения, 2), "") Тогда
                Если Прав(Поле.ИмяПоляХранения, 5) = "_TYPE" Тогда
                    Сообщить("   " + Поле.ИмяПоляХранения + " (" + СтрЗаменить(Поле.Метаданные, Таблица.Метаданные + ".", "") + ")");
                Иначе
                    Сообщить("   " + Поле.ИмяПоляХранения);
                КонецЕсли;
            Иначе
                Сообщить("   " + Поле.ИмяПоляХранения + " (" + СтрЗаменить(Поле.Метаданные, Таблица.Метаданные + ".", "") + ")");
            КонецЕсли;
        КонецЦикла;    
    КонецЕсли;
КонецЦикла;

В результатах работы данного алгоритма мы получим полное соответствие физических колонок полям конфигурации:


_InfoRg11512 (РегистрСведений.АналогиНоменклатуры)
   _Fld11513RRef (Измерение.Номенклатура)
   _Fld11514RRef (Измерение.ХарактеристикаНоменклатуры)
   _Fld11515RRef (Измерение.ВидАналога)
   _Fld11516_TYPE (Измерение.Аналог)
   _Fld11516_RTRef
   _Fld11516_RRRef
   _Fld11521RRef (Ресурс.ЕдиницаИзмерения)
   _Fld11522 (Ресурс.Количество)

Особенности расшифровки полей СУБД

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

  1. Суффикс RRef: Обозначает поле ссылочного типа (ссылка на справочник, документ и т. д.). В базе данных SQL значение хранится в бинарном формате binary(16) (уникальный идентификатор GUID).
  2. Составные типы данных (_TYPE, _RTRef, _RRRef): Если реквизит может принимать значения разных типов, в таблице СУБД для него создаётся несколько колонок:
    • _TYPE — тип хранимого значения (булево, число, строка, ссылка);
    • _RTRef — номер типа таблицы (префикс типа сущности);
    • _RRRef — бинарный уникальный идентификатор конкретной ссылки.
  3. Простые типы данных: Поля с примитивными типами (числа, строки, даты) хранятся без специальных суффиксов, например _Fld11522.

Важные ограничения и рекомендации при работе с SQL напрямую

Прямое чтение и особенно запись данных в СУБД в обход сервера приложений 1С не рекомендуется разработчиками платформы по следующим причинам:

1. Риск изменения структуры при обновлениях: Физические имена таблиц (_InfoRg...) и полей (_Fld...) динамически генерируются платформой. При реструктуризации базы, выгрузке/загрузке файла .dt или обновлении конфигурации эти индексы могут измениться, что приведёт к неработоспособности жестко прописанных SQL-запросов.

2. Кэширование данных сервером 1С: Сервер приложений 1С кэширует считываемые данные. При прямом изменении через SQL (UPDATE, INSERT, DELETE) кэш сервера 1С не сбрасывается, из-за чего пользователи продолжат видеть устаревшие данные, а в базе возникнут ошибки целостности.

3. Игнорирование механизмов платформы: Прямые запросы не вызывают программные обработчики событий (ПередЗаписью, ПриЗаписью) и обходят настройки прав доступа на уровне записей (RLS).

← На главную