Имя: Пароль:
1C
1С v8
Почему дублируются записи в результате запроса?
0 novmax
 
21.01.22
14:10
Добрый день! Я начинающий. Подскажите, пожалуйста, почему так и что делать? Управление торговлей 11

Запрос:
ВЫБРАТЬ
    РеализацияТоваровУслугТовары.Ссылка КАК Документ,
    КонтрагентыКонтактнаяИнформация.Ссылка КАК Контрагент,
    КонтрагентыКонтактнаяИнформация.НомерТелефона КАК НомерТелефона
    
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Контрагенты.КонтактнаяИнформация КАК КонтрагентыКонтактнаяИнформация
        ПО РеализацияТоваровУслугТовары.Ссылка.Контрагент.Ссылка = КонтрагентыКонтактнаяИнформация.Ссылка
ГДЕ
    РеализацияТоваровУслугТовары.Ссылка = &Ссылка

Результат:
Документ    Контрагент    НомерТелефона
Реализация товаров и услуг ТДУТ-000025 от 04.12.2017 18:33:00    Альтаир    
Реализация товаров и услуг ТДУТ-000025 от 04.12.2017 18:33:00    Альтаир    
Реализация товаров и услуг ТДУТ-000025 от 04.12.2017 18:33:00    Альтаир    
Реализация товаров и услуг ТДУТ-000025 от 04.12.2017 18:33:00    Альтаир    9876543
Реализация товаров и услуг ТДУТ-000025 от 04.12.2017 18:33:00    Альтаир    
Реализация товаров и услуг ТДУТ-000025 от 04.12.2017 18:33:00    Альтаир    
Реализация товаров и услуг ТДУТ-000025 от 04.12.2017 18:33:00    Альтаир    
Реализация товаров и услуг ТДУТ-000025 от 04.12.2017 18:33:00    Альтаир    9876543

Проблемы:
1. Почему так много строк? В документе в табличной части 2 товара.
2. Почему номер телефона выводится не в каждой строке?
1 ДенисЧ
 
21.01.22
14:11
потому что контактной информации больше одной.
2 Ёпрст
 
21.01.22
14:11
(0) сколько строк в табличной части товары, столько ты и видишь при выводе
3 Ёпрст
 
21.01.22
14:12
ну и в КонтактнаяИнформация  нужно фильтр ставить на вид/тип.. там же и адрес и телефон ит т.д
4 PuhUfa
 
21.01.22
14:13
А лучше почитать интернет на предмет "как работают соединения"
5 Dmitrii
 
гуру
21.01.22
14:18
(0) В табличной части Товары вашего документа две строчки. А у Контрагента три вида/типа контактной информации - помимо телефона , например, ещё адрес и электронная почта.
И даже если отобрать по виду контактной информации, вовсе не факт, что у контрагента только один телефон. Их может  быть и несколько.
6 novmax
 
21.01.22
14:20
Так ведь другая контактная информация не запрашивается, только телефон, очень странно.
7 Dmitrii
 
гуру
21.01.22
14:21
(0) Вот это "ПО РеализацияТоваровУслугТовары.Ссылка.Контрагент.Ссылка = КонтрагентыКонтактнаяИнформация.Ссылка" исправь на "ПО РеализацияТоваровУслугТовары.Ссылка.Контрагент = КонтрагентыКонтактнаяИнформация.Ссылка". Реквизит Контрагент - это уже Ссылка. Получать от него ссылку не нужно.
8 Dmitrii
 
гуру
21.01.22
14:25
(6) >> другая контактная информация не запрашивается, только телефон.

Где это написано? Не в условиях ГДЕ, не в условиях соединения отбора виду или типу контактной информации нет. А реквизит "Телефон" есть во всех строках табличной части Контрагенты.КонтактнаяИнформация. Если там десять строк, то все они и выводятся.
9 Курцвейл
 
21.01.22
14:33
(0) Рекомендую внимательно прочитать https://intuit.ru/studies/courses/5/5/lecture/130
А еще лучше весь курс прочитать. Будет понимание что ты делаешь с СУБД в запросах.
10 exwill
 
21.01.22
14:39
(6) Это называется: нормализация - денормализация. В идеале все таблицы должны быть нормализованы. Тогда бы в базе была специальная таблица: "Телефоны". И в ней хранились бы только телефоны. Но на практике полную нормализацию никто не делает. И даже более того. Иногда специально прибегают к денормализации. Поэтому появляется таблица: "Контакты". И эта таблица разреженная. В том смысле, что, например, в записи относящейся к адресу будет только адрес. А все прочие реквизиты, в том числе и "телефон" будут в этой записи пустые.
11 ДенисЧ
 
21.01.22
14:40
(10) Идиотизм.
12 exwill
 
21.01.22
14:41
(11) По существу есть что возразить?
13 ДенисЧ
 
21.01.22
14:43
(12) нет, по тебе возражений нет.
14 mikecool
 
21.01.22
14:44
(12) есть достоверность и производительность, нормализация ближе к производительности, но в ущерб достоверности
15 mikecool
 
21.01.22
14:44
+14 хотя куда я лезу, я же теорию не читаю
16 Ёпрст
 
21.01.22
14:45
(15) да-да-да.. не надо увеличивать энтропию
17 exwill
 
21.01.22
14:46
(14) Нормализация экономит место в ущерб производительности.
18 Курцвейл
 
21.01.22
14:47
Все субд по умолчанию нормализованные к 3 или 4 форме. Давно уже теорию по норме форм не читал.
19 ДенисЧ
 
21.01.22
14:48
(18) Кто тебе такую фигню сказал?
20 trad
 
21.01.22
14:50
(16) можно я увеличу?.. спасибо
21 trad
 
21.01.22
14:51
(10) если в этой "специальная таблица: "Телефоны"" будет несколько телефонов одного контра вы же потребуете чтоб возвращался один, любой. А то что этот джойн себе позволяет ))
22 exwill
 
21.01.22
14:53
(18) Таблица Справочник.Контрагенты.КонтактнаяИнформация не находится даже во второй нормальной форме
23 exwill
 
21.01.22
14:55
А строго говоря, даже и в первой потенциально не находится. Но это зависит от того, как сильно придираться.
24 Курцвейл
 
21.01.22
14:59
(19) Это не фигня, а так считается. Если найду ссылку, то напишу суда.
25 ДенисЧ
 
21.01.22
15:02
(24) Кем считается?
26 exwill
 
21.01.22
15:03
(24) Извини, но он прав. Ты фигню сказал. Если у тебя в таблице могут быть повторяющиеся строки, то это уже не первая нормальная форма. Если у тебя могут быть "пустоты", как в рассматриваемом примере, то это уже не вторая нормальная форма. Выводы сам делай.
27 Ёпрст
 
21.01.22
15:04
(20) Можно. Но только один раз.
28 Мультук
 
гуру
21.01.22
15:08
А ставкаНДС это вообще по всем признаком фотон.
Потому как может быть или перечислением, или справочником, или перечислением и справочником одновременно.
29 FIXXXL
 
21.01.22
15:19
(12) а не сам ли ты эти темы клепаешь? для попи..деть :)
30 pechkin
 
21.01.22
16:40
(22) ключ вообщето составным может быть и он в КИ как раз такой. так что вполне 2 нормальная форма
31 Sserj
 
21.01.22
17:27
(26) Вот какую ерунду ты сеешь в головы начинающих.
У тебя нет и не может быть в принципе "повторяющихся строк" в 1С.
У каждой строки есть уникальный идентификатор, это уже гарантирует что строки не повторяющиеся.
Так что контактная информация абсолютно нормализированная таблица.
32 novmax
 
21.01.22
17:35
После добавления условия в ГДЕ
КонтрагентыКонтактнаяИнформация.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Телефон)
по контрагентам, у которых телефон в карточке не указан, строки перестали выводиться вообще
33 shuhard
 
21.01.22
17:37
(32) замени на левое соединение
34 Kassern
 
21.01.22
17:37
(0) "ПО РеализацияТоваровУслугТовары.Ссылка.Контрагент.Ссылка = КонтрагентыКонтактнаяИнформация.Ссылка И КонтрагентыКонтактнаяИнформация.Вид=&НужныйВид"
35 Kassern
 
21.01.22
17:37
Еще и тип лучше прописать
36 Kassern
 
21.01.22
17:38
(35) имеется в виду КонтрагентыКонтактнаяИнформация.Тип=&НужныйТип
37 exwill
 
21.01.22
17:39
(31) Я сразу сказал, что если не придираться то это первая нормальная форма. А если придираться, то никакая.
Первая нормальная форма требует, чтобы строки не были упорядочены каким-либо образом. Т.е. можно сказать, что нумерация срок нарушает первую нормальную форму.
38 novmax
 
21.01.22
17:42
Спасибо! Получилось!
39 Kassern
 
21.01.22
17:43
(0) Чтобы было понимание, почему столько строк, возьмите листок бумаги, или эксельку и нарисуйте 2 таблицы. Первая будет с номерами заказов и контрагентами. Вторая будет с Таблчиной частью Контактная информация, где у вас будет Телефон, Электронная почта, адрес (множество строк) для одного контрагента. Можете прям из вашего контрагента табличку эту вытянуть. А далее почитать как работают соединения таблиц, внутреннее, левое, правое. И тогда у вас будет понимание, как их соединить и как отобрать нужные строки
40 Sserj
 
21.01.22
17:53
(37) Ну вот теперь ты совсем заблудился :)
"чтобы строки не были упорядочены каким-либо образом" - нет такого требования, даже упоминания.
Это у тебя обрывки воспоминаний из реляционной алгебры. В ней это называется реляционным множеством, состоящим из кортежей.
Контактная информация удовлетворяет всем правилам нормализации вплоть до четвертой.
Каждая строка уникальна, каждая строка однозначно идентифицируется по первичному ключу.
В таблице нет ссылок на саму себя (4 форма).
Она не может нормализоваться дальше. Так как твой пример - отдельно сделать таблицу для телефонов не может быть тут применен. Телефон у клиента он самодостаточен как строка, он не может быть применен к другим клиентам. Иными словами на него нельзя ссылаться из других строк.
41 exwill
 
21.01.22
18:04
(40) https://ru.wikipedia.org/wiki/Первая_нормальная_форма

https://ru.wikipedia.org/wiki/Вторая_нормальная_форма

Здесь обратите внимание на это:
"Вторая нормальная форма по определению запрещает наличие неключевых атрибутов, которые вообще не зависят от потенциального ключа"
В частности этим запрещаются разреженные "таблицы", когда вы делаете колонки, которые заполняются в разных строках.
42 exwill
 
21.01.22
18:06
(40) Да и просто можно включить общее понимание. Нормализация - это устранение избыточности. Пустая ячейка в контактных данных - явно избыточна.
43 Sserj
 
21.01.22
18:28
(41) Меньше читай википедичку. Так для справки - в СУБД таблицы в принципе не могут иметь какого-либо порядка. Порядок имеют только ключи.
Вот тут более близко к тому как на самом деле трактовал нормализацию Дейт:
https://habr.com/ru/post/254773/

"В частности этим запрещаются разреженные "таблицы", когда вы делаете колонки, которые заполняются в разных строках."
А кто сказал что они заполняются в разных строках. Они заполнены везде пустой строкой, 1С не допускает NULL.
И ни что не мешает к любому типу информации добавлять при необходимости и телефон. И к юрадресу и к физадресу и даже к емайлу кстати.

(41) Пустая ячейка в контактных явно избыточна. А вот она там и не пустая. Она строка нулевой длинны, но это лишь показывает о том что вот в этой организации ее не заполняют. Но 1С работает в сотнях тысяч организаций и довольно часто она заполнена совсем не пустой строкой.
44 exwill
 
21.01.22
20:04
(43) Как я вижу, вы просто не понимаете - о чем тут речь


Вид контакта   Адрес            Email          Телефон
======================================================
Адрес         г.Москва...      
Email                         [email protected]
Телефон                                       123-45-67  

Эта таблица не нормализована. Хоть у кого спросите
45 pechkin
 
21.01.22
20:12
(44) вроде не так же хранится:
Вид контакта - представление
46 exwill
 
21.01.22
20:12
(45) См. запрос в (0)
47 exwill
 
21.01.22
20:13
И результат запроса
48 pechkin
 
21.01.22
20:52
Точто там же еще расшифровка хранится
49 exwill
 
21.01.22
21:55
(48) Если бы там было одно поле "представление", то и этой темы не было бы. ТС не погрузился бы в недоумение - а почему это у меня телефоны пустые