Определение имен 1С для БД MS SQL c использование полнотекстового индексирования строк конфигуратора.


Данные sql-скрипты и Clr-функции (VS 2010, MS SQL Server 2008) предназначены для извлечения из 1Сv82 (MS SQL) данных об именах 1С для таблиц и столбцов БД MS SQL с использованием полнотекстового поиска. Предполагаемое использование : интеграция 1С. Не использует средства 1С.  

См вложение.

Данные sql-скрипты и Clr-функции (VS 2010, MS SQL Server 2008) предназначены для извлечения из 1Сv82 (MS SQL) данных об именах 1С для таблиц и столбцов БД MS SQL с использованием полнотекстового поиска. Предполагаемое использование : интеграция 1С. Не использует средства 1С. 

 

О том, как устроены clr-функции и как их разворачивать на сервере см. http://msdn.microsoft.com/ru-ru/library/w2kae45k.aspx

В примере база 1С установлена в [Ad], а Clr развернуты в [Rig], но можно ставить их и вместе.

Искомые данные содержатся в двух таблицах : Params и Config.

Из Params они извлекаются запросом

SELECT BinaryData FROM Params WHERE FileName = N'DBNames'

Полученное поле имеет двоичный формат и читается функцией lines. Она принимает аргумент SQLBytes  и возвращает в таблицу @db набор строк вида

{49bec45b-a7ee-4cb0-9de5-19440ac12e4b,"CKinds",1},

{ed0a9c1c-c7eb-47b6-b75b-7a2a1b3d38ce,"Node",2},

{16e8215b-eadd-4663-aff6-c400a657d768,"Node",3},

...

В начале строки - ключ 1С типа char(36)  (k36) , по которому осуществляется привязка к Config, в конце - индекс sql-наименования столбца или таблицы (num), по которому можно это самое наименование однозначно определить  в дальнейшем.

Полученный выше набор ключей 1С (Select k36 from @db)содержит, в том числе, ключи таблиц 1С, которым соответствуют поля [FileName] в Config.  Из последнего извлекаются записи с where [FileName] in (Select k36 from @db),

а поля BinaryData распаковываются в наборы строк вышеупомянутой функцией lines.

insert Clines

SELECT [FileName], f.Line [CLine]

  FROM [dbo].[Config]

  cross apply [Rig].[dbo].[lines] ([BinaryData]) f

  where [FileName] in (Select k36 from @db)

Однако далее возникает проблема, связанная с большим объемом данных, полученных при распаковке. В моем варианте он составил около 300 тыс. строк текста, из которого надо извлечь ключи char(36).

Вариант решения связан с полнотекстовым индексированием полученных строк и использованием предиката CONTAIN  вида

SELECT *   WHERE CONTAINS(c.CLine, @k36) and LEFT(c.CLine, 5)='{0,0,'

Второе условие в WHERE - это просто выделение строк с 1С -именами.

Далее полученная таблица привязывается к представлениям метаданных [INFORMATION_SCHEMA].[TABLES],[INFORMATION_SCHEMA].[COLUMNS]

c  помощью  индекса num.  Он формируется с помощью функции fnGetNum, которая выделяет группу цифр подряд в конце имени таблицы или столбца, например из  _Acc6_ExtDim8081 получится 8081.

 

Остальное в комментариях внутри скриптов.

 

 

Файлы обработки:

-