При выполнении задач системного администрирования, анализе записей технологического журнала, оптимизации тяжелых запросов или профилировании СУБД разработчикам часто требуется сопоставить объекты конфигурации 1С с их реальными физическими таблицами, колонками и индексами в базе данных (например, MS SQL Server или PostgreSQL).
Разберем по шагам, какими встроенными средствами платформы 1С:Предприятие можно быстро и точно извлечь структуру хранения данных, включая поля табличных частей и индексы.
Для решения задачи в глобальном контексте платформы 1С предусмотрена штатная функция ПолучитьСтруктуруХраненияБазыДанных. Метод доступен на сервере, в толстом клиенте и во внешнем соединении.
Рассмотрим синтаксис метода:
ПолучитьСтруктуруХраненияБазыДанных(<ОбъектыМетаданных>, <ИменаБазыДанных>)
Параметры функции:
Массив) — массив имен объектов метаданных (строки) или массив самих объектов метаданных. Если параметр не указан, функция возвращает структуру для абсолютно всех объектов конфигурации.Булево) — определяет формат возвращаемых имен:
Ложь (по умолчанию) — информация выдается в терминах внутренней модели базы данных 1С:Предприятия.Истина — информация выдается в терминах физической СУБД (реальные имена таблиц, колонок и индексов в SQL).Метод возвращает ТаблицаЗначений, содержащую следующие ключевые колонки верхнего уровня:
_Document200 или _Reference122).Проанализируем распространенную ошибку: при первичном вызове метода разработчики обращаются только к колонкам основной таблицы значений и не видят списка реквизитов. Список полей и индексов хранится во вложенных таблицах значений в колонках Поля и Индексы.
Посмотрим на пример кода, который выводит физические имена таблиц СУБД и все входящие в них реквизиты (включая табличные части):
МассивИменМетаданных = Новый Массив();
МассивИменМетаданных.Добавить("Справочник.ФизическиеЛица");
// Получаем структуру хранения
ТаблицаСтруктуры = ПолучитьСтруктуруХраненияБазыДанных(МассивИменМетаданных, Истина);
Для Каждого СтрТаблица Из ТаблицаСтруктуры Цикл
ОбработкаПрерыванияПользователя();
Сообщить("Таблица: " + СтрТаблица.Метаданные + " -> SQL Таблица: " + СтрТаблица.ИмяТаблицыХранения);
Сообщить("Назначение: " + СтрТаблица.Назначение);
// Обходим вложенную таблицу полей
Для Каждого СтрПоле Из СтрТаблица.Поля Цикл
Сообщить(" Поле 1С: " + СтрПоле.ИмяПоля + " -> SQL Поле: " + СтрПоле.ИмяПоляХранения);
КонецЦикла;
// Обходим вложенную таблицу индексов
Для Каждого СтрИндекс Из СтрТаблица.Индексы Цикл
Сообщить(" Индекс SQL: " + СтрИндекс.ИмяИндексаХранения);
Для Каждого СтрПолеИндекса Из СтрИндекс.Поля Цикл
Сообщить(" Входит в индекс: " + СтрПолеИндекса.ИмяПоля + " (" + СтрПолеИндекса.ИмяПоляХранения + ")");
КонецЦикла;
КонецЦикла;
КонецЦикла;
Разберем важные нюансы, с которыми можно столкнуться при сопоставлении полей платформы и колонок СУБД:
..._TYPE — код типа сохраненного значения...._RTRef — идентификатор таблицы ссылочного типа...._RRRef — бинарная ссылка (UUID) на объект...._N, ..._S, ..._B, ..._T — поля для хранения примитивных типов (число, строка, булево, дата).ПолучитьСтруктуруХраненияБазыДанных возвращает только те индексы, которые генерируются платформой 1С на основе метаданных (первичные ключи, реквизиты с включенным признаком «Индексировать», измерения регистров). Если администратор СУБД создал кастомные индексы вручную через SQL, метод 1С их не вернет.Выясним причину, по которой прямое изменение или вставка записей в таблицы 1С через SQL категорически не рекомендуется:
_IDRRef хранит GUID в бинарном представлении с переупорядоченными байтами. Генерация стандартного SQL GUID приведет к повреждению ссылочной целостности базы._Version, _Marked, _Folder, _PredefinedID).Для загрузки и синхронизации данных всегда используйте штатные механизмы платформы: HTTP/Web-сервисы, OData, внешние источники данных (ВИД) или COM-соединение.