1. Terabaytus 21.05.20 16:29 Сейчас в теме

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

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

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



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

Ведущий программист 1С
Санкт-Петербург
зарплата от 130 000 руб.
Полный день

Специалист 1 категории (Программист 1С ФЗД)
Фрязино
зарплата от 110 000 руб.
Полный день

Специалист 1 категории (Программист 1С)
Фрязино
зарплата от 110 000 руб.
Полный день

Автор новостных обзоров на тему 1С и бухучета
Санкт-Петербург
По совместительству