Как перевести текст SQL-запроса в термины и метаданные 1С?

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

При оптимизации производительности систем на платформе 1С:Предприятие разработчики и администраторы баз данных часто сталкиваются со сложными, «сырыми» SQL-запросами. Такие запросы приходят из технологического журнала 1С, MS SQL Server Profiler или логов PostgreSQL. Читать их крайне тяжело, так как вместо понятных названий справочников, документов и реквизитов СУБД использует физические имена таблиц вроде _AccumRg23249 и полей вроде _Fld23255RRef.

Для быстрой локализации проблемы и анализа планов выполнения запросов необходимо преобразовать этот машинный код в человекочитаемый вид — термины метаданных 1С (например, РегистрНакопления.Взаиморасчеты и реквизит Контрагент). В этой статье мы подробно разберем, как решить эту задачу с помощью встроенных возможностей платформы, а также рассмотрим лучшие готовые инструменты, созданные сообществом.

Метод ПолучитьСтруктуруХраненияБазыДанных() — основа дешифровки

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

Давайте проанализируем, как программно получить эту структуру и использовать её для перевода. Метод вызывается в глобальном контексте и возвращает таблицу значений с подробным описанием структуры базы данных.

Рассмотрим пример кода, который формирует соответствие физических имен метаданным 1С:


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

Возвращаемая таблица значений содержит следующие ключевые колонки:

Используя эти данные, мы можем написать простейший конвертер, который будет выполнять замену строк. Разберем по шагам логику такой функции:


Функция ПеревестиSQLВТермины1С(Знач ТекстSQL) Экспорт
    СтруктураХранения = ПолучитьСтруктуруХраненияБазыДанных(, Истина);
    
    // Создаем таблицу для сортировки таблиц СУБД по убыванию длины имени.
    // Это критически важно, чтобы избежать частичной замены имен (например, чтобы _AccumRg23249 не превратилось в сломанную строку из-за совпадения с _AccumRg23)
    ТаблицаТаблиц = Новый ТаблицаЗначений;
    ТаблицаТаблиц.Колонки.Добавить("ИмяХранения", Новый ОписаниеТипов("Строка"));
    ТаблицаТаблиц.Колонки.Добавить("ИмяМетаданных", Новый ОписаниеТипов("Строка"));
    ТаблицаТаблиц.Колонки.Добавить("Длина", Новый ОписаниеТипов("Число"));
    
    Для Каждого СтрокаТаблицы Из СтруктураХранения Цикл
        НоваяСтр = ТаблицаТаблиц.Добавить();
        НоваяСтр.ИмяХранения = СтрокаТаблицы.ИмяТаблицыХранения;
        НоваяСтр.ИмяМетаданных = СтрокаТаблицы.ИмяТаблицы;
        НоваяСтр.Длина = СтрДлина(СтрокаТаблицы.ИмяТаблицыХранения);
    КонецЦикла;
    
    ТаблицаТаблиц.Сортировать("Длина Убыв");
    
    // Шаг 1: Заменяем физические имена полей СУБД на имена реквизитов 1С
    Для Каждого СтрокаТаблицы Из СтруктураХранения Цикл
        Для Каждого СтрокаПоля Из СтрокаТаблицы.Поля Цикл
            Если ЗначениеЗаполнено(СтрокаПоля.ИмяПоляХранения) И ЗначениеЗаполнено(СтрокаПоля.ИмяПоля) Тогда
                ТекстSQL = СтрЗаменить(ТекстSQL, СтрокаПоля.ИмяПоляХранения, СтрокаПоля.ИмяПоля);
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;
    
    // Шаг 2: Заменяем физические имена таблиц СУБД на имена объектов метаданных 1С
    Для Каждого СтрокаТаблицы Из ТаблицаТаблиц Цикл
        Если ЗначениеЗаполнено(СтрокаТаблицы.ИмяХранения) Тогда
            ТекстSQL = СтрЗаменить(ТекстSQL, СтрокаТаблицы.ИмяХранения, СтрокаТаблицы.ИмяМетаданных);
        КонецЕсли;
    КонецЦикла;
    
    Возврат ТекстSQL;
  КонецФункции

Выясним причину, почему простая замена через СтрЗаменить не всегда идеальна. На практике в сложных SQL-запросах могут встречаться пересечения имен, псевдонимы (aliases) таблиц и системные поля платформы (например, _RecordKind, _KeyField). Настоящие парсеры строят абстрактное синтаксическое дерево (AST) SQL-запроса, чтобы заменять только системные идентификаторы, не ломая структуру запроса. Для решения этой проблемы лучше использовать проверенные готовые инструменты.

Инструменты разработчика от TormozIT (Сергей Старых)

Одним из самых популярных и функциональных решений в сообществе 1С является пакет «Инструменты разработчика» (автор TormozIT). В его состав входит специализированная обработка «Конвертор текста БД в термины метаданных».

Проанализируем основные преимущества этого инструмента:

  1. Интеллектуальный разбор текста: Он не просто делает автозамену подстрок, а учитывает синтаксис SQL-запросов конкретной СУБД. Это гарантирует корректность итогового кода.
  2. Специализация на Технологическом Журнале: Обработка отлично справляется с логами ТЖ, позволяя массово декодировать тяжелые запросы.
  3. Высокое быстродействие: Инструмент предварительно кэширует структуру хранения метаданных, что позволяет мгновенно транслировать даже огромные запросы со множеством соединений (JOIN).

Конвертер из фреймворка «Мониторинг производительности» (Polyplastic)

Для масштабных задач оптимизации и мониторинга высоконагруженных систем отлично подходит открытый инструмент от компании «Полипластик».

Рассмотрим подробнее его ключевые особенности:

Встроенная дешифровка в современной «Консоли запросов»

Если вы работаете в современной среде разработки 1С и используете типовые инструменты от фирмы «1С» (например, Консоль запросов для управляемого приложения), обратите внимание на встроенные функции. При получении плана запроса и текста SQL из СУБД, консоль позволяет прямо в интерфейсе в один клик переключать отображение между физическими именами таблиц БД и логическими именами метаданных 1С. Это избавляет от необходимости копировать код в сторонние утилиты при быстром анализе.

Альтернативный подход: Анализ на уровне SDBL

Посмотрим на проблему под другим углом. Платформа 1С не транслирует запросы напрямую в диалект MS SQL или PostgreSQL. Сначала запрос 1С переводится во внутренний независимый язык — SDBL (Simple Data Base Language), а уже он преобразуется в конечный SQL.

Если вы настраиваете технологический журнал для поиска узких мест, вы можете собирать события на уровне SDBL. В логах SDBL запросы выглядят гораздо более читаемыми, так как там полностью сохранены имена метаданных (справочники, документы, реквизиты). Изучение логов SDBL во многих случаях позволяет обойтись вообще без конвертеров физического SQL.

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

← На главную