Имя: Пароль:
1C
1С v8
Можно ли как получить идентификатор типа значения?
0 1Сергей
 
09.04.13
08:09
Получить идентификатор ссылки (в полях таблиц БД типа ...RRef, 16 байт) можно с помощью функции .УникальныйИдентификатор().
А как можно получить идентификатор типа (в полях таблиц БД типа ...TRef, 4 байта)?
1 Tashiro
 
09.04.13
08:17
СериализаторXDTO может подойдет? тип сериализуется
2 1Сергей
 
09.04.13
08:20
(1) никогда с этой штукой не сталкивался. почитаю, спс
3 cw014
 
09.04.13
08:22
Можно еще через ПолучитьСтруктуруХраненияБазыДанных
4 1Сергей
 
09.04.13
08:35
Кажется, понял.
Например:

Document7571. Тут 7571 переводим в HEX, получаем 1D93. Что нам и нужно
5 МихаилМ
 
09.04.13
08:45
(4)
зачам в HEX ?
и десятичной системе можно.


declare @ddd binary(4)
set @ddd = 123
select @ddd


вечная беда одинесников - путать данные и их представление.
6 1Сергей
 
09.04.13
09:39
(5) прав, но мне удобнее в НЕХ

Сделал так:

Перем СтруктураБД;

Процедура ПриОткрытии()
   СтруктураБД = ПолучитьСтруктуруХраненияБазыДанных();
КонецПроцедуры

Функция ИзДесятичнойВШестнадцатиричную(ДесятичноеЧисло)
   ПравыеБиты = Число(ДесятичноеЧисло)%16;
   ЛевыеБиты = Цел(Число(ДесятичноеЧисло)/16);
   Если ЛевыеБиты>0 Тогда
       НачалоЧисла = ИзДесятичнойВШестнадцатиричную(ЛевыеБиты);
   Иначе
       НачалоЧисла = "";
   КонецЕсли;
   Если ПравыеБиты<10 Тогда
       Возврат НачалоЧисла + ПравыеБиты;
   Иначе
       Возврат НачалоЧисла + Символ(ПравыеБиты + 55);
   КонецЕсли;
КонецФункции

...
       ТаблицаБД = СтруктураБД.Найти(Объект.Метаданные().ПолноеИмя(), "ИмяТаблицы");
       ИмяТаблицыБД = ТаблицаБД.ИмяТаблицыХранения;
       ТипХекс = "0x" + Прав("00000000" + ИзДесятичнойВШестнадцатиричную(Прав(ИмяТаблицыБД,4)),8);
...


Может, и не очень красиво, но работает
7 1Сергей
 
09.04.13
10:06
да, не очень правильно. переделал:

Функция ПолучитьНомерТаблицыОбъектаВБД(Объект)
   Стр = "";
   
   ТаблицаБД = СтруктураБД.Найти(Объект.Метаданные().ПолноеИмя(), "ИмяТаблицы");
   ИмяТаблицыБД = ТаблицаБД.ИмяТаблицыХранения;
   
   Пока (Прав(ИмяТаблицыБД, 1)>="0") И (Прав(ИмяТаблицыБД, 1)<="9") Цикл
       Стр = Прав(ИмяТаблицыБД, 1) + Стр;
       ИмяТаблицыБД = Лев(ИмяТаблицыБД, СтрДлина(ИмяТаблицыБД)-1);
   КонецЦикла;
   
   Возврат "0x" + Прав("00000000" + ИзДесятичнойВШестнадцатиричную(Стр), 8);
   
КонецФункции
8 1Сергей
 
09.04.13
11:09
кароче, опять переделал. Самый простой способ, как оказалось, это через ЗначениеВСтрокуВнутр()
:)

Функция UUIDToGUID(UUID) Экспорт
  Возврат Прав(UUID, 8) + "-" + Сред(UUID, 21, 4) + "-" + Сред(UUID, 17, 4) + "-" + Лев(UUID, 4) + "-" + Сред(UUID, 5, 12);
КонецФункции

Функция GUIDToUUID(GUID) Экспорт
  Возврат Сред(GUID, 20, 4) + Прав(GUID, 12) + Сред(GUID, 15, 4) + Сред(GUID, 10, 4) + Лев(GUID, 8);
КонецФункции

Функция ИзДесятичнойВШестнадцатиричную(ДесятичноеЧисло)
   ПравыеБиты = Число(ДесятичноеЧисло)%16;
   ЛевыеБиты = Цел(Число(ДесятичноеЧисло)/16);
   Если ЛевыеБиты>0 Тогда
       НачалоЧисла = ИзДесятичнойВШестнадцатиричную(ЛевыеБиты);
   Иначе
       НачалоЧисла = "";
   КонецЕсли;
   Если ПравыеБиты<10 Тогда
       Возврат НачалоЧисла + ПравыеБиты;
   Иначе
       Возврат НачалоЧисла + Символ(ПравыеБиты + 55);
   КонецЕсли;
КонецФункции

Процедура ОбъектПриИзменении(Элемент)
   Если Объект = Неопределено Тогда
       
       GUID = "";
       UUID = "";
       ТипХекс = "";
       
   Иначе
       
       ВнутренняяСтрока = ЗначениеВСтрокуВнутр(Объект);
       Стр = Сред(ВнутренняяСтрока, 2, СтрДлина(ВнутренняяСтрока)-2);
       Пока Найти(Стр, ",") Цикл
           Стр = Сред(Стр, Найти(Стр, ",")+1);
       КонецЦикла;
       ТИПстр = Лев(Стр, Найти(Стр, ":")-1);
       УУИДстр = ВРЕГ(Сред(Стр, Найти(Стр, ":")+1));
       
       GUID = UUIDToGUID(УУИДстр);
       UUID = "0x"+УУИДстр;
       ТипХекс = "0x" + Прав("00000000" + ИзДесятичнойВШестнадцатиричную(ТИПстр), 8);
       
   КонецЕсли;
КонецПроцедуры


К тому же, предыдущий способ не работал с перечислениями