Имя: Пароль:
1C
1С v8
Получить ТЧ регистратора из составного реквизита нельзя, если ТЧ не у всех
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) "нарушена причинно-следственная связь: как вы умудрились индексами описать условия отбора?"
Ну вот - зерно истины проклюнулось. Это не каждый сумеет, что правда то правда.  Это же как минимум нужно знать, почему порядок измерений у РН, например, может быть так важен.