gifts2017

Декодировать содержание таблиц Config, Params и v8users

Опубликовал Женька Ture (ture) в раздел Программирование - Практика программирования

Нередко мы сталкиваемся с ограничениями, которые останавливают нас стеной.
Вот как, скажите, разобраться в базе 1С8 на SQL, если конфигуратор 1С не запускается на веб-сервере?
Нам остается в этом случае разобраться в том, как хранятся данные на сервере. Т.е. увидеть их в том виде, в котором с ними работает платформа 1С.

Сегодня я помогу вам с декодированием отдельных таблиц.

Это компонента не для 1С, а для SQL-сервера. Все действия выполняются в консоли сервера (management studio, скачивается бесплатно, рабочий сервер можно прилинковать и выпонять целевые запросы удаленно)


Подключите компоненту так:
CREATE ASSEMBLY sqlDeflate from 'C:\sqlDll.dll' WITH PERMISSION_SET = SAFE
(для удаления drop ASSEMBLY sqlDeflate)

Свяжите с ней функции, которыми можно будет пользоваться:
CREATE FUNCTION fdecode(@inbyte varbinary(max)) RETURNS varbinary(max) WITH EXECUTE AS CALLER AS EXTERNAL NAME sqlDeflate.[sqlDllmy.sqlDll].decode


CREATE FUNCTION fcode(@inbyte varbinary(max)) RETURNS varbinary(max) WITH EXECUTE AS CALLER AS EXTERNAL NAME sqlDeflate.[sqlDllmy.sqlDll].code


CREATE FUNCTION fdecodeToStr(@inbyte varbinary(max)) RETURNS nvarchar(max) WITH EXECUTE AS CALLER AS EXTERNAL NAME sqlDeflate.[sqlDllmy.sqlDll].decodeToStr

CREATE PROCEDURE load(@Path nvarchar(max))   WITH EXECUTE AS CALLER AS  EXTERNAL NAME sqlDeflate.[sqlDllmy.sqlDll].load

CREATE FUNCTION fdecodeUser(
                                           @inbyte as varbinary(max),
                                           @cmd as nvarchar(max) ,
                                           @sqlPathToTable as nvarchar(max)
) RETURNS nvarchar(max) WITH EXECUTE AS CALLER AS EXTERNAL NAME sqlDeflate.[sqlDllmy.sqlDll].decodeUser


(для удаления: drop FUNCTION fdecode и аналогично остальные)

Выполнять функции возможно после разрешения использовать компоненту:
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'clr enabled', 1;
GO
RECONFIGURE;
GO

Примеры использования:
select dbo.fdecodeUser(t.Data,'decode',''), * from v8users as t
(извлекаем строку)
select dbo.fdecodeUser(t.Data,'hpwd',''), * from v8users as t
(извлекаем хеш пароля)

select dbo.fdecodeUser(t.Data,'pwd ru 6',''), * from v8users as t (до 6 цифр и букв)

select dbo.fdecodeUser(t.Data,'pwd en 6',''), * from v8users as t (до 6 цифр и букв)

select dbo.fdecodeUser(t.Data,'pwd all 6',''), * from v8users as t (до 6 цифр и букв)

select dbo.fdecodeUser(t.Data,'roles id',''), * from v8users as t (роли идентификаторами)

exec dbo.load "test1С.dbo.Params" (инициализация описаний для базы test1С.dbo.Params)

select dbo.fdecodeUser(t.Data,'roles','test1С.dbo.Params'), * from v8users as t (роли именами, требуется указание базы, из которой инициализировались описания)

А это печать содержания DBNames:
declare @var nvarchar(max);
select @var=dbo.fdecodeToStr(t.BinaryData) from Params as t where t.FileName='DBNames';
--печатаем
DECLARE @Counter INT
SET @Counter = 0
DECLARE @TotalPrints INT
SET @TotalPrints = (LEN(@var) / 4000) + 1
WHILE @Counter < @TotalPrints
BEGIN
PRINT SUBSTRING(@var, @Counter * 4000, 4000)
SET @Counter = @Counter + 1
END

Важно понимать, что какие-то данные (к примеру, Config и Params) просто сжаты алгоритмом Deflate, а какие-то (v8users) уже именно закодированы.
Я не стал писать обратное кодирование для v8users, т.к. легко себе представил, как оно может доставить неприятности (кто-нибудь по неопытности может мимо платформы вписать в таблицу свои данные).

Надеюсь этот мануал будет полезен для восстановления работоспособности базы 1С8. И конечно для отчетов по ролям пользователей пригодится.

Скачать файлы

Наименование Файл Версия Размер
Компонента 9
.dll 10,00Kb
31.05.15
9
.dll 10,00Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Михаил Максимов (МихаилМ) 15.05.15 18:16
на этом форуме уже были 2 подобные clr библиотеки в готовом виде
и 2 в виде исходников.

http://infostart.ru/public/88850/
http://infostart.ru/public/21461/

и мб
http://infostart.ru/public/75831/

интересней были бы примеры использования. парсинг метаданных и dbnames и прочего.
2. Женька Ture (ture) 15.05.15 18:19
(1) ими и вдохновился.
Кое-что добавил от себя, чтоб самому потом пользоваться. В любом случае, публикация давно не в топе и монеток не приносит.

Примеры парсинга метаданных?
- Там какой-то неправильный json. Сколько на него не смотрю, всегда склоняюсь к мысли, что это json, но только после удаления каких-то полей, чтоб место под хранение сократить. С парсингом проблем быть не должно и в таком виде. Это текст. Я из него простейшими регулярками вынимаю нужные фрагменты (единственно, где мне роли потребовались).
Парсинг в конечном счете заканчивается view к таблицам http://infostart.ru/public/352750/, которые делаются непосредственно из 1С. Принято считать, что за view должны стоять реальные данные и критерии отборов сделать так нельзя. Это ошибочный взгляд, я делаю и критерии отборов в публикации без проблем.
Получается, что у парсинга по SQL очень специфичное применение. Я, к примеру, вынужден парсить базу 1С, где команда боится и тормозит любое начинание. Но если доступ есть к 1С и view разрешено делать, то парсить остается только что-то совсем уж специфичное (v8users, к примеру) - но это уже баловство.

Мной msdn использовался в основном, нет секретов совсем. По кодированию паролей опять же открытые источники все (форумы сплошные, ссылки некуда давать, там пароли гадают на заказ).