При работе с базами данных 1С на уровне SQL-запросов одной из самых сложных задач является идентификация таблиц и полей. Платформа 1С:Предприятие хранит данные в таблицах с именами вида _Reference45 или _Document120, а реквизиты — в колонках типа _Fld1234. В этой статье мы подробно разберем, как получить человекочитаемые соответствия этих имен, рассмотрим стандартные и продвинутые методы извлечения метаданных.
Самый надежный и простой способ получить маппинг — использовать встроенный метод платформы ПолучитьСтруктуруХраненияБазыДанных(). Этот метод возвращает таблицу значений, в которой описаны все таблицы базы данных, их назначение и соответствие полям SQL. Для повышения удобства при работе с этим методом можно применить инструмент для анализа структуры хранения базы данных.
Рассмотрим пример кода, который позволяет выгрузить эту структуру. Мы можем запустить его в обработке и сохранить результат в отдельную SQL-таблицу, которую затем будем использовать как «словарь» для наших внешних запросов. При необходимости можно воспользоваться готовой внешней обработкой для сопоставления SQL-таблиц с объектами 1С.
СтруктураБазы = ПолучитьСтруктуруХраненияБазыДанных();
Для Каждого Таблица Из СтруктураБазы Цикл
ИмяТаблицы1С = Таблица.ИмяМетаданных;
ИмяТаблицыSQL = Таблица.ИмяТаблицыХранения;
Для Каждого Поле Из Таблица.Поля Цикл
Сообщить("1С: " + Поле.ИмяМетаданных + " -> SQL: " + Поле.ИмяПоляХранения);
КонецЦикла;
КонецЦикла;
Преимущества этого метода:
Проанализируем ситуацию: этот метод требует запуска сеанса 1С. Если ваша задача — получать данные строго на стороне SQL без участия 1С, вам придется настроить регламентное задание, которое будет периодически обновлять «таблицу-словарь» в вашей базе SQL.
Иногда возникают ситуации, когда запуск 1С невозможен или нежелателен. В этом случае мы можем обратиться к системным таблицам самой базы данных SQL. Платформа хранит информацию о соответствии имен в таблице Params (в некоторых версиях Config) в записи с идентификатором dbnames.
Разберем по шагам, как устроено хранение данных в dbnames:
BinaryData).Чтобы реализовать чтение этих данных напрямую из SQL Server, необходимо использовать CLR-процедуры (Common Language Runtime). Рассмотрим алгоритм:
Zlib/Deflate.BinaryData и возвращает разжатый текст.Выясним причину сложности: структура dbnames не является публично документированной и может меняться между версиями платформы. Поэтому прямой доступ к этой таблице считается «хакерским» методом и требует осторожности.
При анализе полей _Fld<n> важно понимать, что реквизит в 1С не всегда соответствует одной колонке в SQL. Посмотрим на пример составного типа данных (например, когда реквизит может быть и Справочником, и Документом).
В этом случае платформа создает несколько колонок в SQL для одного реквизита 1С:
UUID ссылки на объект.Важно: Если вы строите SQL-запрос вручную, вам необходимо объединять эти поля или фильтровать их, чтобы получить корректное значение реквизита.
Помимо пользовательских реквизитов, в каждой таблице 1С присутствуют служебные поля. Их имена обычно фиксированы:
_IDRRef — первичный ключ таблицы (UUID записи)._Version — поле версии объекта (используется для контроля пессимистических блокировок)._Marked — булево значение, отвечающее за пометку на удаление._PredefinedID — идентификатор для предопределенных элементов.Проанализируем ситуацию с расширениями. Если в вашей базе активно используются расширения, которые добавляют свои реквизиты в существующие таблицы или создают новые, информация о них не будет находиться в основной таблице dbnames.
Для каждого расширения в таблице Params создаются отдельные записи, такие как ExtensionDBSchema и аналоги DBNames. Структура маппинга там схожа, но SQL-имена таблиц расширений могут иметь дополнительные префиксы (например, _InfoRgX1). Для их получения лучше всего также использовать метод ПолучитьСтруктуруХраненияБазыДанных(), так как он автоматически собирает данные из всех активных расширений.
Если ваша цель — создание стабильной системы отчетности на базе SQL, мы рекомендуем следующий подход:
MetadataMapping.ПолучитьСтруктуруХраненияБазыДанных().JOIN с этой таблицей или используйте её для генерации динамического SQL.Этот подход убережет вас от проблем при обновлении платформы или реструктуризации базы данных, когда номера _Fld<n> могут измениться. Помните, что после удаления и повторного создания реквизита с тем же именем в 1С, его SQL-идентификатор гарантированно изменится.