Имя: Пароль:
1C
1С v8
Как вложить ТЗ в ТЗ в запросе
0 MaiorovYury
 
13.11.14
10:34
Извиняюсь за непонятный сабж, но не знаю как иначе кратко объяснить.
Задача следующая - есть самописная конфигурация, в ней 2 документа - ГТД и Инвойс.
В ГТД есть ТЧ - Инвойсы, в ней ссылка на инвойс и суммы сборов и прочего.
Примерно так

ВЫБРАТЬ
    РаспределениеДополнительныхСуммГТД.Ссылка,
    РаспределениеДополнительныхСуммГТД.Инвойсы.(
        Ссылка,
        Инвойсы,
    )
ИЗ
    Документ.РаспределениеДополнительныхСуммГТД КАК РаспределениеДополнительныхСуммГТД

В Инвойсах есть ТЧ Товары. Хочется в запросе в ТЗ Инвойсы еще добавить ТЗ Инвойсы.Товары, чтобы выглядело так

ВЫБРАТЬ
    РаспределениеДополнительныхСуммГТД.Ссылка,
    РаспределениеДополнительныхСуммГТД.Инвойсы.(
        Ссылка,
        Инвойсы,
        Инвойсы.Товары,
    )
ИЗ
    Документ.РаспределениеДополнительныхСуммГТД КАК РаспределениеДополнительныхСуммГТД

Но если делать так вываливается с ошибкой "Поля из различных вложенных таблиц используются в одном результирующем поле".
Сделать соединениями тоже не получается

Так вообще 1С падает с таким сообщением
Ошибка SDBL:
VT8505 не является именем поля

ВЫБРАТЬ
    РаспределениеДополнительныхСуммГТД.Ссылка,
    РаспределениеДополнительныхСуммГТД.Инвойсы.(
        Ссылка,
        Инвойсы,
        ИнвойсыПоставщиков.Товары
    )
ИЗ
    Документ.РаспределениеДополнительныхСуммГТД КАК РаспределениеДополнительныхСуммГТД
ЛЕВОЕ СОЕДИНЕНИЕ
    Документ.ИнвойсыПоставщиков КАК ИнвойсыПоставщиков
ПО
    ИнвойсыПоставщиков.Ссылка = РаспределениеДополнительныхСуммГТД.Инвойсы.Инвойсы;


Конечно можно сделать так

ВЫБРАТЬ
    РаспределениеДополнительныхСуммГТД.Ссылка,
    РаспределениеДополнительныхСуммГТД.Инвойсы.(
        Ссылка,
        Инвойсы,
    ),
    ИнвойсыПоставщиков.Товары
ИЗ
    Документ.РаспределениеДополнительныхСуммГТД КАК РаспределениеДополнительныхСуммГТД
ЛЕВОЕ СОЕДИНЕНИЕ
    Документ.ИнвойсыПоставщиков КАК ИнвойсыПоставщиков
ПО
    ИнвойсыПоставщиков.Ссылка = РаспределениеДополнительныхСуммГТД.Инвойсы.Инвойсы;

Но если несколько инвойсов в одном ГТД то буду получать повторяющиеся строки. А вообще мне это надо для обмена через COM, так что хочется как можно меньше ненужно информации возвращать
1 vicof
 
13.11.14
10:35
Левое соединение
2 MaiorovYury
 
13.11.14
10:37
(1) А дальше?
Я пытался левым соединение сделать, но именно вложить в ТЗ не получается
3 MaiorovYury
 
13.11.14
10:39
Такой вариант тоже двоит строки


ВЫБРАТЬ
    РаспределениеДополнительныхСуммГТД.Ссылка,
    РаспределениеДополнительныхСуммГТД.Инвойсы,
    ИнвойсыПоставщиков.Товары
ИЗ
    Документ.РаспределениеДополнительныхСуммГТД.Инвойсы КАК РаспределениеДополнительныхСуммГТД
ЛЕВОЕ СОЕДИНЕНИЕ
    Документ.ИнвойсыПоставщиков КАК ИнвойсыПоставщиков
ПО
    ИнвойсыПоставщиков.Ссылка = РаспределениеДополнительныхСуммГТД.Инвойсы;
4 vicof
 
13.11.14
10:42
не надо вкладывать. Чтобы не двоил, есть агрегатные функции.
5 MaiorovYury
 
13.11.14
10:47
(4) Например?
Если брать РАЗЛИЧНЫЕ - вот ошибка
В запросе с предложениями РАЗЛИЧНЫЕ или ОБЪЕДИНИТЬ нельзя использовать вложенные таблицы

Какую еще агрегатную функцию можно тут использовать?
6 MaiorovYury
 
13.11.14
10:48
(5) Да и если бы РАЗЛИЧНЫЕ сработало - ничего не изменилось бы
Пытался так сделать, но это тоже самое что и без группировки

ВЫБРАТЬ
    РаспределениеДополнительныхСуммГТД.Ссылка,
    РАЗЛИЧНЫЕ(ИнвойсыПоставщиков.Товары)
ИЗ
    Документ.РаспределениеДополнительныхСуммГТД.Инвойсы КАК РаспределениеДополнительныхСуммГТД
ЛЕВОЕ СОЕДИНЕНИЕ
    Документ.ИнвойсыПоставщиков КАК ИнвойсыПоставщиков
ПО
    ИнвойсыПоставщиков.Ссылка = РаспределениеДополнительныхСуммГТД.Инвойсы
СГРУППИРОВАТЬ ПО
    РаспределениеДополнительныхСуммГТД.Ссылка
7 vicof
 
13.11.14
10:53
(5) МАКСИМУМ(), например. Будет больше строк в запросе. Но одну ГТД несколько инвойсов, на один инвойс - несколько товаров.
8 Drac0
 
13.11.14
10:54
(6) РАЗЛИЧНЫЕ суешь не туда. Надо: ВЫБРАТЬ РАЗЛИЧНЫЕ и дальше по тексту.
9 MaiorovYury
 
13.11.14
11:05
(7)(8) Эти варианты ничем не будут отличаться от того, что я уже писал

ВЫБРАТЬ
    РаспределениеДополнительныхСуммГТД.Ссылка,
    РаспределениеДополнительныхСуммГТД.Инвойсы,
    ИнвойсыПоставщиков.Товары
ИЗ
    Документ.РаспределениеДополнительныхСуммГТД.Инвойсы КАК РаспределениеДополнительныхСуммГТД
ЛЕВОЕ СОЕДИНЕНИЕ
    Документ.ИнвойсыПоставщиков КАК ИнвойсыПоставщиков
ПО
    ИнвойсыПоставщиков.Ссылка = РаспределениеДополнительныхСуммГТД.Инвойсы;
10 Иоканаан
 
13.11.14
11:09
(0)Честно говоря мало что понял из обсуждения. Но кабы мне нужно было объединить данные из табличных частей двух разных документов, я бы сделал это запросом с ОБЪЕДИНИТЬ ВСЕ. Быть может, в Вашем случае это тоже подойдёт?
11 MaiorovYury
 
13.11.14
11:18
(10) тут нужно не объединить, а вложить
Хочется как можно меньше повторяющихся данных - поэтому надо вложить в одну строку еще одну ТЗ
12 К_Дач
 
13.11.14
11:44
вложить = левое соединение Тз1 с Тз2 + группировать по всем полям Тз1 при выводе
13 hhhh
 
13.11.14
11:54
(11) новые плюшкины? Чето вы там сэкономите 10 мегабайт. А в скорости потеряете в 2 раза.
14 MaiorovYury
 
13.11.14
14:01
(13) учитывая что соединение по com идет из Питера в Москву и скорость получения данных оттуда сильно страдает, думаю, что оптимизировать нужно именно на уровне передачи данных
15 MaiorovYury
 
13.11.14
14:03
(12) не понимаю как это сделать.
Если группировать по всем полям Тз1 - то что делать с полями Тз2 ?
Разве запрос заработает, если не группировать по ним и не использовать агрегатную функцию? Если использовать агрегатную функцию, то какую?
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс