powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / [игнор отключен] [закрыт для гостей] / GUID из 1С в MS SQL и обратно, как реализовывается?
25 сообщений из 129, страница 2 из 6
GUID из 1С в MS SQL и обратно, как реализовывается?
    #39694958
Фотография sc2r2bey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vitkhv,


Код: php
1.
скульныйгуид = "0x" + СтрПолучитьСтроку(гуид,4) + СтрПолучитьСтроку(гуид,5) + СтрПолучитьСтроку(гуид,3) + СтрПолучитьСтроку(гуид,2) + СтрПолучитьСтроку(гуид,1); 


гуид это, который мы получили из

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
CREATE function [dbo].[sp_getid] (@id binary(16)) 
	returns char(36) 
    	as 
	begin 
	declare @unidentifier char(36) 
	declare @charvalue char(36) 
	select @unidentifier = CONVERT(char(36),CAST(@id as uniqueidentifier)) 
		select @charvalue = 
		right(@unidentifier, 8) 
		+ substring(@unidentifier,24,5) 
		+ substring(@unidentifier,19,5) 
		+ '-' 
		+ substring(@unidentifier,7,2) 
		+ substring(@unidentifier,5,2) 
		+ '-' 
		+ substring(@unidentifier,3,2) 
		+ left(@unidentifier,2) 
		+ substring(@unidentifier,12,2) 
		+ substring(@unidentifier,10,2) 
		+ substring(@unidentifier,17,2) 
		+ substring(@unidentifier,15,2) 
	
		return ( @charvalue ) 
		end; 
...
Рейтинг: 0 / 0
GUID из 1С в MS SQL и обратно, как реализовывается?
    #39694967
vitkhv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sc2r2beyя правильно понял:
Код: php
1.
Зн = "0x" + Лев(Прав(Зн, 33), 32);


Зн - это GUID, мы берем 33 символа справа, потом из полученного результата 32 символа слева и конкатенируем с 0x

ну да, только эта функция преобразовывает значение полученное 1С ной функцией ЗначениеВСтрокуВнутр(). У вас та такой нет, поэтому вам она не нужна. Просто в начале не понятно было, что вам нужно, я думал вы в 1С пишите.
...
Рейтинг: 0 / 0
GUID из 1С в MS SQL и обратно, как реализовывается?
    #39694975
vitkhv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sc2r2beyvitkhv,


Код: php
1.
скульныйгуид = "0x" + СтрПолучитьСтроку(гуид,4) + СтрПолучитьСтроку(гуид,5) + СтрПолучитьСтроку(гуид,3) + СтрПолучитьСтроку(гуид,2) + СтрПолучитьСтроку(гуид,1); 


гуид это, который мы получили из

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
CREATE function [dbo].[sp_getid] (@id binary(16)) 
	returns char(36) 
    	as 
	begin 
	declare @unidentifier char(36) 
	declare @charvalue char(36) 
	select @unidentifier = CONVERT(char(36),CAST(@id as uniqueidentifier)) 
		select @charvalue = 
		right(@unidentifier, 8) 
		+ substring(@unidentifier,24,5) 
		+ substring(@unidentifier,19,5) 
		+ '-' 
		+ substring(@unidentifier,7,2) 
		+ substring(@unidentifier,5,2) 
		+ '-' 
		+ substring(@unidentifier,3,2) 
		+ left(@unidentifier,2) 
		+ substring(@unidentifier,12,2) 
		+ substring(@unidentifier,10,2) 
		+ substring(@unidentifier,17,2) 
		+ substring(@unidentifier,15,2) 
	
		return ( @charvalue ) 
		end; 



да. Функция полностью выглядит так:
Код: sql
1.
2.
3.
4.
5.
гуид = Строка(докссылка.УникальныйИдентификатор());
Для й = 1 по СтрЧислоВхождений(гуид,"-") Цикл
гуид = СтрЗаменить(гуид,"-", Символы.ПС);
КонецЦикла;
скульныйгуид = "0x" + СтрПолучитьСтроку(гуид,4) + СтрПолучитьСтроку(гуид,5) + СтрПолучитьСтроку(гуид,3) + СтрПолучитьСтроку(гуид,2) + СтрПолучитьСтроку(гуид,1); 
...
Рейтинг: 0 / 0
GUID из 1С в MS SQL и обратно, как реализовывается?
    #39694982
Фотография sc2r2bey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot vitkhv]sc2r2beyvitkhv,
да. Функция полностью выглядит так:
Код: sql
1.
2.
3.
4.
5.
гуид = Строка(докссылка.УникальныйИдентификатор());
Для й = 1 по СтрЧислоВхождений(гуид,"-") Цикл
гуид = СтрЗаменить(гуид,"-", Символы.ПС);
КонецЦикла;
скульныйгуид = "0x" + СтрПолучитьСтроку(гуид,4) + СтрПолучитьСтроку(гуид,5) + СтрПолучитьСтроку(гуид,3) + СтрПолучитьСтроку(гуид,2) + СтрПолучитьСтроку(гуид,1); 



Сейчас синтаксис 1С выучу ))

авторгуид = Строка(докссылка.УникальныйИдентификатор()); - это, например,
Код: php
1.
50cb4263-dd5c-11e6-898b-bcaec5369a36


авторДля й = 1 по СтрЧислоВхождений(гуид,"-") Цикл
гуид = СтрЗаменить(гуид,"-", Символы.ПС);
КонецЦикла;
Это непонятно, зачем цикл, чтобы удалить "-", т.е. должно получится "50cb4263dd5c11e6898bbcaec5369a36"
...
Рейтинг: 0 / 0
GUID из 1С в MS SQL и обратно, как реализовывается?
    #39694986
vitkhv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sc2r2bey,

этот цикл преобразовывает 50cb4263-dd5c-11e6-898b-bcaec5369a36
в:
50cb4263
dd5c
11e6
898b
bcaec5369a36

итого 5 строк.
а потом просто строчку по номеру получает и в новом порядке их конкатенирует с добавлением 0x
...
Рейтинг: 0 / 0
GUID из 1С в MS SQL и обратно, как реализовывается?
    #39694992
Фотография sc2r2bey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vitkhvsc2r2bey,

этот цикл преобразовывает 50cb4263-dd5c-11e6-898b-bcaec5369a36
в:
50cb4263
dd5c
11e6
898b
bcaec5369a36

итого 5 строк.
а потом просто строчку по номеру получает и в новом порядке их конкатенирует с добавлением 0x
т.е. это получается массив/коллекция, его собираем в строку "0х" + "898bbcaec5369a3611e6dd5c50cb4263"
Получилось, спасибо!!! Ты гений :)
...
Рейтинг: 0 / 0
GUID из 1С в MS SQL и обратно, как реализовывается?
    #39695011
vitkhv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sc2r2bey,
да но только в 1С это работа с объектом текст, можно и через массив/коллекцию в той же 1С. С текстом просто быстрее будет.
Еще быстрее если со строкой работать:
Код: sql
1.
'0x'+SUBSTRING(@GUID1С,20,4)+SUBSTRING(@GUID1С,25,13)+SUBSTRING(@GUID1С,15,4)+SUBSTRING(@GUID1С,10,4)+SUBSTRING(@GUID1С,1,8)


в 1С даже синтаксис такой же.
...
Рейтинг: 0 / 0
GUID из 1С в MS SQL и обратно, как реализовывается?
    #39695051
Фотография sc2r2bey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vitkhv, большое человеческое спасибо, я много дополнительного для себя подчерпнул!
...
Рейтинг: 0 / 0
GUID из 1С в MS SQL и обратно, как реализовывается?
    #39695363
vitkhv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sc2r2bey,
всегда пожалуйста.

Дальше пишу как для вас, так и заметку для себя.

Функцию по получению UID из GUID написал свою:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE function [dbo].[sp_getid_] (@id binary(16)) 
	returns char(36) 
    WITH SCHEMABINDING
	as 
	begin 
	declare @unidentifier char(36),@charvalue char(36) 
	  
	SET @unidentifier = CONVERT(char(36),@id,1);  
	select @charvalue = SUBSTRING(@unidentifier,27,8)+'-'+SUBSTRING(@unidentifier,23,4)+'-'+SUBSTRING(@unidentifier,19,4)+'-'+SUBSTRING(@unidentifier,3,4)+'-'+SUBSTRING(@unidentifier,7,12); 
	

	return (@charvalue) 
	end; 
 


работает на 10-15% быстрее вот этой функции неизвестного автора:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
CREATE function [dbo].[sp_getid] (@id binary(16)) 
	returns char(36) 
    	as 
	begin 
	declare @unidentifier char(36) 
	declare @charvalue char(36) 
	select @unidentifier = CONVERT(char(36),CAST(@id as uniqueidentifier)) 
		select @charvalue = 
		right(@unidentifier, 8) 
		+ substring(@unidentifier,24,5) 
		+ substring(@unidentifier,19,5) 
		+ '-' 
		+ substring(@unidentifier,7,2) 
		+ substring(@unidentifier,5,2) 
		+ '-' 
		+ substring(@unidentifier,3,2) 
		+ left(@unidentifier,2) 
		+ substring(@unidentifier,12,2) 
		+ substring(@unidentifier,10,2) 
		+ substring(@unidentifier,17,2) 
		+ substring(@unidentifier,15,2) 
	
		return ( @charvalue ) 
		end; 


Думаю автор использовал преобразование binary через uniqueidentifier к CHAR , потому как видимо не разобрался как напрямую конвертировать binary в CHAR, CAST например это делать не умеет, только CONVERTс доп. параметром.


В моем варианте функции можно использовать вместо "+" для конкатенации функцию CONCAT (c 2012 MSSQL) или что еще лучше CONCAT_WS (c 2017 MSSQL) будет еще на 2-3% быстрее:
Код: sql
1.
CONCAT_WS('-',SUBSTRING(@unidentifier,27,8),SUBSTRING(@unidentifier,23,4),SUBSTRING(@unidentifier,19,4),SUBSTRING(@unidentifier,3,4),SUBSTRING(@unidentifier,7,12)); 


Вроде кажется, что такое 2-3 %, а на самом деле в нескольких местах выжмешь эти проценты и вот весь код начинает работать на 30-50% быстрее. Поэтому я такими вещами лучше не пренебрегать.

Ну и еще для тренировки написал функцию преобразования аналогичную:
Код: sql
1.
2.
3.
4.
5.
гуид = Строка(докссылка.УникальныйИдентификатор());
Для й = 1 по СтрЧислоВхождений(гуид,"-") Цикл
гуид = СтрЗаменить(гуид,"-", Символы.ПС);
КонецЦикла;
скульныйгуид = "0x" + СтрПолучитьСтроку(гуид,4) + СтрПолучитьСтроку(гуид,5) + СтрПолучитьСтроку(гуид,3) + СтрПолучитьСтроку(гуид,2) + СтрПолучитьСтроку(гуид,1);


но на TSQL:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
declare @GUIDasStr char(36),@GUID1С char(36);

SET @GUID1С = '3c29ac92-4a0b-11e8-9414-bcaec5369a36'

SELECT @GUIDasStr = '0x'+STRING_AGG(value,'') WITHIN GROUP(ORDER BY row ) /*функция доступна с 2017*/
FROM(
	SELECT CASE row 
		WHEN 4 THEN 1 
		WHEN 5 THEN 2 
		WHEN 3 THEN 3 
		WHEN 2 THEN 4 
		WHEN 1 THEN 5
		END row
	,value	 
	FROM(
		SELECT 
			ROW_NUMBER() OVER(ORDER BY 1/0) row, 
			value 
		FROM STRING_SPLIT(@GUID1С, '-') /*функция доступна с 2016*/
	)iQ
)iQQ; 

select ( CONVERT(binary(16),@GUIDasStr,1) ) 


Кстати самая тормозная часть этого запроса, желательно переписать:
Код: sql
1.
 WITHIN GROUP(ORDER BY row ) 


писал чтобы потренироваться в использовании табличной функции STRING_SPLIT. Функция удобная конечно, но для наших целей намного быстрее будет функция:
Код: sql
1.
'0x'+SUBSTRING(@GUID1С,20,4)+SUBSTRING(@GUID1С,25,13)+SUBSTRING(@GUID1С,15,4)+SUBSTRING(@GUID1С,10,4)+SUBSTRING(@GUID1С,1,8) 

или если MSSQL 2017 через CONCAT_WS вместо "+".
...
Рейтинг: 0 / 0
GUID из 1С в MS SQL и обратно, как реализовывается?
    #39697296
Фотография sc2r2bey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что-то все некорректно работает
...
Рейтинг: 0 / 0
GUID из 1С в MS SQL и обратно, как реализовывается?
    #39697387
vitkhv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sc2r2beyчто-то все некорректно работает

Ну так проверьте почему?

Что выдаст такой запрос:
Код: sql
1.
2.
3.
4.
5.
declare @GUIDasStr char(36),@GUID1С char(36);
SET @GUID1С ='3c29ac92-4a0b-11e8-9414-bcaec5369a36'
SET @GUIDasStr ='0x'+SUBSTRING(@GUID1С,20,4)+SUBSTRING(@GUID1С,25,13)+SUBSTRING(@GUID1С,15,4)+SUBSTRING(@GUID1С,10,4)+SUBSTRING(@GUID1С,1,8)

SELECT * FROM _ReferenceXXX WHERE _IDRRef = CONVERT(binary(16),@GUIDasStr,1)



Где _ReferenceXXX это таблица справочника (вместо XXX номер), к которого должен формироваться запрос.
...
Рейтинг: 0 / 0
GUID из 1С в MS SQL и обратно, как реализовывается?
    #39697393
vitkhv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если не знаете название таблицы, в 1С в табло выполните такой код:

Код: sql
1.
ПолучитьСтруктуруХраненияБазыДанных().Найти("Справочник.НужныйМнеСправочник","ИмяТаблицы").ИмяТаблицыХранения



вместо НужныйМнеСправочник напишите нужный справочник.
...
Рейтинг: 0 / 0
GUID из 1С в MS SQL и обратно, как реализовывается?
    #39697397
vitkhv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для общей проверки работоспособности функции в табло выпоните такой код:
Код: sql
1.
Справочники.НужныйМнеСправочник.НайтиПоКоду("00000014622").УникальныйИдентификатор();


вместо НужныйМнеСправочник напишите нужный справочник.
вместо 00000014622 подставьте код имеющийся в НужномСправочнике.

Результат выполнения этой функции, а получиться что то подобное: "3c29ac92-4a0b-11e8-9414-bcaec5369a36"

вставляете в переменную @GUID1С вышеуказанного SQL запроса, соответственно вместо _ReferenceXXX подставляете результат функции ПолучитьСтруктуруХранения.

Табло вызывается в меню->сервис->табло

Выполняете, смотрите думаете.
...
Рейтинг: 0 / 0
GUID из 1С в MS SQL и обратно, как реализовывается?
    #39697577
Фотография sc2r2bey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Напомню еще раз я не 1Сник, поэтому она далеко от меня, есть только SQL Server и веб сервер
Я получал GUID обоими функциями, потом на php преобразую в бинарник и пишу в базу, смотрю в 1С запись есть и все данные подтягиваются, но при при попытке открыть элемент справочника пишет объект не найден
...
Рейтинг: 0 / 0
GUID из 1С в MS SQL и обратно, как реализовывается?
    #39697603
vitkhv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sc2r2bey,
авторпотом на php преобразую в бинарник

Как вы его на PHP преобразуете?
...
Рейтинг: 0 / 0
GUID из 1С в MS SQL и обратно, как реализовывается?
    #39697614
vitkhv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sc2r2beyпишет объект не найден
там д.б. в таком виде: 193 86f0b888e3fcbec611e873b98345ccc8 первая цифра до пробела это и есть номер таблицы.

т.е. запрос в данном случае будет выглядеть так SELECT * FROM _Refernce193, а дальше неправильно преобразованный ГУИД 86f0b888e3fcbec611e873b98345ccc8 т.е. вам бы найти исходник GUID, и посмотреть в каком месте происходит неверное преобразование.
...
Рейтинг: 0 / 0
GUID из 1С в MS SQL и обратно, как реализовывается?
    #39697619
vitkhv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для того,чтобы точно убедиться, что там справочник выполните такой запрос:
Код: sql
1.
2.
3.
Select [TABLE_NAME] 
From INFORMATION_SCHEMA.TABLES
where TABLE_NAME like '%[A-Z,a-z]XXX'


где XXX номер таблицы из битой ссылки.
193 86f0b888e3fcbec611e873b98345ccc8

в данном случае 193.
...
Рейтинг: 0 / 0
GUID из 1С в MS SQL и обратно, как реализовывается?
    #39697626
vitkhv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну а дальше уже выполняете вот это:

Код: sql
1.
2.
3.
4.
5.
declare @GUIDasStr char(36),@GUID1С char(36);
SET @GUID1С ='3c29ac92-4a0b-11e8-9414-bcaec5369a36'
SET @GUIDasStr ='0x'+SUBSTRING(@GUID1С,20,4)+SUBSTRING(@GUID1С,25,13)+SUBSTRING(@GUID1С,15,4)+SUBSTRING(@GUID1С,10,4)+SUBSTRING(@GUID1С,1,8)

SELECT * FROM _ReferenceXXX WHERE _IDRRef = CONVERT(binary(16),@GUIDasStr,1)



где @GUID1С берете из вашего файла обмена, а вместо _ReferenceXXX подставляете таблицу полученную в результате выполнения предыдущего запроса.
...
Рейтинг: 0 / 0
GUID из 1С в MS SQL и обратно, как реализовывается?
    #39697787
Фотография sc2r2bey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
там что-то с 1С разбираются, как там все под капотом работает
...
Рейтинг: 0 / 0
GUID из 1С в MS SQL и обратно, как реализовывается?
    #39697803
vitkhv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sc2r2beyтам что-то с 1С разбираются, как там все под капотом работает

Там видимо данные не догружаются, т.е. это не справочник не загрузился а, реквизит из этого справочника. Т.е. сам справочник загрузился нормально (иначе вы бы вообще ничего не увидели), а вот на то, что ссылается реквизит не загрузилось (другой справочник или перечисление или ПВХ или Документ). Поэтому я и говорю, выполните запрос который я дал и посмотрите есть ли вообще данные в таблице и что это за таблица. В общем донастраивайте обмен.
...
Рейтинг: 0 / 0
GUID из 1С в MS SQL и обратно, как реализовывается?
    #39697806
vitkhv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sc2r2bey как там все под капотом работает
Ну удачи им, дусмаю через полгодика разберутся :)
...
Рейтинг: 0 / 0
GUID из 1С в MS SQL и обратно, как реализовывается?
    #39697813
Фотография sc2r2bey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
надеюсь быстрее, данные падают в БД правильные, в 1С отображаются, а вот как они подтягиваются это магия ))
...
Рейтинг: 0 / 0
GUID из 1С в MS SQL и обратно, как реализовывается?
    #39697830
vitkhv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sc2r2bey как они подтягиваются это магия ))

Честно говоря не понял про что вы, и причем здесь функции преобразования GUID.

Если вы про ссылку на реквизит, то обычный SELECT_Description FROM _ReferenceXXX WHERE _IDRref = @1, где @1 ссылка которая у вас битая и все это завернуто в sp_executesql или sp_execute. Если в профайлере не видите обращений, значит данные закешировались уже на сервере 1С.
...
Рейтинг: 0 / 0
GUID из 1С в MS SQL и обратно, как реализовывается?
    #39697842
Фотография sc2r2bey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я тоже вас понимаю через раз
...
Рейтинг: 0 / 0
GUID из 1С в MS SQL и обратно, как реализовывается?
    #39697846
Фотография sc2r2bey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот прилетают данные:
Код: javascript
1.
2.
3.
4.
5.
6.
{
    "date": 1536057600,
    "latitude": 45.3645,
    "longitude": 55.3645,
    "vehicle": "3c29ac92-4a0b-11e8-9414-bcaec5369a36"
}


вот в SQL Server
...
Рейтинг: 0 / 0
25 сообщений из 129, страница 2 из 6
Форумы / [игнор отключен] [закрыт для гостей] / GUID из 1С в MS SQL и обратно, как реализовывается?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]