В своей предыдущей публикации я продемонстрировал возможность создавать хранимые процедуры на языке 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:
Алгоритм распаковки вытаскивает из хранилища значений только основной набор данных. После основных данных могут идти еще и дополнительные бинарные данные (вложения), например, картинки, вставленные в табличный документ. Удалось разобраться со структурой этих данных: после основного текста идёт 4-х байтовый индекс вложения, затем идут 8 байт длины тела вложения и тело вложения (по аналогии с основными данными), и т.д.
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, расширяя его возможности.