Почему запрос возвращает удвоенный результат ?

1. Terabaytus 21.05.20 16:29 Сейчас в теме
Добрый день, на писал запрос только вот понять не могу выдаёт всё в двойне.
ВЫБРАТЬ
    	   ВыбраныйНомерКонтракта.ВыбраныйНомерКонтрактаДляФорм КАК ВыбраныйНомерКонтрактаДляФорм,
           Поставка.ПоставкаНомерКонтракта КАК ПоставкаНомерКонтракта,
           Поставка.Осталось
        ПОМЕСТИТЬ
    	   ВремТабПоставкаОстаток
    	ИЗ
    	   РегистрСведений.Поставка КАК Поставка,
    	   РегистрСведений.ВыбраныйНомерКонтракта КАК ВыбраныйНомерКонтракта
    	ГДЕ
    	   Поставка.ПоставкаНомерКонтракта = ВыбраныйНомерКонтрактаДляФорм
    	СГРУППИРОВАТЬ ПО
    	   ВыбраныйНомерКонтракта.ВыбраныйНомерКонтрактаДляФорм,
			Поставка.ПоставкаНомерКонтракта,
    	   Поставка.Осталось   
    	;
		ВЫБРАТЬ
			ВыбраныйНомерКонтракта.ВыбраныйНомерКонтрактаДляФорм,
			СпецификацияКонтракта.СпецификацияКонтрактаНомерКонтракта,
			СпецификацияКонтракта.СпецификацияКонтрактаНаименование,
		   СпецификацияКонтракта.СпецификацияКонтрактаКоличество,
			СпецификацияКонтракта.СпецификацияКонтрактаЦенаЗаЕд,
		   СпецификацияКонтракта.СпецификацияКонтрактаСумма,
			ВремТабПоставкаОстаток.Осталось
		ИЗ
			РегистрСведений.СпецификацияКонтракта КАК СпецификацияКонтракта,
			РегистрСведений.ВыбраныйНомерКонтракта КАК ВыбраныйНомерКонтракта
		ЛЕВОЕ СОЕДИНЕНИЕ
           ВремТабПоставкаОстаток КАК ВремТабПоставкаОстаток
        ПО
           (ВыбраныйНомерКонтракта.ВыбраныйНомерКонтрактаДляФорм = ВремТабПоставкаОстаток.ПоставкаНомерКонтракта)
Показать
Прикрепленные файлы:
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
7. x_x 2 21.05.20 19:53 Сейчас в теме
(5)у в СпецификацияКонтракта номер контракта и наименование контракта это по идее должны быть измерения.
в данном случае вы обращаетесь что на один номер контракта в то время когда на наименования контракта разные остатки, т.е. обычно левое вхождение у вас идет по номеру и конечно будет по две строки из ваших условий
Terabaytus; +1 Ответить
25. olegarch 6 23.05.20 23:44 Сейчас в теме +2 $m
(23)
И вот еще, кстати. Судя по всему, тут попытка получить остатки не в разрезе номера контракта, а в разрезе номера контракта и номенклатуры.
И тогда при соединении только по номеру контракта и получается такая картина.

Поставка:
12345 Ведро 4
12345 Антисептик 46

Спецификация:
12345 Ведро
12345 Антисептик

по НомерКонтракта

Дает набор:
Спецификация(12345), Спецификация(Ведро), Поставка(12345), Поставка(Ведро), Поставка(4)
Спецификация(12345), Спецификация(Ведро), Поставка(12345), Поставка(Антисептик), Поставка(46)
Спецификация(12345), Спецификация(Антисептик), Поставка(12345), Поставка(Ведро), Поставка(4)
Спецификация(12345), Спецификация(Антисептик), Поставка(12345), Поставка(Антисептик) , Поставка(46)

А если соединить по Номеру контракта и номенклатуре, получится набор:
Спецификация(12345), Спецификация(Ведро), Поставка(12345), Поставка(Ведро), Поставка(4)
Спецификация(12345), Спецификация(Антисептик), Поставка(12345), Поставка(Антисептик) , Поставка(46)
Terabaytus; +1 Ответить
Остальные ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. x_x 2 21.05.20 16:45 Сейчас в теме
в соединении условия связи по всем измерениям сделайте, или по более точным измерениям.
5. Terabaytus 21.05.20 18:44 Сейчас в теме
(2)Это как не совсем понял ?
7. x_x 2 21.05.20 19:53 Сейчас в теме
(5)у в СпецификацияКонтракта номер контракта и наименование контракта это по идее должны быть измерения.
в данном случае вы обращаетесь что на один номер контракта в то время когда на наименования контракта разные остатки, т.е. обычно левое вхождение у вас идет по номеру и конечно будет по две строки из ваших условий
Terabaytus; +1 Ответить
8. Terabaytus 21.05.20 19:58 Сейчас в теме
(7)У меня измерения другие это как то влияет на запрос ?
Прикрепленные файлы:
9. x_x 2 22.05.20 00:32 Сейчас в теме
(8)из РС Поставка вы можете кроме остатка получить еще то что скрывается под эти ->"СпецификацияКонтрактаНаименование" только в поставке?
11. Terabaytus 22.05.20 19:39 Сейчас в теме
(9) "СпецификацияКонтрактаНаименование" только в поставке э-э-э а при чём тут поставка это из таблицы спецификация контракта.
12. independ 1518 22.05.20 21:42 Сейчас в теме
 ИЗ
            РегистрСведений.ВыбраныйНомерКонтракта КАК ВыбраныйНомерКонтракта
        ЛЕВОЕ СОЕДИНЕНИЕ
            РегистрСведений.СпецификацияКонтракта КАК СпецификацияКонтракта
        ПО
           (ВыбраныйНомерКонтракта.КлючевоеПоле = ВремТабПоставкаОстаток.КлючевоеПоле)
        ЛЕВОЕ СОЕДИНЕНИЕ
           ВремТабПоставкаОстаток КАК ВремТабПоставкаОстаток
        ПО
           (ВыбраныйНомерКонтракта.ВыбраныйНомерКонтрактаДляФорм = ВремТабПоставкаОстаток.ПоставкаНомерКонтракта)

(11)
Показать
13. Terabaytus 23.05.20 10:24 Сейчас в теме
(12) Предлагаете присоединить к ВыбраныйНомерКонтракта а не к спецификации, я так уже делал и более того перебрал все соединения результат тот же. Я хочу присоединить к к одной таблице 2 и если присоединять их по отдельности то всё в прядке, но только все вместе начинает двоиться.
15. independ 1518 23.05.20 11:43 Сейчас в теме
(13) не знаю какая у вас конфигурация, но если данных немного, то можно сделать топорным способом, добавьте в результирующий запрос ключевое слово РАЗЛИЧНЫЕ
16. Terabaytus 23.05.20 12:07 Сейчас в теме
(15) Конфигурация 8.3. Я больше склоняюсь к ОБЪЕДИНИТЬ ВСЁ может поможет.
17. independ 1518 23.05.20 12:11 Сейчас в теме
(16)
Конфигурация 8.3
- платформа, а конфигурация?
18. Terabaytus 23.05.20 12:13 Сейчас в теме
19. independ 1518 23.05.20 12:21 Сейчас в теме
(18) а точнее, бухгалтерия, зуп, ут или своя разработка?
20. Terabaytus 23.05.20 12:51 Сейчас в теме
3. ab_initio 95 21.05.20 17:04 Сейчас в теме
        ИЗ
            РегистрСведений.СпецификацияКонтракта КАК СпецификацияКонтракта,
            РегистрСведений.ВыбраныйНомерКонтракта КАК ВыбраныйНомерКонтракта
        ЛЕВОЕ СОЕДИНЕНИЕ
           ВремТабПоставкаОстаток КАК ВремТабПоставкаОстаток



У вас в предложении ИЗ использован оператор "," (_запятая_). Это значит, что Вы перемножили две таблицы РегистрСведений.СпецификацияКонтракта и РегистрСведений.ВыбраныйНомерКонтракта между собой. Т.е. на каждую строчку первой приходится каждая строчка второй таблицы.
alex-l19041; +1 Ответить
4. Terabaytus 21.05.20 18:39 Сейчас в теме
(3)Если убрать запятую появляется ошибка.
Прикрепленные файлы:
6. ab_initio 95 21.05.20 19:21 Сейчас в теме
(4) Совсем убрать ее нельзя. Ее можно заменить на другой оператор. Всего в 1С-ке бинарных операторов с таблицами бывает 5:
1.запятая
2.внутреннее соединение
3.полное соединение
4.левое соединение
5.правое соединение
Вы уж нагуглите сами чем они отличаются.

В теоретических книжках
1.coma
2.inner join
3.full outer join
4.left outer join
5.right outer join
10. Terabaytus 22.05.20 19:36 Сейчас в теме
(6)Если добавить ещё одно левое соединение так же раздваивает .
14. Terabaytus 23.05.20 11:30 Сейчас в теме
(6) Попробовал со всеми соединениями всё так же.
21. ab_initio 95 23.05.20 16:00 Сейчас в теме
Тип соединения сам по себе - это не средство от дадвоений. Любого вида соединения могу вызвать задвоения. Все зависит от содержимого соединяемых таблиц.
22. olegarch 6 23.05.20 18:34 Сейчас в теме
Непонятна логика первого запроса. Плюс не виден смысл группировки без использования агрегатных функций.
Позволю себе предположить, что текст запроса должен быть примерно такой:

ВЫБРАТЬ
           ВыбраныйНомерКонтракта.ВыбраныйНомерКонтрактаДляФорм КАК ВыбраныйНомерКонтрактаДляФорм,           
           СУММА(ЕСТЬNULL(Поставка.Осталось,0)) КАК Осталось
        ПОМЕСТИТЬ
           ВремТабПоставкаОстаток
        ИЗ            
           РегистрСведений.ВыбраныйНомерКонтракта КАК ВыбраныйНомерКонтракта 
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Поставка КАК Поставка       
        ПО
           Поставка.ПоставкаНомерКонтракта = ВыбраныйНомерКонтракта.ВыбраныйНомерКонтрактаДляФорм
        СГРУППИРОВАТЬ ПО
           ВыбраныйНомерКонтракта.ВыбраныйНомерКонтрактаДляФорм,
            Поставка.ПоставкаНомерКонтракта   
        ;
Показать

Тогда это будет похоже на остаток. Можно добавить условие ИМЕЮЩИЕ СУММА(ЕСТЬNULL(Поставка.Осталось,0)) <> 0, чтобы получить только ненулевые остатки.

Второй запрос можно упростить:

ВЫБРАТЬ            
            СпецификацияКонтракта.СпецификацияКонтрактаНомерКонтракта,
            СпецификацияКонтракта.СпецификацияКонтрактаНаименование,
           СпецификацияКонтракта.СпецификацияКонтрактаКоличество,
            СпецификацияКонтракта.СпецификацияКонтрактаЦенаЗаЕд,
           СпецификацияКонтракта.СпецификацияКонтрактаСумма,
            ЕСТЬNULL(ВремТабПоставкаОстаток.Осталось, 0) КАК Осталось
        ИЗ
            РегистрСведений.СпецификацияКонтракта КАК СпецификацияКонтракта            
        ЛЕВОЕ СОЕДИНЕНИЕ
           ВремТабПоставкаОстаток КАК ВремТабПоставкаОстаток
        ПО
           (СпецификацияКонтракта.СпецификацияКонтрактаНомерКонтракта = ВремТабПоставкаОстаток.ПоставкаНомерКонтракта)
Показать

Тут можно заменить левое соединение на внутреннее и получить только ненулевые остатки.
Все зависит от назначения запроса, которое не раскрыто.
23. Terabaytus 23.05.20 21:51 Сейчас в теме
(22) В смысле не раскрыто я хочу получить данные из РС Остатки и добавить их к данным СпецификацияКонтракта причём соединяю их по Номеру контракта. У меня куча запросов с левым соединением и просто, но не один не двоил с это ересью только сейчас столкнулся не как решить не могу. Правда в тех РС измерение только одно, а в РС Поставка 4 это может влиять ?
Прикрепленные файлы:
24. olegarch 6 23.05.20 22:24 Сейчас в теме
(23)
Чтобы получить все остатки из этого регистра по номеру контракта, достаточно вытащить ПоставкаНомерКонтракта и Сумма(Осталось), сгруппировавшись по ПоставкаНомерКонтракта.

ВЫБРАТЬ
Поставка.ПоставкаНомерКонтракта КАК ПоставкаНомерКонтракта ,
СУММА(Поставка.Осталось) КАК Осталось
ПОМЕСТИТЬ
ВремТабПоставкаОстаток
ИЗ
РегистрСведений.Поставка КАК Поставка
СГРУППИРОВАТЬ ПО
Поставка.ПоставкаНомерКонтракта;
Показать


Очень специфическая структура регистра Поставка и назначение регистра ВыбраныйНомерКонтракта не очень понятно, потому и вопросы возникают...
28. Terabaytus 24.05.20 11:50 Сейчас в теме
(24) Вот всё таки не понимаю я вас или вы меня, но почему СУММА(Поставка.Осталось) КАК Осталось мне же не надо суммировать, а просто вставить в колонки те значения, что есть в остатке это я уже так к подаче материала.
29. olegarch 6 24.05.20 13:27 Сейчас в теме
(28) Да, есть такое дело. Пока стало понятно, какова цель, много времени прошло.

Но тут дело в том, что местные жители привыкли к типовым конфам и следуют пути одинэсника. На этом пути постоянно попадаются всеразличные остатки, но живут они в регистрах накопления и получаются через виртуальные таблицы остатков.

Эти виртуальные таблицы занимаются примерно тем, что и было описано в (24): суммированием ресурсов по заданным измерениям с учетом движений. Грубо говоря, документ спецификация делает приход, документ поставка - расход, а остатки дают понимание, сколько еще осталось получить... Это классика, все остальное останется в лучшем случае непонятым.

Если вернуться к обсуждаемому кейсу, теперь, когда стало понятно, что там еще и номенклатура участвует, в вт, которая эмулирует таблицу остатков, просто появится еще поле с номенклатурой, которое добавится в группировку.

Но, опять же, такие вещи лучше делать не на рс, а на рн, это, во-первых, намного проще, т.к. всю логику возьмет на себя платформа, и, во-вторых, больше шансов получить ответы на вопросы, т.к. эта логика понятна сообществу...
25. olegarch 6 23.05.20 23:44 Сейчас в теме +2 $m
(23)
И вот еще, кстати. Судя по всему, тут попытка получить остатки не в разрезе номера контракта, а в разрезе номера контракта и номенклатуры.
И тогда при соединении только по номеру контракта и получается такая картина.

Поставка:
12345 Ведро 4
12345 Антисептик 46

Спецификация:
12345 Ведро
12345 Антисептик

по НомерКонтракта

Дает набор:
Спецификация(12345), Спецификация(Ведро), Поставка(12345), Поставка(Ведро), Поставка(4)
Спецификация(12345), Спецификация(Ведро), Поставка(12345), Поставка(Антисептик), Поставка(46)
Спецификация(12345), Спецификация(Антисептик), Поставка(12345), Поставка(Ведро), Поставка(4)
Спецификация(12345), Спецификация(Антисептик), Поставка(12345), Поставка(Антисептик) , Поставка(46)

А если соединить по Номеру контракта и номенклатуре, получится набор:
Спецификация(12345), Спецификация(Ведро), Поставка(12345), Поставка(Ведро), Поставка(4)
Спецификация(12345), Спецификация(Антисептик), Поставка(12345), Поставка(Антисептик) , Поставка(46)
Terabaytus; +1 Ответить
27. Terabaytus 24.05.20 11:47 Сейчас в теме
(25)Ну вот дело сдвинулось с мёртвой точки только уточню, что так
А если соединить по Номеру контракта и номенклатуре, получится набор
у меня поля остаток вышли пустыми
соединил по номенклатуре спецификации и номенклатуре поставка, всё появилось
.
Прикрепленные файлы:
30. olegarch 6 24.05.20 13:42 Сейчас в теме
(27) если соединять только по номенклатуре, можно зацепить несколько договоров с одинаковой номенклатурой и получить совсем не то, что хотелось. Лучше осознать, почему по полям идентичного назначения связаться не получается. М.б. в запросе косяк какой, или вообще типы полей разные?..
Terabaytus; +1 Ответить
26. starjevschik 24.05.20 10:05 Сейчас в теме
Почитал обсуждение. Время автора намного рациональнее потратить на изучения языка запросов SQL. Или поменять сферу деятельности...
nomad_irk; +1 Ответить
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)