Имя: Пароль:
1C
1С v8
Помогите составить запрос
,
0 romanыч
 
05.09.18
04:43
Не могу понять можно ли и как составить такой запрос:
Есть Документ1 и документ2 с реквизитом-ссылкой на документ1. Нужно выбрать все Документ1 и связанные с ним Документ2, но так чтобы количество строк в результате было равно количеству документ1 (по 1 строке на каждый документ), а документ2 попадал в результат тот, который проведен (если такой есть), а если нету то любой первый. Или может быть проще после составления запроса с дублирующими строками удалить ненужные?
1 shadow_sw
 
05.09.18
05:14
пример покажи чего хочешь то?
2 catena
 
05.09.18
05:27
Выбрать Док1.Ссылка, Максимум(Док2.Ссылка) из Документ.Док1 Док1
    Левое соединение Документ.Док2 Док2 по Док1.СсылкаДок2=Док2.Ссылка и Док2.Проведен
Сгруппировать по Док1.Ссылка
3 romanыч
 
05.09.18
05:28
ВЫБРАТЬ
ТоварыВРемонте.Склад.Магазин КАК Магазин,
ТоварыВРемонте.ПриемВРемонт КАК Ссылка,
ТоварыВРемонте.ПриемВРемонт.Контрагент КАК Контрагент,
ТоварыВРемонте.Номенклатура КАК Номенклатура,
ТоварыВРемонте.Характеристика КАК Характеристика,
ТоварыВРемонте.ПриемВРемонт.Комментарий КАК Комментарий,
ТоварыВРемонте.ПриемВРемонт.Номер КАК Номер,
ТоварыВРемонте.ПриемВРемонт.Дата КАК Дата,
ТоварыВРемонте.ПриемВРемонт.Комплектация КАК Комплектация,
ТоварыВРемонте.ПриемВРемонт.МеханическиеПовреждения КАК МеханическиеПовреждения,
ТоварыВРемонте.ПриемВРемонт.СуммаДокумента КАК СуммаДокумента,
ТоварыВРемонте.ПриемВРемонт.Описание КАК Описание,
ВЫБОР
    КОГДА ЕСТЬNULL(орВозвратИзРемонта.Ссылка, ЛОЖЬ) = ЛОЖЬ
        ТОГДА ЛОЖЬ
    ИНАЧЕ ИСТИНА
КОНЕЦ КАК Выполнено,
орВозвратИзРемонта.Ссылка КАК ВозвратИзРемонтаСсылка,
орВозвратИзРемонта.Номер КАК ВозвратИзРемонтаНомер,
орВозвратИзРемонта.Дата КАК ВозвратИзРемонтаДата,
орВозвратИзРемонта.Склад КАК ВозвратИзРемонтаСклад,
орВозвратИзРемонта.СуммаДокумента КАК ВозвратИзРемонтаСумма,
орВозвратИзРемонта.Описание КАК ВозвратИзРемонтаОписание,
орВозвратИзРемонта.Комментарий КАК ВозвратИзРемонтаКомментарий,
ор_ПередачаВСтороннийСервисныйЦентр.Ссылка КАК ПередачаВСтороннийСервисныйЦентрСсылка,
ор_ПередачаВСтороннийСервисныйЦентр.Проведен КАК ПередачаВСтороннийСервисныйЦентрПроведен,
ор_ВозвратИзСтороннегоСервисногоЦентра.Ссылка КАК ВозвратИзСтороннегоСЦСсылка,
ВЫБОР
    КОГДА НЕ ЧекККМП.ОперацияСДенежнымиСредствами
        ТОГДА ЧекККМП.Ссылка
    КОГДА ЧекККМП.ОперацияСДенежнымиСредствами
        ТОГДА ЧекККМПЧ.Ссылка
    КОГДА НЕ ЧекККМ.ОперацияСДенежнымиСредствами
        ТОГДА ЧекККМ.Ссылка
    ИНАЧЕ ЧекККМЧ.Ссылка
КОНЕЦ КАК ЧекККМ,
ВЫБОР
    КОГДА НЕ ЧекККМП.ОперацияСДенежнымиСредствами
        ТОГДА ЕСТЬNULL(ЧекККМП.Проведен, ЛОЖЬ)
    КОГДА ЧекККМП.ОперацияСДенежнымиСредствами
        ТОГДА ЕСТЬNULL(ЧекККМПЧ.Проведен, ЛОЖЬ)
    КОГДА НЕ ЧекККМ.ОперацияСДенежнымиСредствами
        ТОГДА ЕСТЬNULL(ЧекККМ.Проведен, ЛОЖЬ)
    ИНАЧЕ ЕСТЬNULL(ЧекККМЧ.Проведен, ЛОЖЬ)
КОНЕЦ КАК Выдано,
my_ДокументыРемонтаОбменПланфикс.id КАК id,
my_ДокументыРемонтаОбменПланфикс.General КАК General,
my_ДокументыРемонтаОбменПланфикс.Статус КАК Статус,
my_ДокументыРемонтаОбменПланфикс.ПредыдущийСтатус КАК ПредыдущийСтатус,
my_ДокументыРемонтаОбменПланфикс.Статус.Код КАК КодСтатуса
            //               |ИЗ
РегистрНакопления.ор_ТоварыВРемонте.Остатки КАК ТоварыВРемонте
    ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЧекККМ КАК ЧекККМП
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЧекККМ КАК ЧекККМПЧ
        ПО ЧекККМП.Ссылка = ЧекККМПЧ.ДокументРасчета
    ПО ТоварыВРемонте.ПриемВРемонт.Ссылка = ЧекККМП.my_ПриемВРемонт
    ЛЕВОЕ СОЕДИНЕНИЕ Документ.ор_ВозвратИзРемонта КАК орВозвратИзРемонта
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЧекККМ КАК ЧекККМ
            ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЧекККМ КАК ЧекККМЧ
            ПО ЧекККМ.Ссылка = ЧекККМЧ.ДокументРасчета
        ПО орВозвратИзРемонта.Ссылка = ЧекККМ.ор_ВозвратИзРемонта
    ПО ТоварыВРемонте.ПриемВРемонт.Ссылка = орВозвратИзРемонта.ПриемВРемонт
    ЛЕВОЕ СОЕДИНЕНИЕ Документ.ор_ПередачаВСтороннийСервисныйЦентр КАК ор_ПередачаВСтороннийСервисныйЦентр
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ор_ВозвратИзСтороннегоСервисногоЦентра КАК ор_ВозвратИзСтороннегоСервисногоЦентра
        ПО ор_ПередачаВСтороннийСервисныйЦентр.Ссылка = ор_ВозвратИзСтороннегоСервисногоЦентра.ДокументОснование
    ПО ТоварыВРемонте.ПриемВРемонт.Ссылка = ор_ПередачаВСтороннийСервисныйЦентр.ПриемВРемонт.Ссылка
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.my_ДокументыРемонтаОбменПланфикс КАК my_ДокументыРемонтаОбменПланфикс
    ПО ТоварыВРемонте.ПриемВРемонт.Ссылка = my_ДокументыРемонтаОбменПланфикс.ДокументРемонта.Ссылка
            //               |ГДЕ
(НЕ ЕСТЬNULL(ЧекККМ.ОперацияСДенежнымиСредствами, ЛОЖЬ) = ИСТИНА
        ИЛИ ЕСТЬNULL(ЧекККМ.ОперацияСДенежнымиСредствами, ЛОЖЬ) = ИСТИНА
            И НЕ ЕСТЬNULL(ЧекККМЧ.ОперацияСДенежнымиСредствами, ЛОЖЬ) = ИСТИНА)
И (НЕ ЕСТЬNULL(ЧекККМП.ОперацияСДенежнымиСредствами, ЛОЖЬ) = ИСТИНА
        ИЛИ ЕСТЬNULL(ЧекККМП.ОперацияСДенежнымиСредствами, ЛОЖЬ) = ИСТИНА
            И НЕ ЕСТЬNULL(ЧекККМПЧ.ОперацияСДенежнымиСредствами, ЛОЖЬ) = ИСТИНА)
УПОРЯДОЧИТЬ ПО
Номер
4 DSSS
 
05.09.18
05:29
(2) такой запрос не решит задачу в полном объеме.
>> а если нету то любой первый
5 romanыч
 
05.09.18
05:37
(1) Хочу, чтобы запрос, который я написал в (3) выдавал результат с одной строкой на каждый ПриемВРемонт, и чекомККМ проведенным, если такой есть, иначе с любым, тоторый соответствует данному запросу.
6 romanыч
 
05.09.18
05:38
(2) Как будет дейстровать Функция Максимум по отношению к Док2.Ссылка?
7 DSSS
 
05.09.18
05:41
(6) Будет выбрана максимальная ссылка

По док2 тебе дополнительно нужно назначить приоритеты: проведенным приоритет 2, непроведенным приоритет 1, потом для каждого документа определить макисмальный приоритет, а потом соединить с док 1 и применить максимум по док 2
8 romanыч
 
05.09.18
05:54
(7) Я понимаю, что максимальная ссылка, я не понимаю что значит максимальная ссылка? Я могу сравнить даты, числа, но не могу сравнить ссылки на значение "Максимум". Позже созданная это будет или с большим номером или располагающаяся в таблице с в более низкой строке?
9 romanыч
 
05.09.18
05:54
(7) За идею спасибо, сейчас обмозгую как эт можно реализовать.
10 catena
 
05.09.18
05:58
(4)А Максимум тут для чего?
11 catena
 
05.09.18
05:59
(6)Выбирать первый любой.
12 romanыч
 
05.09.18
06:16
(11) А зачем мне первый любой, если нужен первый проведенный
13 romanыч
 
05.09.18
07:26
(12) (2) Затупил. Там же еще "и Док2.Проведен".
Данная конструкция возвращает только проведенные Док2. А мне нужны непроведенные тоже, если нет проведенных
14 catena
 
05.09.18
07:27
(13)Да, прав, невнимательно прочитала
15 romanыч
 
09.09.18
17:07
Если кому понадобится можно сделать так:
ВЫБРАТЬ док1.ссылка,
МАКСИМУМ(ЕСТЬNULL(док2.проведен, ЛОЖЬ)) как проведен
ПОМЕСТИТЬ ВТ
ИЗ ....
;
ВЫБРАТЬ док1.ссылка,
МАКСИМУМ (док2.ссылка)
ИЗ ВТ.....
ЛЕВОЕ СОЕДИНЕНИЕ ВТ.ссылка = док2.ключсвязи и ВТ.проведен = ЕСТЬNULL(док2.проведен, ЛОЖЬ)
В несложных запросах проканает, в моем случае не получится
16 AlvlSpb
 
09.09.18
18:14
(0) Критерии отбора не пробовал? Для каждого док из метаданные.документ1 и запрос к ко?
Программист всегда исправляет последнюю ошибку.