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

08.08.21

Разработка - Групповая разработка (Git, хранилище)

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

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
Сборка
.dll 18,50Kb ver:1.0.0.0
13 2 500 руб. Купить

Подписка 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, расширяя его возможности.

Вступайте в нашу телеграмм-группу Инфостарт

ХранилищеЗначения хранимые процедуры функции скалярные SQL C#

См. также

Разработка Инструментарий разработчика Групповая разработка (Git, хранилище) Разработчик Платные (руб)

Практический курс по работе с AI-агентами для разработчиков 1С уровня middle и senior, а также тимлидов команд: от постановки задач и передачи контекста до создания расширений, интеграций, MCP-инструментов, тестов и проверки готового решения.

50000 руб.

10.09.2026    13299    104    0    

78

DevOps и автоматизация разработки Групповая разработка (Git, хранилище) Системный администратор Разработчик 1С 8.3 1С 8.5 Бесплатно (free)

В прошлой статье у ERP оставалось 89 отказов загрузки, у ЗУП — 19. Теперь обе конфигурации совпали с эталонами, а собранные файлы прошли круг через платформу. Развертка выделена в открытый репозиторий cf-unwrapper: библиотека на Rust и консольная утилита. Показываю результаты, объясняю границы «100%» и приглашаю к проверкам и развитию проекта.

02.11.2026    233    oyti    1    

1

DevOps и автоматизация разработки Групповая разработка (Git, хранилище) Разработчик 1С:Предприятие 8 Россия Бесплатно (free)

Практическое руководство для команд, которые хотят уйти с хранилища конфигурации на git, не переходя на новую среду разработки. Подойдёт разработчикам и тимлидам, которые настраивают командную разработку на типовых и собственных конфигурациях.

02.11.2026    466    vanya_gonchar    2    

5

Файловый обмен (TXT, XML, DBF), FTP DevOps и автоматизация разработки Групповая разработка (Git, хранилище) Системный администратор Разработчик 1С 8.5 Бесплатно (free)

В прошлой статье я выгрузил Бухгалтерию в XML байт в байт и спросил, на чем проверить дальше. Вы ответили: ERP, старые релизы, зарплата. Прогнал пять конфигураций, от клиента ЭДО до ERP на 120 тысяч файлов. Рассказываю, что сломалось после Бухгалтерии, почему эталону платформы нельзя верить на слово, как выгрузить одну конфигурацию в формат трех версий платформы - и почему cf-конвертер становится отдельным продуктом, Разверткой.

02.11.2026    311    oyti    2    

3

Инструментарий разработчика Групповая разработка (Git, хранилище) Разработчик Стажер 1С 8.3 Абонемент ($m)

Два разработчика, по десять правок «Нано-УТ 2.0» в git: длинные ветки против слияния после каждой правки, 22 слияния с загрузкой main в чистую базу. ConfigDumpInfo.xml конфликтовал в 11 слияниях из 11, построчное объединение ломало XML и модули. Показываю, что убрать строкой в .gitattributes, что разбирать целыми вставками и как увидеть конфликты до слияния. Прилагаются инструмент с 38 тестами и материалы опыта.

1 стартмани

29.10.2026    333    Ninel_S    3    

-1

DevOps и автоматизация разработки Групповая разработка (Git, хранилище) Файловый обмен (TXT, XML, DBF), FTP Системный администратор Разработчик 1С 8.5 Бесплатно (free)

Выгрузка типовой Бухгалтерии в XML через базу занимает больше четырёх минут. Я написал движок, который читает файл конфигурации напрямую и выгружает его за 35 секунд, совпадая с выгрузкой платформы байт в байт во всех 90 385 файлах. Загрузка обратно тоже работает: круг через платформу совпадает полностью. Рассказываю, как ускоряли, как проверяем и что при загрузке XML теряет сама платформа. А в конце спрашиваю, нужно ли это кому-то, кроме меня, и на какой конфигурации проверить следующей.

27.10.2026    883    oyti    20    

16

Рефакторинг и качество кода Групповая разработка (Git, хранилище) Разработчик 1С 8.3 Абонемент ($m)

Скрипт на Python посчитал метрики 2711 общих модулей УТ 11.5: 26 модулей длиннее 10 000 строк кода. Проверила счёт на синтетических модулях и показала, где рейтинг ошибается: самый длинный модуль оказался в нём ниже девяти коротких. Для разработчиков 1С. В архиве скрипт, тесты и журналы.

1 стартмани

26.10.2026    374    Ninel_S    8    

-3

Групповая разработка (Git, хранилище) Разработчик 1С 8.3 Абонемент ($m)

Общие модули 1С вынесла в подмодуль Git и подключила к двум проектам на выгрузке «Нано-УТ» и платформе 8.3.27. Подмодуль на весь каталог CommonModules загружается; клон без --recursive даёт код 1, а забытый указатель и смена ветки молча дают базу не той версии. Переименованная процедура прошла /CheckModules при 28 вызовах. В архиве скрипты, диагностика подмодулей, тесты и журналы.

1 стартмани

26.10.2026    348    Ninel_S    0    

-1
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. DrZombi 320 24.09.19 09:47 Сейчас в теме
где исходники?
вы с большей вероятностью могли вложить вирус в свою поделку... сир
2. SerVer1C 1146 24.09.19 10:31 Сейчас в теме
(1)
могли вложить вирус в свою поделку
Не для этого пишу здесь )))
Вам и в платформе вирус могут подсунуть. Используйте средства защиты )
https://www.virustotal.com/gui/file/942da1ec360cee0a62df85fafc86f17fa340ccf9880d12e­617e88adc2c0453ba/detection
YaroslavHolovatiy; +1 –3 Ответить
3. Darklight 38 24.09.19 16:31 Сейчас в теме
(2)(1)Согалсен, такие наработки лучше в исходниках выкладывать. Вряд ли у Вас там технологиченская тайна на миллион, хотя бы рублей. Да и, вовсе, не продаёте Вы данный инструмент. Зачем скрывать исходник? Он настолько объёмен и уникален, что Вам жалко им делиться?
5. SerVer1C 1146 25.09.19 09:17 Сейчас в теме
(3) Кому очень нужно - тот свой алгоритм разработает. Для остальных - есть готовый продукт. Как посчитаю нужным выложить сорцы, так обязательно это сделаю.
12. пользователь 17.09.20 07:24
Сообщение было скрыто модератором.
...
13. пользователь 17.09.20 08:12
Сообщение было скрыто модератором.
...
4. Darklight 38 24.09.19 16:43 Сейчас в теме
А в чём смысл распаковывания именно на SQL хранилища значений? Алгоритмам (вне 1С), которым это надо проще распаковать их уже после получения из СУБД. Разве нет? Уж очень специфическая область применения распаковки на SQL - выходит. Тем более что в таком строковом представлении значения в формате сериализации в строку внутр 1С - тоже не особо кому интересно. На SQL более менее интересной может быть только распаковка значений, которые можно будет представить их в виде таблиц. Даже структуру можно было бы далее распаковать в датасет - конечно тут что-то нужно с вложенностью придумывать - но простейший случай - это распаковать в развёрнутом виде - где вложенные уровни хранятся в той же таблице - в других строках - а доступ к ним - классический - по ключу и левому соединению с самим собой.
Но структура внутри может содержать не только значения типа "Структура" - тут сразу нужно делать универсальное решение распаковки в таблицу для объектов (в т.ч. вложенных): "ТаблицаЗначений","ДеревоЗначений", "СписокЗначений", "Структура"(в т.ч. фиксированная), "Соответствие", "Массив". Примитивные типы (а так же УникальныйИдентификатор) тоже можно распаковать, и ссылочные типы -обязательно тоже надо распаковать - остальное - можно пока оставить как есть - вот тогда будет польза в SQL распаковке - тогда к такому датасету можно будет делать SQL запросы, в т.ч. соединять его с таблицами БД.
6. SerVer1C 1146 25.09.19 09:19 Сейчас в теме
(4) Данный пример имеет больше академическую ценность, чем практическую. В статье уклон идет больше в сторону создания самописных функций в SQL.
7. Darklight 38 25.09.19 12:00 Сейчас в теме
(6)Вот лучше бы сделали что-то более практическое (и как раз более сложное) - чтобы как раз можно было бы именно использовать на практике, а не для изучения без исходников
8. SerVer1C 1146 25.09.19 16:48 Сейчас в теме
(7) Следите за моими публикациями...
9. GreenDragon 01.10.19 15:50 Сейчас в теме
Сперва плюсанул, а потом глянул что автор ответил на вопрос про исходники. Нет уж, спасибо. И это на фоне некоей "академической ценности" публикации, как заверяет автор.
bds22; VVi3ard; +2 – Ответить
10. SerVer1C 1146 01.10.19 19:52 Сейчас в теме
(9) Я знаю другие "площадки", где можно распространять вирусы на очень широкую публику. Здесь ради 5-10 потенциальных скачиваний вообще не вижу смысла терять репутацию и никаких "плюшек" я от этого точно не получу.
11. GreenDragon 01.10.19 19:55 Сейчас в теме
(10) Так много букв, вместо обычного репозитория на github или bitbucket. В общем, удачи. Когда "посчитаете нужным выложить сорцы", они никому уже и даром не нужны будут.
14. Angry 11 06.02.26 23:46 Сейчас в теме
Что-то не работает.
Не удалось выполнить CREATE ASSEMBLY для сборки "HZ", так как для сборки "HZ" не установлено доверие. Сборка является доверенной в одном из следующих случаев: сборка подписана сертификатом или асимметричным ключом, которому соответствует имя для входа с разрешением UNSAFE ASSEMBLY, либо для сборки установлено доверие с помощью процедуры sp_add_trusted_assembly.

Если обойти, то при выполнении все равно ошибку выдает:
Произошла ошибка .NET Framework во время выполнения определяемой пользователем подпрограммы или агрегатной функции "UnpackVS":
System.OverflowException: Измерения массива превысили поддерживаемый диапазон.
System.OverflowException:
в 㙓䲢鮎崚綬ᶁ硡.䞤暙ꍷᣏ鬀饊쎉(Byte[]& ‣豽賟䰲㸁ꉶ桸, Int32 뉖閴ӡ뼗ᛌ헆茈, String& ⤨䆐榷顗좙擂鞡)
в 㙓䲢鮎崚綬ᶁ硡.䭰䮔潘햀㌯返⒐㑱(Byte[] 㪁与刻㔏㯠痃)
в ValueStorage.UnpackVS(SqlBinary inputData)
.
15. SerVer1C 1146 06.02.26 23:53 Сейчас в теме
(14) Версия скуля какая ?
Сноску P.S.2 читали?
Так я не понял, вы сборку зарегили или нет, как понимать "Если обойти..." ??
16. Angry 11 07.02.26 00:29 Сейчас в теме
(15) Для 1 строки делаю.
SQL 22

конфиг поправил
clr enabled

Добавил хранимку в базу
ALT ER DATABASE ... SET TRUSTWORTHY ON;
17. SerVer1C 1146 07.02.26 00:51 Сейчас в теме
(16) Почитайте суть причины здесь: https://infostart.ru/1c/tools/1776312/

я пересоберу и выложу под новые скули
18. SerVer1C 1146 07.02.26 01:24 Сейчас в теме
(16) Оказывается, пересобирать сборку не надо, она под Framework 3.5, так что будет работать с новыми SQL серверами.

Проверил у себя на 2019-м SQL - нормально работает, только регистрировать сборку надо хитрым образом (с ключами, разрешениями, доступами - погуглите на эту тему)
Прикрепленные файлы:
19. SerVer1C 1146 07.02.26 01:30 Сейчас в теме
(14) а вот эту ошибку
Msg 6522, Level 16, State 1, Line 2
A .NET Framework error occurred during execution of user-defined routine or aggregate "UnpackVS": 
System.OverflowException: Array dimensions exceeded supported range.
System.OverflowException: 
   at 㙓䲢鮎崚綬ᶁ硡.䭰䮔潘햀㌯返⒐㑱(Byte[] 㪁与刻㔏㯠痃)
   at ValueStorage.UnpackVS(SqlBinary inputData)

вы словили, потому что в функцию передаёте НЕ ХранилищеЗначения, а простой бинарник. Будьте внимательнее.
Для отправки сообщения требуется регистрация/авторизация