Распаковка хранилища значений средствами MS SQL Server
Разработка - Групповая разработка (Git, хранилище)
Файлы
ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.
Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний
Оформите подписку на компанию для решения рабочих задач
Оформить подписку и скачать решение со скидкойВы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
В своей предыдущей публикации я продемонстрировал возможность создавать хранимые процедуры на языке 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, расширяя его возможности.
Вступайте в нашу телеграмм-группу Инфостарт
См. также
02.11.2026 466 vanya_gonchar 2