|
Получить ТЧ регистратора из составного реквизита нельзя, если ТЧ не у всех | ☑ | ||
---|---|---|---|---|
0
МишельЛагранж
12.03.16
✎
22:16
|
Итак.
Почему невозможно получить ТЧ у регистратора из реквизита составного типа, если такая ТЧ есть не у всех регистраторов? Вот кому пришла такая "гениальная" идея - ввести составные реквизиты и невозможность получить оттуда ТЧ в запросе без дополнительной обработки кодом. |
|||
1
hhhh
12.03.16
✎
22:20
|
(0) а точно нельзя? вроде можно
|
|||
2
МишельЛагранж
12.03.16
✎
22:32
|
Нет, только если ТЧ с таким именем есть у всех регистраторов. Тогда - как обычно.
|
|||
3
МишельЛагранж
12.03.16
✎
22:38
|
(1) Почему нельзя? Потому что, чтобы воспользоваться "прелестью" составного типа в запросе, нужно использовать ВЫРАЗИТЬ (иначе - ошибка "Нельзя обращаться к вложенной таблице через поле составного типа").
Тогда мы получим ТЧ из составного типа, но только как поле (получим максимум ТЗ, которую потом нужно обработать кодом - собственноручно полученные ТЗ запросы одноэсовые тоже не переваривают). И вот когда пытаемся получить из этой свежеполученной ТЗ ака ТЧ какие-либо данные - эту самую ВЫРАЗИТЬ нельзя использовать после "ИЗ" (в источнике запроса), а без ВЫРАЗИТЬ - невозможно обратится к ТЧ. Через временные таблицы вообще мрак - ВрТ не поддерживают разъименование на ТЧ ("Регистратор.ИмяТЧ"), что вообще уже - туши свет: 1С не может обработать собственные ссылки на собственные ТЧ во временной таблице! |
|||
4
МишельЛагранж
12.03.16
✎
22:40
|
+ т.е. при вызове во ВрТ просто "скромно" пишет про вызываемую ТЧ - "нет такого поля"....
Не могу, говорит, сделать соединение по ссылке с таблицей ТЧ... |
|||
5
Rie
12.03.16
✎
22:53
|
(0) Ну как бы логично, что если таблицы с таким именем нет, то и обратиться к ней невозможно. SQL ругаться будет. На ТЧ ведь не ссылка идёт, а соединение. Выпиши это соединение явно, указав только тех, кто такую ТЧ имеет.
|
|||
6
МишельЛагранж
12.03.16
✎
23:03
|
(5) в том и дело, что в гениальной 1С невозможно никак отделить в составном реквизите регистраторы с полем, от регистраторов без поля.
На кой тогда такие "составные реквизиты" нужны - известно только гениальным людям в 1С. |
|||
7
МишельЛагранж
12.03.16
✎
23:04
|
(5)"Выпиши это соединение явно, указав только тех, кто такую ТЧ имеет." - это вы как себе представляете в рамках составного реквизита? На основе полностью исчерпывающего материала в (3) :)
|
|||
8
Vladal
12.03.16
✎
23:10
|
(6) Как бы ты реализовал в своей базе ссылку на документы разных типов?
|
|||
9
МишельЛагранж
12.03.16
✎
23:16
|
(8) когда реализуешь подобное, будь готов предусмотреть, что "за горой - есть еще гора", т.е. в составном реквизите - есть поля с другими составными реквизитами, внутри которых - еще составные реквизиты и т.д.
А тут - элементарно не обрабатываются ссылочность "2-го порядка" - ТЧ внутри составного типа. Уж если сделали - то не путались бы в собственных ссылках на ссылку и ссылкой погоняю. Или бы уж делали без своих этих ссылок, раз обработать правильно не смогли. |
|||
10
Rie
12.03.16
✎
23:19
|
(9) Да нет там "ссылок на ТЧ". Есть соединение ПО ТЧ.Ссылка=Регистратор.
Хочешь ещё один уровень? Делаешь ещё одно соединение. Просто для примера - возьми структуру хранения и распиши, во что это в SQL превращается. |
|||
11
МишельЛагранж
12.03.16
✎
23:19
|
(8) это не "SQL виноват", как обычно утверждают все тру-одноэсники, это 1С не может дать через свой запрос правильную ссылку на нужные данные для выборки из базы SQL.
Не смотрел на всевдо-DBF формате (он же 1CD у 1С) - как там все это работает. Может, очередная тема для "не используй файловую - может не работать на серверной!" |
|||
12
МишельЛагранж
12.03.16
✎
23:22
|
(10)"Да нет там "ссылок на ТЧ" - правильно, потому что 1С их не дает из составного реквизита.
"Делаешь ещё одно соединение" - каким образом сделать хотя бы первое соединение? "возьми структуру хранения и распиши, во что это в SQL превращаетс" - в SQL это превращается в то, что нужно - в обыкновенные таблицы данных. А 1С не дает ссылку на таблицу ТЧ. Следовательно - что? Правильно, никаких полей и данных нет при попытке получить их из ТЧ по реквизиту составного типа. |
|||
13
МишельЛагранж
12.03.16
✎
23:27
|
Вообще, все представляют, что очень просто "получить" данные из составного реквизита, минуя "Нельзя обращаться к вложенной таблице через поле составного типа")".
Попробуйте. Тогда, может, станет понятно, что делает 1С, и почему SQL не может возвратить данные. |
|||
14
МишельЛагранж
12.03.16
✎
23:29
|
(10) "Есть соединение ПО ТЧ.Ссылка=Регистратор. " - кстати, никакое СОЕДИНЕНИЕ невозможно для данного конкретного случая, все описано в (3)
|
|||
15
RomanYS
12.03.16
✎
23:43
|
(0) ИМХО разыменование удобно когда связь одна-к-одной, а вот для других случаев было бы чересчур. Хорошо, что нет. Делай явную связь, много регистраторов - формируй запрос программно обходом метаданных.
|
|||
16
Rie
12.03.16
✎
23:46
|
(14) Пусть в таблице Таблица есть реквизит составного типа, включающего ДокументСсылка.Док1 (у которого есть ТЧ), ДокументСсылка.Док2 (у которого есть ТЧ) и ДокументСсылка.Док3 (у которого нет ТЧ).
Тогда получаешь ТЧ: ВЫБРАТЬ ТЧ.* ИЗ Документ.Док1.ТЧ КАК ТЧ ВНУТРЕННЕЕ СОЕДИНЕНИЕ Таблица ПО ТЧ.Ссылка=Таблица.Реквизит ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ТЧ.* ИЗ Документ.Док2.ТЧ КАК ТЧ ВНУТРЕННЕЕ СОЕДИНЕНИЕ Таблица ПО ТЧ.Ссылка=Таблица.Реквизит |
|||
17
МишельЛагранж
13.03.16
✎
01:24
|
(16) так это вы из документа получаете, а не из по ссылке из реквизита составного типа из регистра.
Т.е., по сути, нарушаем самое "главное" правило запросов 1С - никаких документов. И можем вообще не обращаться к регистру, а все сделать отбор по документам и все получить из него. |
|||
18
МишельЛагранж
13.03.16
✎
01:26
|
Поэтому я такой вариант и не рассматриваю - понятно, что из документа мы все получим, нам и ссылка на него из регистра не нужна: все признаки для отбора есть в самом документе.
|
|||
19
Rie
13.03.16
✎
01:55
|
(17) У Вас странное представление о том, как 1С работает с данными. "Разыменование ссылки" - это и есть обращение к объекту (в данном случае - к документу).
Что же касается упомянутого Вами правила - то Вы в (0) как раз пытаетесь нарушить это "главное правило" и обратиться к информации, хранящейся _не_ в регистре (никаких табличных частей в регистрах нет), а именно в документе (который Вы и пытаетесь получить, "разыменовав ссылку"). То, что обращение к данным документа Вы маскируете иными словами - сути не меняет. Это как в анекдоте о еврее в магазине: "- Скажите, а сколько стоит эта рыба? - Это ветчина. - Но я же не спрашивал вас, как называется эта рыба". |
|||
20
МишельЛагранж
13.03.16
✎
02:49
|
(19) как раз вот что происходит.
Когда обращаемся из регистра по ссылке - обращаемся непосредственно к нужной таблице. А когда делаем по вашему способу - выбираем таблицу всех документов, таблицу регистра, сравниваем, отбираем нужное. В чем и суть всей работы с регистрами - они позволяют не выбирать массу ненужной информации (связанные таблицы данных/полный объем таблиц), т.к. содержат уже отобранную и нужную. А иначе весь смысл регистров в 1С8 пропадает напрочь. Через разъименование через регистр мы получаем конкретную ТЧ, а не все докумнеты типа, и их ТЧ. |
|||
21
Rie
13.03.16
✎
03:45
|
(20) Что значит "непосредственно к нужной таблице"?!Поинтересуйтесь, как хранятся данные в реляционных базах, - и Вам откроется много нового и удивительного.
Регистр _не_ хранит данные табличных частей документов. Совсем не хранит. Вообще. Когда Вы в запросе "через точку" обращаетесь к реквизиту хранящегося в регистре значения ссылочного типа данных - Вы на самом деле обращаетесь к таблице _документа_ (или таблице табличной части документа). 1С при этом сама строит соединение с соответствующей таблицей. Хоть в SQL, хоть в файловой версии. Запись "через точку" - лишь сокращение для такого соединения, не более. |
|||
22
Rie
13.03.16
✎
03:49
|
+(21) И, кстати, никаких "выбираем таблицу всех документов" с последующим "сравниваем, отбираем нужное". Есть такая штука как индексы - поинтересуйтесь, что это и с чем их едят.
|
|||
23
МишельЛагранж
24.03.16
✎
21:25
|
(21) вот и разберитесь, начало у вас верное.
А мне незачем рассказывать то, что я описал выше, да еще и очень подробно и развернуто. "Регистр _не_ хранит данные табличных частей документов. Совсем не хранит. Вообще. " - верно, не хранит. Только причем и какое отношение к теме вопроса, зачем уводите вбок? Было бы иначе - никаких разъименований и прочих составных типов и не понадобилось бы: все бы хранилось в самом регистре (таблице). Кстати, а при чем тут акцент на "регистр"? В контексте составного типа - это хранение и вызов этого составного типа, а вот каким образом вы связали общее обращение к ТЧ документа и регистр? " Вы на самом деле обращаетесь к таблице _документа_" - вы переписываете мой ответ (20) на свой лад? )) "И, кстати, никаких "выбираем таблицу всех документов" с последующим "сравниваем, отбираем нужное"." и "Есть такая штука как индексы - поинтересуйтесь, что это и с чем их едят."" - нарушена причинно-следственная связь: как вы умудрились индексами описать условия отбора? )) |
|||
24
МишельЛагранж
24.03.16
✎
21:25
|
(11) кстати, в 1С-DBF (1CD) все абсолютно тоже самое - проверено.
|
|||
25
RomanYS
24.03.16
✎
22:08
|
(0) приведи какой-нибудь пример, зачем тебе это понадобилось.
И если не трудно, ответь на вопрос: сколько записей будет в выборке из запроса ВЫБРАТЬ Документ1.Ссылка, Документ1.ТЧ.( Реквизит1 ) КАК ТЧ ИЗ Документ.Документ1 КАК Документ1 ГДЕ Документ1.Ссылка = &Ссылка если &Ссылка - ссылка на существующий документ со 10 строками в ТЧ, и в догонку какого типа будет Выборка.ТЧ? |
|||
26
H A D G E H O G s
24.03.16
✎
22:19
|
Не понятны п$%^страдания автора.
|
|||
27
Cyberhawk
24.03.16
✎
22:35
|
Что-то ТС загнался, как мне показалось...
|
|||
28
zak555
24.03.16
✎
22:41
|
(15) есть же схема запроса
|
|||
29
youalex
24.03.16
✎
22:50
|
"Т.е., по сути, нарушаем самое "главное" правило запросов 1С - никаких документов. "
Вот, отличный пример, кстати. Мог быть. Относительно недавно хотел его привести на тему зомбирования рекомендациями 1С (в плане того что временный таблица рулит, а вложенный запрос - зло) Но не стал. Потому что это уникальный случай. |
|||
30
youalex
24.03.16
✎
22:53
|
(23) "нарушена причинно-следственная связь: как вы умудрились индексами описать условия отбора?"
Ну вот - зерно истины проклюнулось. Это не каждый сумеет, что правда то правда. Это же как минимум нужно знать, почему порядок измерений у РН, например, может быть так важен. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |