Распаковка хранилища значений средствами MS SQL Server






Способ извлечения данных из 1С-ного «ХранилищеЗначений» в MS SQL Server с помощью самописной скалярной функции (без использования платформы 1С).

В своей предыдущей публикации я продемонстрировал возможность создавать хранимые процедуры на языке C# для расширения возможностей MS SQL Server.

Сегодня я покажу, как можно подобным образом распаковать 1С-ное хранилище значений, используя только хранимые функции в SQL.

В приложении к данной публикации находится сборка (HZ.dll), которая содержит в себе алгоритм по распаковке бинарных данных с помощью своей скалярной функции MS SQL Server, получаемых в результате помещения данных в ХранилищеЗначения с помощью платформы 1С.


Настройка:

Создадим на скуле объект сборки в разделе "Программирование":

CREATE ASSEMBLY HZ FROM '<PATH_TO_ASSEMBLY>HZ.dll'
WITH PERMISSION_SET=EXTERNAL_ACCESS
GO

Затем создадим нашу скалярную функцию:

CREATE FUNCTION UnpackVS(@binData varbinary(max)) RETURNS nvarchar(max)
AS EXTERNAL NAME HZ.ValueStorage.UnpackVS;
GO

Должно получиться подобно этому:


Подготовка тестовых данных:

Создадим в базе 1С, например, новый регистр сведений с одним измерением типа УникальныйИдентификатор и одним ресурсом типа ХранилищеЗначения:

Заполним его тестовой записью:


Проверка:

Найдем в SQL базе таблицу, соответствующую созданному регистру сведений и сделаем запрос:

Полный вид данных, полученных из хранилища значения:


P.S.1:

Алгоритм распаковки вытаскивает из хранилища значений только основной набор данных. После основных данных могут идти еще и бинарные данные, например, картинки, вставленные в табличный документ, который запаковывается в ХранилищеЗначения. Но пока не разобрался со структурой данного формата.


P.S.2:

Не используйте данную функцию к тысячам записей, т. к. это будет не быстро. Также SQL не сможет отобразить большие по размеру распакованные данные, для этого применяйте разбиение строки на подстроки с дальнейшей склейкой результатов на фронт-энде:

,SUBSTRING(dbo.UnpackVS(T.[_Fld9739]),     0, 40000) as HZ_part1
,SUBSTRING(dbo.UnpackVS(T.[_Fld9739]), 40000, 40000) as HZ_part2

Таким простым способом можно использовать самописные функции в SQL, расширяя его возможности.

10 Comments

  1. DrZombi

    где исходники?

    вы с большей вероятностью могли вложить вирус в свою поделку… сир

    Reply
  2. Darklight

    (2)(1)Согалсен, такие наработки лучше в исходниках выкладывать. Вряд ли у Вас там технологиченская тайна на миллион, хотя бы рублей. Да и, вовсе, не продаёте Вы данный инструмент. Зачем скрывать исходник? Он настолько объёмен и уникален, что Вам жалко им делиться?

    Reply
  3. Darklight

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

    Но структура внутри может содержать не только значения типа «Структура» — тут сразу нужно делать универсальное решение распаковки в таблицу для объектов (в т.ч. вложенных): «ТаблицаЗначений»,»ДеревоЗначений», «СписокЗначений», «Структура»(в т.ч. фиксированная), «Соответствие», «Массив». Примитивные типы (а так же УникальныйИдентификатор) тоже можно распаковать, и ссылочные типы -обязательно тоже надо распаковать — остальное — можно пока оставить как есть — вот тогда будет польза в SQL распаковке — тогда к такому датасету можно будет делать SQL запросы, в т.ч. соединять его с таблицами БД.

    Reply
  4. SerVer1C

    (3) Кому очень нужно — тот свой алгоритм разработает. Для остальных — есть готовый продукт. Как посчитаю нужным выложить сорцы, так обязательно это сделаю.

    Reply
  5. SerVer1C

    (4) Данный пример имеет больше академическую ценность, чем практическую. В статье уклон идет больше в сторону создания самописных функций в SQL.

    Reply
  6. Darklight

    (6)Вот лучше бы сделали что-то более практическое (и как раз более сложное) — чтобы как раз можно было бы именно использовать на практике, а не для изучения без исходников

    Reply
  7. SerVer1C

    (7) Следите за моими публикациями…

    Reply
  8. GreenDragon

    Сперва плюсанул, а потом глянул что автор ответил на вопрос про исходники. Нет уж, спасибо. И это на фоне некоей «академической ценности» публикации, как заверяет автор.

    Reply
  9. SerVer1C

    (9) Я знаю другие «площадки», где можно распространять вирусы на очень широкую публику. Здесь ради 5-10 потенциальных скачиваний вообще не вижу смысла терять репутацию и никаких «плюшек» я от этого точно не получу.

    Reply
  10. GreenDragon

    (10) Так много букв, вместо обычного репозитория на github или bitbucket. В общем, удачи. Когда «посчитаете нужным выложить сорцы», они никому уже и даром не нужны будут.

    Reply

Leave a Comment

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