При необходимости выполнения прямых запросов к базе данных SQL программисты 1С часто сталкиваются с ситуацией, когда физические имена таблиц и полей не совпадают с именами объектов конфигурации. Кроме того, после получения имени таблицы через программный код она может быть не видна в дереве объектов SQL Server Management Studio (SSMS) или подчёркиваться красной линией в редакторе запросов. Рассмотрим по шагам, как определить физические имена таблиц, сопоставить их реквизиты и настроить отображение объектов в СУБД.
Проанализируем основные причины, по которым запрос вида SELECT TOP 100 * FROM dbo._InfoRg10175 успешно выполняется, но SSMS сигнализирует об ошибке или не показывает таблицу в дереве объектов:
Ctrl + Shift + R.F5.SELECT), но у нее отсутствует разрешение VIEW DEFINITION, SQL Server позволит выполнить запрос, но скроет объект из списка в интерфейсе SSMS.[ИмяБазы].[dbo].[_InfoRg10175].Для определения того, какая физическая таблица СУБД соответствует объекту метаданных (например, регистру сведений или справочнику), в платформе 1С предусмотрена функция ПолучитьСтруктуруХраненияБазыДанных().
Рассмотрим пример кода, который ищет физическое имя конкретной таблицы СУБД и выводит список всех её полей с сопоставлением метаданных 1С:
ЧтоИщем = "InfoRg11512"; // Имя таблицы СУБД для поиска
СтруктураХранения = ПолучитьСтруктуруХраненияБазыДанных(, Истина);
Для Каждого Таблица Из СтруктураХранения Цикл
Если Таблица.ИмяТаблицыХранения = ЧтоИщем Тогда
Сообщить(Таблица.ИмяТаблицыХранения + " (" + Таблица.Метаданные + ")");
Для Каждого Поле Из Таблица.Поля Цикл
Если Найти(Сред(Поле.ИмяПоляХранения, 2), "") Тогда
Если Прав(Поле.ИмяПоляХранения, 5) = "_TYPE" Тогда
Сообщить(" " + Поле.ИмяПоляХранения + " (" + СтрЗаменить(Поле.Метаданные, Таблица.Метаданные + ".", "") + ")");
Иначе
Сообщить(" " + Поле.ИмяПоляХранения);
КонецЕсли;
Иначе
Сообщить(" " + Поле.ИмяПоляХранения + " (" + СтрЗаменить(Поле.Метаданные, Таблица.Метаданные + ".", "") + ")");
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
В результатах работы данного алгоритма мы получим полное соответствие физических колонок полям конфигурации:
_InfoRg11512 (РегистрСведений.АналогиНоменклатуры)
_Fld11513RRef (Измерение.Номенклатура)
_Fld11514RRef (Измерение.ХарактеристикаНоменклатуры)
_Fld11515RRef (Измерение.ВидАналога)
_Fld11516_TYPE (Измерение.Аналог)
_Fld11516_RTRef
_Fld11516_RRRef
_Fld11521RRef (Ресурс.ЕдиницаИзмерения)
_Fld11522 (Ресурс.Количество)
Выясним причину, почему в таблицах SQL вместо привычных ссылок отображаются идентификаторы и дополнительные суффиксы:
RRef: Обозначает поле ссылочного типа (ссылка на справочник, документ и т. д.). В базе данных SQL значение хранится в бинарном формате binary(16) (уникальный идентификатор GUID)._TYPE, _RTRef, _RRRef): Если реквизит может принимать значения разных типов, в таблице СУБД для него создаётся несколько колонок:
_TYPE — тип хранимого значения (булево, число, строка, ссылка);_RTRef — номер типа таблицы (префикс типа сущности);_RRRef — бинарный уникальный идентификатор конкретной ссылки._Fld11522.Прямое чтение и особенно запись данных в СУБД в обход сервера приложений 1С не рекомендуется разработчиками платформы по следующим причинам:
1. Риск изменения структуры при обновлениях: Физические имена таблиц (_InfoRg...) и полей (_Fld...) динамически генерируются платформой. При реструктуризации базы, выгрузке/загрузке файла .dt или обновлении конфигурации эти индексы могут измениться, что приведёт к неработоспособности жестко прописанных SQL-запросов.
2. Кэширование данных сервером 1С: Сервер приложений 1С кэширует считываемые данные. При прямом изменении через SQL (UPDATE, INSERT, DELETE) кэш сервера 1С не сбрасывается, из-за чего пользователи продолжат видеть устаревшие данные, а в базе возникнут ошибки целостности.
3. Игнорирование механизмов платформы: Прямые запросы не вызывают программные обработчики событий (ПередЗаписью, ПриЗаписью) и обходят настройки прав доступа на уровне записей (RLS).