Гость
Форумы / [игнор отключен] [закрыт для гостей] / как получить idTref изнутри 1С8.1 (в языке) / 11 сообщений из 11, страница 1 из 1
25.04.2008, 15:03
    #35280151
1chainik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как получить idTref изнутри 1С8.1 (в языке)
Нужно при выгрузке данных в наружу фиксировать их источник в 1С (пока - файловых). Т.к. поставщик данных - это РегистрыБухии.Хозрасчетный, то решил однозначно фиксировать по тройке
(recordertref, recorderrref, lineno)

причем (пока) неважно, будут ли
recordertref, recorderrref представлены строкой или иначе (битовой строкой).
насколько я понял,
recorderrref - это (с точночтью до преобразования в строку)
Код: plaintext
Выборка.Регистратор.Ссылка.УникальныйИдентификатор()
(при неявном преобразовании объекта УУИД в строку внутри процедуры 1С)
т.е. строка типа "07e3c030-0d29-11dd-a892-000ffe138c1c"
а вот что такое recordertref?
по моим наблюдениям, это видимо(?) первая (из 2-х) уидо-видная часть строки
Код: plaintext
ЗначениеВСтрокуВнутр(Выборка.Регистратор.Ссылка))
(вторая - как раз то, во что обращается объект УУИД() при конкатенации со строкой внутри 1С)

вопросы:
1. Правильно ли я это высчитал?
2. есть ли иной способ получить эту подстроку кроме как выпарсивая ее из ЗначениеВСтрокуВнутр()?

3. что нужно провернуть со строкой, чтобы она больше походила на бинарное данное в базе 1С? (впоследствии собираюсь сливать данные не из файловых 8-рок - прямиком из соответствующих таблиц). И нет ли способов получить их в языке 1С попрямее, чем выдирая из объекта ссылочного типа, да еще с промежуточным преобразованием в строку/из строки?
...
Рейтинг: 0 / 0
26.04.2008, 15:05
    #35281485
Guest11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как получить idTref изнутри 1С8.1 (в языке)
recordertref - идентификатор типа регистратора
recorderrref - собственно ссылка на регистратор
lineno - номер строки в наборе записей регистра

Для идентификации регистратора достаточно одного recorderrref , тем более что recordertref может и поменяться (при реструктуризации метаданных).
Кстати lineno зависит от бизнес-логики и может использоваться только для обеспечения уникальности записи, не более.


авторчто нужно провернуть со строкой, чтобы она больше походила на бинарное данное в базе 1С Тут наоборот, но принцип преобразования понятен
...
Рейтинг: 0 / 0
28.04.2008, 11:49
    #35283116
1chainik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как получить idTref изнутри 1С8.1 (в языке)
guest11 recordertref - идентификатор типа регистратора
recorderrref - собственно ссылка на регистратор
lineno - номер строки в наборе записей регистра

Для идентификации регистратора достаточно одного recorderrref гм. ну я например смотрю структуру данных регистра. так там наименьший уникальный индекс именно по полной 3-ке. Т.е. с моей т.з. ничем (кроме как может быть самим 1с-ом) уникальность в регистре именно по двойке (idref,lineno) не гарантирована. Т.е. это (закладываться на отсутствующее в базе, но подразумеваемое ограничение) не есть хорошо.

guest11, тем более что recordertref может и поменяться (при реструктуризации метаданных). а вот это вообще плохо. Подразумевается, что в моей базе каждая запись должна знать, чем она порождена в бухии. (какой строкой регистра). Если после изменения структуры метаданных происходит апдейт всех уже прописанных строк регистра- это ни в какие ворота. Одна надежда - не такие же <.....> в разработчиках. Или такие?

guest11Кстати lineno зависит от бизнес-логики и может использоваться только для обеспечения уникальности записи, не более.что мне и нужно


guest11 авторчто нужно провернуть со строкой, чтобы она больше походила на бинарное данное в базе 1С Тут наоборот, но принцип преобразования понятен

Это я смотрел. Но мне нужно в PostgreSQL. А во вторых там, в тексте ф-ии, каст идет: cast(@binaryUUID as uniqueidentifier) - он, простите, не пользует ли какой специфической ф-ии MSSQL? (т.е. насколько исчисляем получается алгоритм преобразования из текста по этой ссылке?).
...
Рейтинг: 0 / 0
28.04.2008, 13:19
    #35283380
1chainik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как получить idTref изнутри 1С8.1 (в языке)
guest11 Тут наоборот, но принцип преобразования понятен
вот поэкспериментировал имея данное в 1С и в пг. Пришлось еще и переставлять фрагменты в конце (что каст в уид в мсскл переставляет какие-то куски строки?)


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
create OR REPLACE function getstringuuid (_binaryuuid bytea)
returns char( 36 )
as
$BODY$
  declare
 _buffer char( 32 );
begin
	--_buffer := replace(encode(_binaryuuid ,'hex'), '-', '');
	_buffer := encode(_binaryuuid ,'hex');
	return 
	--right(_buffer, 8) || '-' ||
	substr(_buffer,length(_buffer)- 7 ,  8 ) || '-' ||
	substr(_buffer,  21 ,  4 ) || '-' ||
	substr(_buffer,  17 ,  4 ) || '-' ||
 
	--left(_buffer, 4) ||
	substr(_buffer, 1 ,  4 ) ||
	'-' ||
	substr(_buffer,  5 ,  2 ) ||
	substr(_buffer,  7 ,  2 ) ||
	substr(_buffer,  9 ,  2 ) ||
	substr(_buffer,  11 ,  2 ) ||
	
	substr(_buffer,  13 ,  4 );
end
$BODY$
  LANGUAGE 'plpgsql' IMMUTABLE SECURITY DEFINER;




теперь осталось понять, как выдрать ifTref (пусть и преобразонутый) изнутри 1С, чтобы получить
SELECT encode(_recordertref,'hex') ....
'00000081'

т.к. мои догадки насчет нахождения Трефа в строке кажется не проходят:
Код: plaintext
1.
Сообщить ( "'" + ЗначениеВСтрокуВнутр(Выборка.Регистратор.Ссылка) +"',"
		+ "'" + Выборка.Регистратор.Ссылка.УникальныйИдентификатор() + "',");
дает
'{"#",3ae7ecdf-938e-49f2-907e-95e0c1bb3e72,129:a892000ffe138c1c11dd0d2907e3c030}','07e3c030-0d29-11dd-a892-000ffe138c1c'
т.е. вторая часть ЗначениеВСтрокуВнутр это в чистом виде encode(idrref,'hex'), без перестановок. А вот куда делось 00000081 - не ясно.

конечно, если уникальность (_recorderrref, _lineno) - подтрамвайно гарантируется, то может быть ее и не искать ?
...
Рейтинг: 0 / 0
28.04.2008, 16:44
    #35284049
Ферзь
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как получить idTref изнутри 1С8.1 (в языке)
81 преобразуйте в десятичный получите 129
...
Рейтинг: 0 / 0
28.04.2008, 16:47
    #35284059
Ферзь
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как получить idTref изнутри 1С8.1 (в языке)
а encode это базовая в PGsql? в MSSQL такого комфворта нет
...
Рейтинг: 0 / 0
28.04.2008, 17:28
    #35284164
1chainik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как получить idTref изнутри 1С8.1 (в языке)
Ферзьа encode это базовая в PGsql? в MSSQL такого комфворта нетда encode/decode -стандартные ф-ии кодирования [де]кодирования байтовой строки в обычную. Есть 3 "моды". Я проверял все. В 'hex'-вой обнаружил все искомые символы. (А в "ЗначениеВСтрокуВнутр - даже и сам порядок)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT   
  _recordertref,
--  encode(_recordertref,'escape') ,
 -- encode(_recordertref,'base64') ,
  encode(_recordertref,'hex') ,
--getstringuuid(_recordertref),
  _recorderrref ,
 -- encode(_recorderrref,'escape') ,
--  encode(_recorderrref,'base64') ,
  encode(_recorderrref,'hex') ,
getstringuuid(_recorderrref),
'07e3c030-0d29-11dd-a892-000ffe138c1c' AS obrasetc,
...
FROM _accntreg7175
"\000\000\000\201""00000081""\250\222\000\017\376\023\214\034\021\335\015)\007\343\3000""a892000ffe138c1c11dd0d2907e3c030""07e3c030-0d29-11dd-a892-000ffe138c1c""07e3c030-0d29-11dd-a892-000ffe138c1c"
...
Рейтинг: 0 / 0
28.04.2008, 17:33
    #35284180
1chainik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как получить idTref изнутри 1С8.1 (в языке)
Ферзь81 преобразуйте в десятичный получите 129Спасибо!

Т.е. в строкеВнутренней таки зашит тип. Хотя и не там, где я полагал его искать. Уже понятнее. Осталось понять, а нужно ли вообще его (тип) вытягивать и фиксировать (если, как утверждается, ууид ссылки на регистратор с номером строки сами дадаут уникум сквозь всю базу , даже без учета ссылки на тип регистратора, который еще может и измениться).
...
Рейтинг: 0 / 0
28.04.2008, 17:45
    #35284207
Ферзь
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как получить idTref изнутри 1С8.1 (в языке)
1chainik Ферзь81 преобразуйте в десятичный получите 129Спасибо!

Т.е. в строкеВнутренней таки зашит тип. Хотя и не там, где я полагал его искать. Уже понятнее. Осталось понять, а нужно ли вообще его (тип) вытягивать и фиксировать (если, как утверждается, ууид ссылки на регистратор с номером строки сами дадаут уникум сквозь всю базу , даже без учета ссылки на тип регистратора, который еще может и измениться).

Тут палка о 2 концах с одной строны ИД непонятно для чего уникальны в рамках все БД (расчитывается от времени создания сеанса).
В другом случае в ID сами можете установить для объекта и в этом случае будут проверяться только текущий тип. Так что лучше брать по максимуму .. поменяется (81 на 82) только если вы впереди своего объекта в конфигураторе, запихните еще какой нибуть.. обычно добавляют снизу...
...
Рейтинг: 0 / 0
28.04.2008, 18:01
    #35284240
1chainik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как получить idTref изнутри 1С8.1 (в языке)
Ферзьв этом случае будут проверяться только текущий тип.понял.

т.е. ,вообще говоря, мне нужно будет, к примеру, ввести таблицу историй типов, и при вставке новых данных из 1С "перекодировать" по ней idTref в изначальные... табличку содержать в непрерывной актуальности.... ну или какое-нибудь равнозначное решение



PS насчет Вашей подсказки с типом - нашел функцию от самой 1С (в поставке их базы)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
/*
CREATE OR REPLACE FUNCTION binrowver(p1 int4)
  RETURNS bytea AS
$BODY$
 DECLARE
 bytearea BYTEA;
 BEGIN
 bytearea := SET_BYTE('\\000\\000\\000\\000\\000\\000\\000\\000'::bytea, 4, MOD(P1 / 16777216, 256));
 bytearea := SET_BYTE(bytearea, 5, MOD(P1 / 65536, 256));
 bytearea := SET_BYTE(bytearea, 6, MOD(P1 / 256, 256));
 bytearea := SET_BYTE(bytearea, 7, MOD(P1, 256));
 RETURN bytearea;
 END;$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
*/
SELECT encode(binrowver( 129 ),'hex');
--"0000000000000081"
похоже в обратную сторону нормально задувает (правда немного лишних позиций, ну да суть ясна. И название функции вроде бы как подтверждает вашу подсказку.). Хотя VOLATILE им стоило бы поменять на IMMUTABLE
...
Рейтинг: 0 / 0
07.05.2008, 11:05
    #35298955
1chainik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как получить idTref изнутри 1С8.1 (в языке)
guest11 recordertref может и поменяться (при реструктуризации метаданных).А сам объект-регистратор при этом сохранит свое именование (не алиас) в метаданных?

- Т.е., если я заведу его наименование вместо recordertref (вернее, технически - буду строить табличку соответствия recordertref-ов объектных типов "реструктурированных" конфигураций опираясь на имя (полное, вида "Документы.ОперацияБух") - могу я твёрдо рассчитывать , что объектный тип, называемый некогда "Документы.ОперацияБух" так и останется "Документы.ОперацияБух"-ом, а не станет скажем объектным типом с именем "Документы.ОперацияБухгалтераРучная"? И что это абсолютно верно для всех (хотя бы регистраторских) типов? Или это тоже слишком сильное (т.е. неоправданное на практике) допущение?
...
Рейтинг: 0 / 0
Форумы / [игнор отключен] [закрыт для гостей] / как получить idTref изнутри 1С8.1 (в языке) / 11 сообщений из 11, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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