powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / [игнор отключен] [закрыт для гостей] / как получить idTref изнутри 1С8.1 (в языке)
11 сообщений из 11, страница 1 из 1
как получить idTref изнутри 1С8.1 (в языке)
    #35280151
1chainik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно при выгрузке данных в наружу фиксировать их источник в 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
как получить idTref изнутри 1С8.1 (в языке)
    #35281485
Guest11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
recordertref - идентификатор типа регистратора
recorderrref - собственно ссылка на регистратор
lineno - номер строки в наборе записей регистра

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


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

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

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

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


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

Это я смотрел. Но мне нужно в PostgreSQL. А во вторых там, в тексте ф-ии, каст идет: cast(@binaryUUID as uniqueidentifier) - он, простите, не пользует ли какой специфической ф-ии MSSQL? (т.е. насколько исчисляем получается алгоритм преобразования из текста по этой ссылке?).
...
Рейтинг: 0 / 0
как получить idTref изнутри 1С8.1 (в языке)
    #35283380
1chainik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
как получить idTref изнутри 1С8.1 (в языке)
    #35284049
Ферзь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
81 преобразуйте в десятичный получите 129
...
Рейтинг: 0 / 0
как получить idTref изнутри 1С8.1 (в языке)
    #35284059
Ферзь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а encode это базовая в PGsql? в MSSQL такого комфворта нет
...
Рейтинг: 0 / 0
как получить idTref изнутри 1С8.1 (в языке)
    #35284164
1chainik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ферзьа 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
как получить idTref изнутри 1С8.1 (в языке)
    #35284180
1chainik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ферзь81 преобразуйте в десятичный получите 129Спасибо!

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

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

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

т.е. ,вообще говоря, мне нужно будет, к примеру, ввести таблицу историй типов, и при вставке новых данных из 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
как получить idTref изнутри 1С8.1 (в языке)
    #35298955
1chainik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest11 recordertref может и поменяться (при реструктуризации метаданных).А сам объект-регистратор при этом сохранит свое именование (не алиас) в метаданных?

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


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