Просмотр структуры БД, парсинг запросов SQL



Получение некоторых данных о БД и сеансе, просмотр внутренней структуры таблиц БД 1С в SQL, "перевод" запросов SQL в терминологию 1С. Чуть больше, чем "ПолучитьСтруктуруХраненияБазыДанных"; чуть удобнее, чем аналоги; чуть другая, чем КИП.

Обработка делалась «для себя» как инструмент, необходимый любому разработчику и внедренцу больших «тяжёлых» конфигураций и БД. Так, при написании конфы на 1000+ пользователей приходится уже думать об анализе узких мест по всей строгости теории тов. Филиппова, Богачёва и иже с ними. Не буду пересказывать приёмы работы, на то есть хорошие методические статьи (вроде //infostart.ru/public/291874/). Речь о практике и особенностях предложенного инструмента.

Разумеется, есть Корпоративный инструментальный пакет, где ЦУП, и нагрузочное тестирование, и прочие плюшки, но его надо разворачивать и подключать, да и денежек он стоит. Если вдруг надо быстро «поймать» затруднение там, где КИПа нет и может вообще не быть, нужно что-то проще и мобильнее.

Конечно, есть внешние обработки, и таковых на ИС много, что пользуются системной функцией «ПолучитьСтруктуруХраненияБазыДанных» и всё красиво показывают. Но — эта функция не показывает всё «по правде». Что с включённой нотацией запросов, что без. Она не покажет SimpleKey регистра сведений, DataSeparationHash (общий разделитель учёта), некоторые другие служебные поля, которые очень даже могут играть роль. Кроме того, большинство обработок показывает все таблицы в одну кучу (не путать с понятием sql, хе-хе), и найти в списке таблиц некую Reference425 бывает трудновато, а если интересует конкретное поле, некое Fld666, так и вовсе сплошь неудобно. Хотя, не спорю, есть красивые решения.

Не удалось найти решение, которое бы показывало свойства индексов. Если плохо искал, киньте в меня тапочком.

Что сделал я? Слегка расширенный аналог. Он базируется как на получении структуры средствами 1С, так и на прямых запросах к представлениям системных данных, т.е., например, к sys.tables. Прикрутил, тоже запросом, получение некоторых общих сведений (от версии SQL до SPID, который лень лазить смотреть, или модели архивации БД). А потом сбылась заветная мечта: для текстов запросов, взятых, например, из профайлера, я сделал простенький интерпретатор, который парсит их и переводит большинство термов и названий в понятийную модель 1С и конкретные имена объектов конфигурации. И, ура, наконец-то можно видеть, где будет поиск по кластерному индексу, где по некластерному, а какие поля запроса ваще не индексированы. И щелчком по гиперссылке таблицы можно посмотреть её структуру. Парсинг, конечно, примитивный, ещё есть куда докручивать, но уже приятно. КИП, насколько знаю, именно такие вещи не переводит, ему XML Showplan подавать надо, хотя могу ошибаться.

Вдобавок, сделал именно поиск. Поиск по имени таблицы, по имени поля, по их сочетанию. В том числе нечёткий. После этого понять, что _Fld234 это ИНН контрагента, стало минутным делом. Формат запросов: *[ИмяТаблицы].[*ИмяПоля]. Историю запросов помнит и восстанавливает.

В планах: сделать автоматическую составлялку настроек для трассировки (докопаться до её xml-устройства и скармливать профайлеру), ну и возможно более красивый и полный разбор результатов трассировки. И ещё сделать показ значений параметров, что идут на вход нативным запросам, т.к. @P1 это совсем неинформативно.

Разрабатывалось на 1С 8.3.6 и SQL 2008.

Кому пригодится — будет хорошо.

P.S. Проблему, описанную тут https://habrahabr.ru/post/220863/ не забарывал, и думаю, что можно просто по Order’у попробовать состыковать с порядком в метаданных, да и взять как есть.

15 Comments

  1. cleaner_it

    Хорошая задумка и реализация)

    Reply
  2. Yashazz

    Слушайте, а правда, неужели нет аналогов на ИС, которые бы показывали, например, кластерный ли индекс, уникальный ли? Или я искал хреново?

    Reply
  3. asved.ru

    TrustedConnection=Yes приводит к попытке windows-авторизации на SQL. Если логин USR1CV8 таким правом не обладает (а исходя из соображений безопасности — и не должен), то при попытке подключения вылезает исключение.

    Reply
  4. asved.ru
    P.S. Проблему, описанную тут https://habrahabr.ru/post/220863/ не забарывал

    Это не проблема, а закономерная трудность, возникающая у изобретателей велосипедов на квадратных колесах вроде автора статьи с хабра.

    и думаю, что можно просто по Order’у попробовать состыковать с порядком в метаданных, да и взять как есть

    Да.

    Reply
  5. asved.ru

    PS а вот если оператор обладает правом windows-логина на SQL, то запросы в SQL приятнее будет делать с клиента.

    Reply
  6. artbear
    И, ура, наконец-то можно видеть, где будет поиск по кластерному индексу, где по некластерному, а какие поля запроса ваще не индексированы.

    На картинках не увидел эту фичу.

    Расскажи про нее.

    Reply
  7. Yashazz

    (3) asved.ru, да, есть такой момент. Собираюсь его допиливать.

    (5) ага. Только мне потестить не на чем.

    (6) цветовая разметка. Я смотрю, в каких индексных таблицах есть поле, и если это кластерный, то зелёный, иначе синий. Разумеется, это не полномасштабная схема плана, каковую анализирует КИП, но пока хоть так.

    Reply
  8. Serj1C

    Проблему с перечислениями я решил просто. Завел регистр сведений ЗначенияПеречислений (Измерения: ИмяПеречисления, Порядок, Ссылка; Ресурсы: Значение, Синоним)

    Завел регламентное задание, которое это регистр заполняет/перезаполняет:

    Процедура Заполнить() Экспорт
    
    Менеджер = РегистрыСведений.ЗначенияПеречислений.СоздатьНаборЗаписей();
    
    Для Каждого Эл Из Метаданные.Перечисления Цикл
    Для Каждого Зн Из Эл.ЗначенияПеречисления Цикл
    Стр = Менеджер.Добавить();
    Стр.ИмяПеречисления = Эл.Имя;
    Стр.Порядок = Эл.ЗначенияПеречисления.Индекс(Зн);
    Стр.Значение = Зн.Имя;
    Стр.Синоним = Зн.Синоним;
    Стр.Ссылка = Перечисления[Стр.ИмяПеречисления][Стр.Порядок];
    КонецЦикла;
    КонецЦикла;
    Менеджер.Записать();
    
    КонецПроцедуры
    
    Процедура Очистить() Экспорт
    
    Менеджер = РегистрыСведений.ЗначенияПеречислений.СоздатьНаборЗаписей();
    Менеджер.Записать();
    
    КонецПроцедуры

    Показать

    И в прямых запросах могу спокойно делать соединения по ссылке и получать нормальные значения

    Reply
  9. slawa

    Не смог подключиться

    В чем может быть проблема? Спасибо.

    Задал настройки получил ошибку (скриншот № 1) Причем тут USR1CV8 ?

    Под sa подключаюсь нормально (№ 2)

    Далее точка останова и строка подключения

    Reply
  10. Alias

    (9) Да, такая же фигня. См (3) и (7). Нужно закомментировать «|Trusted_Connection=Yes;» несколькими строчками выше.

    Reply
  11. ulya_zz

    Подскажите, пожалуйста, как увидеть дебиторскую или кредиторскую задолженность в структуре таблиц 1С?

    Reply
  12. Anton18

    Добрый день.

    На самописной конфе на 1С:Предприятие 8.2 (8.2.18.82) падает при открытии — ошибка во вложении.

    На ней же на 1С:Предприятие 8.3 (8.3.12.1685) получаю другую ошибку — во вложении 83

    Может я что-то не так делаю?

    Может ли она проанализировать структуру метаданных и сказать где больше всего нагрузка идёт и из-за чего?

    Заранее спасибо

    Reply
  13. Yashazz

    (11) Задолженность это конструкция смысловая, бизнесовая, к таблицам 1С отношения не имеет. Моделируется обычно регистрами накопления, отвечающими за взаиморасчёты, если речь об упр.базах (таких, как УТ), или регистром бухгалтерии по 60/62 счетам. Структура таблиц тут ничего не даст, вопрос не в эту ветку)

    (12) Может, поубирать всю препроцессорную разметку, и сработает?

    Reply
  14. Salexey

    тут лучше описание https://infostart.ru/public/1093355/

    Reply
  15. Yashazz

    (14) Ага. Так оно и сделано немноооожечко позже.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *