Имя: Пароль:
1C
1С v8
Прошу помощи с запросом (соединения таблиц)
0 lega0000
 
25.07.13
10:55
Есть два документа, Начисление стипендии и возврат. В возврате есть реквизит с ссылкой на документ начисления. Нужно выбрать все документы начисления в левую таблицу и присоединить справа документы возврата, но документов возврата может быть много с ссылкой на один и тот же документ начисления, поэтому документ начисления в результате запроса дублируется, и само плохо то, что дублируются суммы документа, и выводится неправильный итог. как сделать чтобы начисление не дублировалось, а выводился NULL или пустая ссылка?

ВЫБРАТЬ
    КлассификаторСтранМира.Ссылка КАК СтранаОбучения,
    НачислениеСтипендии.Ссылка КАК Расход,
    НачислениеСтипендии.Номер КАК НомерВедомости,
    НачислениеСтипендии.Дата КАК ДатаВедомости,
    НачислениеСтипендии.СуммаДокументаТенге КАК СуммаВедомости,
    Возврат.Ссылка.Дата КАК ДатаВозврата,
    Возврат.Сумма КАК СуммаВозврата,
    ПлатежноеПоручениеИсходящееВозврат.Ссылка.Дата КАК ДатаОплатыВозврата,
    ПлатежноеПоручениеИсходящееВозврат.СуммаКВыплате КАК СуммаОплатыВозврата
ИЗ
    Справочник.КлассификаторСтранМира КАК КлассификаторСтранМира
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.НачислениеСтипендии КАК НачислениеСтипендии
            ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                ВозвратТабличнаяЧасть.ДокументОснование КАК ДокументОснование,
                ВозвратТабличнаяЧасть.Ссылка КАК Ссылка,
                СУММА(ВозвратТабличнаяЧасть.Сумма) КАК Сумма
            ИЗ
                Документ.Возврат.ТабличнаяЧасть КАК ВозвратТабличнаяЧасть
            
            СГРУППИРОВАТЬ ПО
                ВозвратТабличнаяЧасть.ДокументОснование,
                ВозвратТабличнаяЧасть.Ссылка) КАК Возврат
                ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПлатежноеПоручениеИсходящее.ПеречислениеЗаработнойПлаты КАК ПлатежноеПоручениеИсходящееВозврат
                ПО Возврат.Ссылка = ПлатежноеПоручениеИсходящееВозврат.Ведомость
            ПО НачислениеСтипендии.Ссылка = Возврат.ДокументОснование
        ПО КлассификаторСтранМира.Ссылка = НачислениеСтипендии.Страна

УПОРЯДОЧИТЬ ПО
    НомерВедомости
АВТОУПОРЯДОЧИВАНИЕ
1 cw014
 
25.07.13
10:56
Кодом
2 Maxus43
 
25.07.13
10:56
Или итоги по Начислению стипендии
3 Ёпрст
 
25.07.13
10:57
(0) Итоги
4 viktor_vv
 
25.07.13
10:57
5 lega0000
 
25.07.13
14:02
(1)Желательно сделать это запросом, так как выгруженный результат, я сразу хочу вывести в ТабДок.
(2) и (3) Что - то с итогами не получается, может поможете? (4) Тоже не получилось(, может руки кривые.
6 viktor_vv
 
25.07.13
14:08
Итоги Максимум(НачислениеСтипендии.СуммаДокументаТенге)  ПО КлассификаторСтранМира.Ссылка, НачислениеСтипендии.Ссылка


Как-то так.
7 viktor_vv
 
25.07.13
14:11
Точнее так

Итоги Максимум(НачислениеСтипендии.СуммаДокументаТенге), Сумма(Возврат.Сумма), Сумма(ПлатежноеПоручениеИсходящееВозврат.СуммаКВыплате)  ПО КлассификаторСтранМира.Ссылка, НачислениеСтипендии.Ссылка
8 MiniMuk
 
25.07.13
14:36
Как минимум из запроса удали измерение, оставь только ресурс
9 lega0000
 
25.07.13
14:39
ВЫБРАТЬ
    КлассификаторСтранМира.Ссылка КАК СтранаОбучения,
    НачислениеСтипендии.Ссылка КАК Расход,
    НачислениеСтипендии.Номер КАК НомерВедомости,
    НачислениеСтипендии.Дата КАК ДатаВедомости,
    НачислениеСтипендии.СуммаДокументаТенге КАК СуммаВедомости,
    Возврат.Ссылка.Дата КАК ДатаВозврата,
    Возврат.Сумма КАК СуммаВозврата,
    ПлатежноеПоручениеИсходящееВозврат.Ссылка.Дата КАК ДатаОплатыВозврата,
    ПлатежноеПоручениеИсходящееВозврат.СуммаКВыплате КАК СуммаОплатыВозврата
ИЗ
    Справочник.КлассификаторСтранМира КАК КлассификаторСтранМира
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.НачислениеСтипендии КАК НачислениеСтипендии
            ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                ВозвратТабличнаяЧасть.ДокументОснование КАК ДокументОснование,
                ВозвратТабличнаяЧасть.Ссылка КАК Ссылка,
                СУММА(ВозвратТабличнаяЧасть.Сумма) КАК Сумма
            ИЗ
                Документ.Возврат.ТабличнаяЧасть КАК ВозвратТабличнаяЧасть
            
            СГРУППИРОВАТЬ ПО
                ВозвратТабличнаяЧасть.ДокументОснование,
                ВозвратТабличнаяЧасть.Ссылка) КАК Возврат
                ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПлатежноеПоручениеИсходящее.ПеречислениеЗаработнойПлаты КАК ПлатежноеПоручениеИсходящееВозврат
                ПО Возврат.Ссылка = ПлатежноеПоручениеИсходящееВозврат.Ведомость
            ПО НачислениеСтипендии.Ссылка = Возврат.ДокументОснование
        ПО КлассификаторСтранМира.Ссылка = НачислениеСтипендии.Страна

УПОРЯДОЧИТЬ ПО
    НомерВедомости
ИТОГИ
    МАКСИМУМ(СуммаВедомости),
    СУММА(СуммаВозврата),
    СУММА(СуммаОплатыВозврата)
ПО
    СтранаОбучения,
    Расход
АВТОУПОРЯДОЧИВАНИЕ

Сделал так, неполучилось, много документов вообще не выводит, и много документов дублирует.
10 Crush
 
25.07.13
14:44
Складывай данные в регистры. По регистрам строй запрос.

Если считаешь, что дублей не должно быть, то отдельно формируй таблицы и смотри почему дублируются. У тебя как минимум может быть несколько возвратов с одним основанием.
11 lega0000
 
25.07.13
15:03
(10) в регистры данные записываются, но нужных данных там нет,  а менять и перепроводить документы бухи не разрешают.

Как раз поэтому и дублируются, возвратов несколько на один документ начисления. Сам документ продублированный не мешает, плохо то, что сумма документа дублируется и выдает неправильный итог.
Если запросом сделать неполучиться, придется делать кодом, но хотелось бы сделать красиво.
12 viktor_vv
 
25.07.13
15:05
(9) Выводишь как ? Иерархически ?
13 viktor_vv
 
25.07.13
15:07
И на это "много документов вообще не выводит" итоги никак повлиять не должны были.
14 Crush
 
25.07.13
15:08
(11) А ты документы не проводи. Напиши процедуру, которая заполняет регистр на основании документа и запусти в цикле по всем документам. И вставь её вызов в процедуру проведения.

Да и запрос пересмотри. Бери страну из документа (или регистра) и не связывай с ОКСМ.
+ компонуй на СКД
15 1Сергей
 
25.07.13
15:09
Сразу же после строки

ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.НачислениеСтипендии КАК НачислениеСтипендии

Должна быть строка начинающаяся со слова ПО
16 1Сергей
 
25.07.13
15:12
а так, каша какая-то а не запрос.

ЗЫ ветку и (0) не читал, сорри
17 viktor_vv
 
25.07.13
15:17
(15) Она есть, только в конце. Это, если я не ошибаюсь, каскадные соединения.
18 lega0000
 
25.07.13
15:51
(12) Вывожу без иерархии.
(13) Тоже не могу понять почему так получилось.
(14) Не додумался. Но если даже в регистре эти данные будут, все равно же придется таблицы соединять.
19 Crush
 
25.07.13
15:57
(18) Ты сделай сначала две таблицы. Посмотри что там. Распечатай кусочки. Попробуй соединить вручную (на бумаге) и подумай что получится.
+ пользуй консоль запросов
20 Crush
 
25.07.13
16:03
Если Документ.ПлатежноеПоручениеИсходящее.ПеречислениеЗаработнойПлаты это табличная часть, то все суммы возвратов и суммы ведомостей дублируются от неё.
Сделай 3 временных таблицы с ключевыми полями а потом к возвратам делай соединения "все ко всем" (помоему Полное называется). Не забудь про ЕстьNull для значений соединяемых таблиц
21 lega0000
 
25.07.13
16:46
(20) Да, в правой таблице ТабЧасть, только не в платежке, а в возврате, но там все сгруппировано в одну строчку. Можно даже без платежки проверять. Дублирование получается потому что на одно начисление встречается два возврата. Задача в том, чтобы дублирующие поля выводить пустыми.

На консоли запросов все и проверяю.

Действительно, зачем я выводил ОКСМ.

Сейчас убрал Платежку, чтоб лишнее не мешало:

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

УПОРЯДОЧИТЬ ПО
    НомерВедомости
АВТОУПОРЯДОЧИВАНИЕ
22 lega0000
 
25.07.13
16:48
(20) Можно подробнее с временными таблицами?
23 lega0000
 
25.07.13
17:00
Вот результат запроса:
<a target="_blank" href="http://radikal.ru/fp/73690ddf68f04877af338784d3007931"><img src="http://s56.radikal.ru/i153/1307/ad/8ff0e5cdf5d2t.jpg"; ></a>
24 lega0000
 
25.07.13
17:01
25 lega0000
 
25.07.13
17:01
26 viktor_vv
 
25.07.13
17:09
Если нужна плоская таблица, Итоги не помогут.
27 lega0000
 
25.07.13
17:22
Как тогда сказать запросу, что если поле дублируется в следующей строке, тогда поставь "" или 0. Функции запроса посмотрел, подходящего вроде ничего нет.
28 viktor_vv
 
25.07.13
17:27
ВЫБРАТЬ
            ВозвратТабличнаяЧасть.ДокументОснование КАК ДокументОснование,
            ВозвратТабличнаяЧасть.Ссылка КАК Ссылка,
            СУММА(ВозвратТабличнаяЧасть.Сумма) КАК Сумма
        Поместить ВремВозвраты
        ИЗ
            Документ.Возврат.ТабличнаяЧасть КАК ВозвратТабличнаяЧасть
            
        
        СГРУППИРОВАТЬ ПО
            ВозвратТабличнаяЧасть.ДокументОснование,
            ВозвратТабличнаяЧасть.Ссылка
;            
Выбрать
ИЗ
    Подзапрос.Расход КАК Расход,
    НачислениеСтипендии2.Страна КАК СтранаОбучения,
    НачислениеСтипендии2.Номер КАК НомерВедомости,
    НачислениеСтипендии2.Дата КАК ДатаВедомости,
    Подзапрос.СуммаВедомости КАК СуммаВедомости,
    Позапрос.СуммаВозврата КАК СуммаВозврата,
    Позапрос.ВозвратСсылка КАК ВозвратСсылка
//    Возврат.Сумма КАК СуммаВозврата    

(ВЫБРАТЬ

    НачислениеСтипендии.Ссылка КАК Расход,
    НачислениеСтипендии.СуммаДокументаТенге КАК СуммаВедомости,
    Null КАК ВозвратСсылка,
    0 КАК СуммаВозврата
ИЗ
    Документ.НачислениеСтипендии КАК НачислениеСтипендии

    Объединить ВСЕ
    
ВЫБРАТЬ

    ВремВозвраты.ДокументОснование,
    0 ,
    ВремВозвраты.Ссылка КАК ВозвратСсылка,
    ВремВозвраты.Сумма КАК СуммаВозврата
ИЗ
    ВремВозвраты КАК ВремВозвраты
) КАК Подзапрос
ЛевоеСоединение Документ.НачислениеСтипендии КАК НачислениеСтипендии2
    ПО НачислениеСтипендии2.Ссылка = Подзапрос.Расход
    Упорядочить ПО НомерВедомости
29 viktor_vv
 
25.07.13
17:29
Второй запрос так начинается, а то там поменял местами

Выбрать
    Подзапрос.Расход КАК Расход,
    НачислениеСтипендии2.Страна КАК СтранаОбучения,
    НачислениеСтипендии2.Номер КАК НомерВедомости,
    НачислениеСтипендии2.Дата КАК ДатаВедомости,
    Подзапрос.СуммаВедомости КАК СуммаВедомости,
    Подзапрос.СуммаВозврата КАК СуммаВозврата,
    Подзапрос.ВозвратСсылка КАК ВозвратСсылка
ИЗ

//    Возврат.Сумма КАК СуммаВозврата    

(ВЫБРАТЬ
30 lega0000
 
25.07.13
17:34
Спасибо, буду пробовать.
31 viktor_vv
 
25.07.13
17:35
Тут правда даже если на одно начисление был один возврат выведется две строки, но без задвоения соотвествующих сумм, и общие итоги будут правильными, и если сгруппировать до начисления и просуммировать, то по нему тоже итоги правильными будут.
32 Crush
 
25.07.13
17:35
(22) Выбрать чтоТо  Поместить втТоТо из ЧегоТо;
Потом обращайся к таблице Выбрать * из втТоТо
(27) Запросу об этом никак не сказать. А вот СКД поймет

Какая итоговая таблица должна получиться?

Если хочешь запросом, то придется жертвовать полем ДатаВозврата и группировку во вложенном запросе сокращать

Лучше делай на СКД. Там несмотря на задвоенные начисления будешь получать правильный итог
33 viktor_vv
 
25.07.13
17:38
(31)+ Ну и даты номер возврата прилепишь еще левым соединением возвраты по ссылке.
34 viktor_vv
 
25.07.13
17:41
(33)+ И теоретически можно было и без временной таблицы обойтись, в таком варианте особого толку от нее не будет.
35 lega0000
 
25.07.13
17:48
(32) Таблица примерно должна быть такая: http://s018.radikal.ru/i505/1307/5b/717d75993454.png
вторая половина:
http://s50.radikal.ru/i130/1307/d0/91ed46fcf41d.png
Все соединения сделаны, проблема только в дублирующихся суммах документов.
Дата и номер обязательно нужны, без них бы уже все работало.
На СКД придется потратить кучу времени, а тут осталось сделать только это.
36 viktor_vv
 
25.07.13
17:54
(35) Ну с датами и номером возврата в такую таблицу, если их два было , по любому двумя строчками придется лепить. Даже если предположить что в первой получится вывести один возврат.
37 viktor_vv
 
25.07.13
18:00
А если в первый запрос пакета добавить

            ВозвратТабличнаяЧасть.ДокументОснование КАК ДокументОснование,
            ВозвратТабличнаяЧасть.Ссылка КАК Ссылка,
Количество(ВозвратТабличнаяЧасть.ДокументОснование,ВозвратТабличнаяЧасть.Ссылка) КАК НомерВозврат

то вполне можно будет через левое соединение с выводом сумм через
Выбор КОГДА ТаблицаВозвратов.НомерВозврата = 1 Тогда СуммаВедомости Иначе 0 Конец КАК СуммаВедомости

не совсем уверен то ли вернет Количество(), что я думаю.
38 viktor_vv
 
25.07.13
18:01
(37)+ А не, фигня, не то.
39 Crush
 
25.07.13
18:02
(35) Трать время на СКД.
Если будешь пытаться запросом решить, то больше времени потратишь, и решение будет корявым.

Еще в СКД есть фишка. В одну ячейку можно запихать "Возврат 01.01.2013 300 рублей, Возврат 02.01.2013 400 рублей".
40 Crush
 
25.07.13
18:07
Заполни свою таблицу реальными данными (где 2 возврата). Всего 2 строчки заполни. Посмотри на них, напиши итоги.
Если где то захочешь стереть сумму начисления, то поймешь, что фигня получается.

В СКД делай 3 набора данных. Первый - начисления. И к нему лепи платежки (2-ой) и возвраты (3-ий). Хотя сначала лучше справься с начислениями и возвратами. Удачи!
41 mistеr
 
25.07.13
19:04
(39) +1
42 Bober
 
25.07.13
19:11
(39) + 1
+ можно сделать соединение через два набора данных, в этом случае итоги по ресурсам первого набора будут считаться правильно.
43 lega0000
 
25.07.13
21:43
Сколько не пытался, не получается. Весь день потратил. Решил забить на свою затею, и начать строить отчет на СКД по совету Crush, хотя еще есть вариант ручками доделать, перебрать циклом и пересчитать суммы документов, но долго будет это все работать, данных слишком много. Поэтому склоняюсь к первому варианту.
Еще наверное вернусь сюда с построением СКД.