Имя: Пароль:
1C
1С v8
Найти документ по гуиду
0 alexei366
 
03.12.12
15:55
Народ, есть гуид элемента документа. В базе есть к примеру 3 типа документов, они объедененны в общий журнал. Вопрос такой как зная гуид выцепить ссылку на документ, предварительно не зная что это за документ.
Как я понимаю таблица всех документов едина (номер дата и т.д), есть доп тпблицы по типам доков согласно их реквизитов, и соответственно в главной таблице (по которой и строиться журнал) в единой колонке прописаны гуиды всех документов в независимости от типов. Но как запрос на родном языке сделать?
1 Aleksey
 
03.12.12
15:56
нет общего журнала в 8-ке
2 Kashemir
 
03.12.12
15:57
Если только гуид - то придется перебирать все виды документов
3 alexei366
 
03.12.12
15:58
в смысле нет, как тогда реализация журнала происходит (я думал как в 77)
4 Maxus43
 
03.12.12
15:58
(1) Журнал в 8-ке - отдельная таблица в БД.
Не зная тип - не вытащить имхо
5 alexei366
 
03.12.12
15:59
Ну у кого какие идеи?
6 sapphire
 
03.12.12
15:59
(0) Так чего куда есть?
7 alexei366
 
03.12.12
16:01
?
8 sapphire
 
03.12.12
16:03
(7) Выражай свои мысли яснее.
Уникальный идентификатор в таблице без типа?
9 Kashemir
 
03.12.12
16:05
Для каждого Док из Метаданные.ЖурналыДокументов.ДокументыКонтрагентов.РегистрируемыеДокументы Цикл
       Если Найти(Документы[Док.Имя].ПолучитьСсылку(Новый УникальныйИдентификатор("f869770e-5e1a-11e1-a1ec-2c41388785b0")), "Объект не найден") = 0 Тогда
           // подходит
       КонецЕсли;
   КонецЦикла;
10 alexei366
 
03.12.12
16:06
Вспомним 77.
Таблица 1SJOURN есть колонка IDJOURNAL (на новый лад должна быть УникИд) и колонка DNPREFIX (Тип дока), ну и другие
11 sapphire
 
03.12.12
16:06
(2) Перебрать все документы создать ссылку по каждому с нужным UUID и запихать в массив и выбрать {чего надо} из {таблица} где {колонка c ссылками} В (&МассивСсылок)
12 alexei366
 
03.12.12
16:06
Я то без цикла хотел
13 sapphire
 
03.12.12
16:07
(10) Забудь про клюшки
14 sapphire
 
03.12.12
16:07
(12) Не выйдет, хотя можно и без цикла
15 alexei366
 
03.12.12
16:09
Вот фигня, а я так надеелся что зная гуид определим и ссылку и тип и т.д не ищя в каждом доке этот гуид.
16 Kashemir
 
03.12.12
16:09
(14) Массив ссылок все равно в цикле будет собираться
17 Kashemir
 
03.12.12
16:09
(15) В гуиде нет типа. Тип есть в ссылке :)
18 s03
 
03.12.12
16:09
(15) а если по данному ГУИДу будет две ссылки на разные типы документов?
19 hhhh
 
03.12.12
16:10
(17) а как же оно сортирует по виду документа?
20 Kashemir
 
03.12.12
16:10
(17) В ссылке есть тип. По нему и сортирует. Потом уже по гуиду
21 alexei366
 
03.12.12
16:12
Я думаю что таблица всех ссылок и других общих реквизитов документов для всех документов одна, и поэтому гуиды там не повторяться
22 s03
 
03.12.12
16:12
чтобы не искать этот ГУИД в каждом доке - подцепи таблицу журнала документов как внешний источник данных и ищи уже по этой таблице. найдёшь все ссылки, соответствующие твоему ГУИДу, а там (если их несколько встретиться) уже сам разбирайся, какая именно тебе будет нужна
23 Kashemir
 
03.12.12
16:12
(21) Гуиды могут повторяться для разных типов.
24 alexei366
 
03.12.12
16:13
Все нафиг щаз залезу в SQLServer и проверю
26 Kashemir
 
03.12.12
16:13
(21) В восьмерке все обстоит несколько по другому.
27 Mikeware
 
03.12.12
16:13
(10) взялся за снеговика - забывай про клюшки...
28 Mikeware
 
03.12.12
16:15
Кстати, можно получить структуру хранения, сгенерить вьюху для "общего журнала", и искать по ней
29 Serg_1960
 
03.12.12
16:17
"Нельза лепить снеговика с клюшками в голове"(классика)
30 alexei366
 
03.12.12
16:18
В журнале есть колонки _DocumentTRef (тип) и _DocumentRRef (гуид). Так что моя теория была правильной, только в отличии от 77 доки объедененны в общию таблицу не изначально, а при помощи журнала.
31 s03
 
03.12.12
16:18
лучший способ получить структуру хранения - непосредственно в SQL, ибо даже встроенная команда не даёт всех полей, которые там есть, да и имена у тех, которые она предоставляет не совсем соответствуют истинным именам, что хранятся в самом SQL
32 s03
 
03.12.12
16:20
(30) да, сочетание Тип+ГУИД=Уникальность. А одного ГУИДа для уникальности маловато, потому и определить ссылку только по нему можно если других типов документов с аналогичным ГУИДом не встретишь
33 alexei366
 
03.12.12
16:22
В SQL вообще ограничений нет в этой таблице, походу на уровне 1С изначально проверяется.
34 Serg_1960
 
03.12.12
16:22
"щаз залезу в SQLServer и проверю"(24)
"Так что моя теория была правильной"(30)

Жду продолжения саморазоблачения :)
35 alexei366
 
03.12.12
16:23
Я не так выразился, имелось в виду что гуид и тип лежат в отдельных колонках.
36 Мыш
 
03.12.12
16:25
(32) > сочетание Тип+ГУИД=Уникальность
Неверное утверждение. ГУИД сам по себе уникален в принципе в неограниченных пределах. )
37 Мыш
 
03.12.12
16:29
(23) Тоже неверно. ГУИДы не могут повторяться.
38 Kashemir
 
03.12.12
16:31
(37) Да запросто - вопрос не раз уже поднимался. Возьми установи ссылку нового с одним ид разным документам  и убедись.
39 Maxus43
 
03.12.12
16:32
(37) Могут. Сделать это самому легко, дождаться пока платформа выкинет такой фокус - сложно
40 Kashemir
 
03.12.12
16:33
(35) Все верно. Тип+ГУИД = Ссылка в терминах 1С.
41 Мыш
 
03.12.12
16:34
(38) Это можно сделать только преднамеренно. Ну а специально можно сделать что угодно. )
42 Мыш
 
03.12.12
16:34
(40) Это только для составных полей. Не надо путать.
43 Kashemir
 
03.12.12
16:34
(41) Вероятность такая есть всегда и отбрасывать ее нельзя.
44 Kashemir
 
03.12.12
16:36
(42) Что значит путать ? Для простых ссылочных полей тип заранее определен что не противоречит Ссылка = Тип+ГУИД.
45 Мыш
 
03.12.12
16:36
(43) Отбрасывать её можно, потому что она крайне низкая.
46 Kashemir
 
03.12.12
16:36
(45) Нельзя отбрасывать - ложка дегтя портит бочку меда.
47 Мыш
 
03.12.12
16:37
(44) Ссылка есть ссылка. Тип добавлен для определения таблицы поиска. Вы смешиваете сущности.
48 Мыш
 
03.12.12
16:38
(46) Вы каску носите? Ведь есть вероятность падения метеорита и он может попасть в голову )
49 Kashemir
 
03.12.12
16:39
(47) Что ты мне вообще доказываешь? Что ссылка на уровне платформы не содержит тип ? Или что при хранении в таблицах не содержит тип ?
50 Maxus43
 
03.12.12
16:39
(47) по ссылке можно определить ТИП, по ГУИДу нельзя, это же аксиомы, что тут спорить? 1с не отбрасывает никакие даже маловероятные события, из-за чего отказываются от хороших механизмов, например v8: РАУЗ. Ключи Аналитики. РИБ. посты 116-117
51 Kashemir
 
03.12.12
16:40
(48) Если хожу по стройке - обязательно одену.
52 Мыш
 
03.12.12
16:40
(49) Я доказываю, что ГУИД сам по себе уникален. Ссылка в себе не содержит тип. Тип хранится в отдельном поле и только для составных полей.
53 Maxus43
 
03.12.12
16:41
(52) Он уникален в пределах одной Таблицы (читай Типа)
54 Kashemir
 
03.12.12
16:43
(52) ГУИД ни разу не уникален, он лишь стремится к уникальности.
(52) Платформа оптимизирует хранение для простых ссылочных. Не более того. При этом есть четкое понимание о типе.
55 Мыш
 
03.12.12
16:43
(53) Да что же вы блин. Это же основы. Рамки уникальности шире всех баз. За это собственно 1С и критиковали при выходе 8-ки.
56 Мыш
 
03.12.12
16:44
(54) Статистически уникален. 2 в степени 128.
57 alexei366
 
03.12.12
16:45
Так ладно, буду искать другой способ, где входными данными будет являться не только гуид но и тип.
58 Kashemir
 
03.12.12
16:46
(56) Удачи тебе с таким подходом. Наступишь на грабли - не говори что был непредупрежден.
59 Maxus43
 
03.12.12
16:50
(55) ГУИДу 8-ки далеко до тех же сидов винды. в 1с берётся значение и инкреминируется на 1, что само собой может породить дубли чаще чем кажется
60 alexei366
 
03.12.12
16:51
нифига из гуида в 1с можно время записи вычислить
61 Мыш
 
03.12.12
16:51
(58) Спасибо за одолжение )

(57) Из-за особенностей реализации получения ГУИДа по его части можно с достаточно высокой долей вероятности определить тип ссылки. Но предварительно надо проанализировать ГУИДы существующих ссылок.
62 Maxus43
 
03.12.12
16:51
(60) точность фиговая
63 Kashemir
 
03.12.12
16:52
(60) Для какой из распределенных баз, с учетом что они могут находится на разных серверах с разным системным временем ?
64 Serg_1960
 
03.12.12
16:57
"Попкорн приготовил"(с)
65 Maxus43
 
03.12.12
16:57
(64) кинь свою долю в общий котёл лучше
66 alexei366
 
03.12.12
16:59
67 Serg_1960
 
03.12.12
17:00
(65) Нет, не буду. Много "вкидывать" придется - к каждому топику этой ветки :)
68 Kashemir
 
03.12.12
17:00
(66) Хех, ты так и не понял смысла вопроса в (63)
69 Maxus43
 
03.12.12
17:03
(66) на партнёрсом форуме САМ главный 1сник отвечал, что ГУид используется для того, для чего его придумали, и тянуть оттуда время есть моветон и всех отлучат от 1с за такое
70 alexei366
 
03.12.12
17:09
Чо не понятного, время высчитывает служба Администратор Сервера 1С, берёт она с компа где находится.
71 Bober
 
03.12.12
17:10
(66) см. (59)

если не веришь, запусти СообщитьНовый уникль
72 Bober
 
03.12.12
17:10
(71)
Сообщить(Новый уникальныйИдентификатор);
Сообщить(Новый уникальныйИдентификатор);
Сообщить(Новый уникальныйИдентификатор);
73 GANR
 
03.12.12
17:11
Функция ДокументПоGUID(УникальныйИдентификаторДокумента)
   
   РегистрируемыеДокументы = Метаданные.ЖурналыДокументов.СкладскиеДокументы.РегистрируемыеДокументы;
   
   Для каждого ОбъектМетаданных из РегистрируемыеДокументы Цикл
       
       МенеджерДокументов = Документы[ОбъектМетаданных.Имя];
       СсылкаНаОбъект = МенеджерДокументов.ПолучитьСсылку(УникальныйИдентификаторДокумента);
       ОбъектПоСсылке = СсылкаНаОбъект.ПолучитьОбъект();
       
       Если ОбъектПоСсылке <> Неопределено Тогда
           Возврат СсылкаНаОбъект;
       КонецЕсли;
   КонецЦикла;
   
   Возврат Неопределено;
   
КонецФункции
74 Maxus43
 
03.12.12
17:12
(73) 1с не одобряет, нет 100% вероятности :)
75 Serg_1960
 
03.12.12
17:12
(кинул свою долю) Посмотрите в своей конфе на процедуру ПриНачалеРаботыСистемы() и вызов ПроверкаРазницыВремениКлиент.ВыполнитьПроверку()... и скажите хором  - "Время - понятие относительно"(с)
76 GANR
 
03.12.12
17:19
Пусть идентификаторы делают уникальней ]:->.
77 GANR
 
03.12.12
17:19
(76) to (74)
78 Kashemir
 
03.12.12
17:22
(73) Метод в (9) будет быстрее, ибо не создается лишний объект. Единственно - привязан к языку :)
79 Maxus43
 
03.12.12
17:23
Найти и "Объект не найден" - быдлокод)
80 Maxus43
 
03.12.12
17:24
(79) +  у нас так сделали проверку на справочники, и вот веть - были элементы и с таким названием, Объект не найден :)
81 Kashemir
 
03.12.12
17:25
(79) Привязка к ИД в любом случае будет быдлокодом. На ней серьезные вещи строит не стоит. А для всякой некритичной ерунды - пусть будет то что быстрее.
82 Maxus43
 
03.12.12
17:26
(81) в РИБ базах иногда нужно к ИД привязыватся, не вижу быдлокода, от задачи зависит
83 Kashemir
 
03.12.12
17:33
(82) Помимо прочего метод в (72) имеет и другой минус - не все типы имеют метод ПолучитьОбъект. Например перечисления.
84 Serginio1
 
03.12.12
17:45
Вообще через УстановитьСсылкуНового можно установить, что угодно, хоть свой вариает Гуида.

 Если пользоваться генератором Гуида, то он будет уникальным так как например зависит от сетевой карты, времени.
http://cppclub.newmail.ru/articles/insidecom09.html
wiki:GUID

GUID хорош прежде всего при обмене данными без всяких суффиксов префиксов и может объединяться с любыми учетными системами.
85 Maxus43
 
03.12.12
17:49
(84)>(59), гуид 1с это не совсем гуид
86 GANR
 
03.12.12
17:54
Если GUID генерируется инкрементом на 1 - это, скорее, недочет разработчиков платформы, а не тех, кто на ней программирует. Уникальный идентификатор, должен быть уникальным и точка.
87 Serginio1
 
03.12.12
18:15
(85) То есть ты утверждаешь что гуид для ссылок отличен от Новый уникальныйИдентификатор? Дай ссылку на алгоритм и особенно для распределенных баз.
88 Bober
 
03.12.12
18:27
(86) а он и уникален, никто не говорил, как платформа реализует это условие.
89 Serginio1
 
03.12.12
18:31
87+ Да проверил действительно увеличивают на единицу.
v8: ГУИД 1С8
Но здесь есть смысл, в том, если привязка к компьютеру будет уникальной, а значит и будет уникальна на другом компьютере. Надо смотреть алгоритм. С другой стороны смешно экономить на формировании гуида
90 Serginio1
 
03.12.12
18:35
89+ Функция ДатаСозданияСсылки(Ссылка)
ГУИД = Ссылка.УникальныйИдентификатор();
Строка16 = Сред(ГУИД, 16, 3) + Сред(ГУИД, 10, 4) + Сред(ГУИД, 1, 8);
Разрядность = СтрДлина(Строка16);
ЧислоСек = 0;
Для Позиция = 1 По Разрядность Цикл
ЧислоСек = ЧислоСек + Найти("123456789abcdef",Сред(Строка16,Позиция,1))*Pow(16,Разрядность - Позиция);
КонецЦикла;
ЧислоСек = ЧислоСек / 10000000;
Возврат Дата(1582, 10, 15, 04, 00, 00) + ЧислоСек;
КонецФункции

Генерация Гуида 1С
531923ce-3d55-11e2-8afe-c86000c70663
531923cf-3d55-11e2-8afe-c86000c70663
91 GANR
 
03.12.12
18:40
(59) ГЫЫЫЫ...
Инкремент - экскримент.
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn