Имя: Пароль:
1C
1С v8
Получение первого элемента при связи вложенным запросом
0 MAPATNK2
 
naïve
21.09.22
17:26
Назвал как мог.
Вывожу список заказов менеджера. Нужно рядом отображать последнюю реализацию по данному заказу. Как?
Сделал через временный запрос. Естественно дублирование при наличии нескольких реализаций. "Выбрать Первые 1" не подходит, хотя я думал, что это относится только к временным таблицам.

"ВЫБРАТЬ
    |    ЗаказыПокупателейОстатки.ЗаказПокупателя,
    |    ЗаказыПокупателейОстатки.КоличествоОстаток,
    |    ЗаказыПокупателейОстатки.СуммаВзаиморасчетовОстаток,
    |    ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Сделка,
    |    ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Контрагент,
    |    ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаВзаиморасчетовПриход, 0) КАК СуммаВзаиморасчетовПриход,
    |    ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаВзаиморасчетовРасход, 0) КАК СуммаВзаиморасчетовРасход,
    |    ЗаказыПокупателейОстатки.ЗаказПокупателя.Дата КАК ЗаказПокупателяДата,
    |    ДОБАВИТЬКДАТЕ(Реализации.ДокументРеализации.Дата, ДЕНЬ, ЗаказыПокупателейОстатки.ЗаказПокупателя.ДнейПросрочки) КАК ДатаОплаты,
    |    ВЫБОР
    |        КОГДА РАЗНОСТЬДАТ(&ТекДат, ДОБАВИТЬКДАТЕ(Реализации.ДокументРеализации.Дата, ДЕНЬ, ЗаказыПокупателейОстатки.ЗаказПокупателя.ДнейПросрочки), ДЕНЬ) < 0
    |            ТОГДА """"
    |        ИНАЧЕ РАЗНОСТЬДАТ(&ТекДат, ДОБАВИТЬКДАТЕ(Реализации.ДокументРеализации.Дата, ДЕНЬ, ЗаказыПокупателейОстатки.ЗаказПокупателя.ДнейПросрочки), ДЕНЬ)
    |    КОНЕЦ КАК ДнейПросрочки,
    |    Реализации.ДокументРеализации
    |ИЗ
    |    РегистрНакопления.ЗаказыПокупателей.Остатки КАК ЗаказыПокупателейОстатки
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ВзаиморасчетыСКонтрагентами.ОстаткиИОбороты КАК ВзаиморасчетыСКонтрагентамиОстаткиИОбороты
    |        ПО ЗаказыПокупателейОстатки.ЗаказПокупателя = ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Сделка
    |        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    |            РеализацияТоваровУслуг.Ссылка КАК ДокументРеализации,
    |            РеализацияТоваровУслуг.Сделка КАК Заказ
    |        ИЗ
    |            Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг) КАК Реализации
    |        ПО ЗаказыПокупателейОстатки.ЗаказПокупателя = Реализации.Заказ
    |ГДЕ
    |    ЗаказыПокупателейОстатки.ЗаказПокупателя.Ответственный В(&Ответственный)
    |    И ЗаказыПокупателейОстатки.ЗаказПокупателя.Дата > &Дата1
    |    И ЗаказыПокупателейОстатки.КоличествоОстаток > 0
    |    И ЗаказыПокупателейОстатки.СуммаВзаиморасчетовОстаток > 0
    |    И ЗаказыПокупателейОстатки.ЗаказПокупателя.Проведен = ИСТИНА
    |
    |УПОРЯДОЧИТЬ ПО
    |    ЗаказПокупателяДата УБЫВ"
1 MAPATNK2
 
naïve
21.09.22
17:28
т.е.
Если так, то не работает.


"ВЫБРАТЬ
    |    ЗаказыПокупателейОстатки.ЗаказПокупателя,
    |    ЗаказыПокупателейОстатки.КоличествоОстаток,
    |    ЗаказыПокупателейОстатки.СуммаВзаиморасчетовОстаток,
    |    ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Сделка,
    |    ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Контрагент,
    |    ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаВзаиморасчетовПриход, 0) КАК СуммаВзаиморасчетовПриход,
    |    ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаВзаиморасчетовРасход, 0) КАК СуммаВзаиморасчетовРасход,
    |    ЗаказыПокупателейОстатки.ЗаказПокупателя.Дата КАК ЗаказПокупателяДата,
    |    ДОБАВИТЬКДАТЕ(Реализации.ДокументРеализации.Дата, ДЕНЬ, ЗаказыПокупателейОстатки.ЗаказПокупателя.ДнейПросрочки) КАК ДатаОплаты,
    |    ВЫБОР
    |        КОГДА РАЗНОСТЬДАТ(&ТекДат, ДОБАВИТЬКДАТЕ(Реализации.ДокументРеализации.Дата, ДЕНЬ, ЗаказыПокупателейОстатки.ЗаказПокупателя.ДнейПросрочки), ДЕНЬ) < 0
    |            ТОГДА """"
    |        ИНАЧЕ РАЗНОСТЬДАТ(&ТекДат, ДОБАВИТЬКДАТЕ(Реализации.ДокументРеализации.Дата, ДЕНЬ, ЗаказыПокупателейОстатки.ЗаказПокупателя.ДнейПросрочки), ДЕНЬ)
    |    КОНЕЦ КАК ДнейПросрочки,
    |    Реализации.ДокументРеализации
    |ИЗ
    |    РегистрНакопления.ЗаказыПокупателей.Остатки КАК ЗаказыПокупателейОстатки
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ВзаиморасчетыСКонтрагентами.ОстаткиИОбороты КАК ВзаиморасчетыСКонтрагентамиОстаткиИОбороты
    |        ПО ЗаказыПокупателейОстатки.ЗаказПокупателя = ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Сделка
    |        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ПЕРВЫЕ 1
    |            РеализацияТоваровУслуг.Ссылка КАК ДокументРеализации,
    |            РеализацияТоваровУслуг.Сделка КАК Заказ
    |        ИЗ
    |            Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг) КАК Реализации
    |        ПО ЗаказыПокупателейОстатки.ЗаказПокупателя = Реализации.Заказ
    |ГДЕ
    |    ЗаказыПокупателейОстатки.ЗаказПокупателя.Ответственный В(&Ответственный)
    |    И ЗаказыПокупателейОстатки.ЗаказПокупателя.Дата > &Дата1
    |    И ЗаказыПокупателейОстатки.КоличествоОстаток > 0
    |    И ЗаказыПокупателейОстатки.СуммаВзаиморасчетовОстаток > 0
    |    И ЗаказыПокупателейОстатки.ЗаказПокупателя.Проведен = ИСТИНА
    |
    |УПОРЯДОЧИТЬ ПО
    |    ЗаказПокупателяДата УБЫВ"
2 БигБаг
 
21.09.22
17:40
Вот так всегда, когда хотят задать вопрос про какую-то мелочь, постят в довесок кучу не относящегося к вопросу кода. Это же все читать лень. А если бы почистил от всего лишнего, то и ответили бы быстрее, а может и сам бы догадался.

Выбираются подчиненные реализации. В пределах заказа агрегируется максимальная дата реализации. Потом к этой максимальной делается внутреннее соединение с первой таблицей подчиненных реализаций.

Еще был вариант с первые 1 и использованием передачи значения внешнего запроса в подчиненный. Сам не пробовал, но здесь на форуме говорили что работает. Вероятно с какой-то версии 1с появилось.
3 Ботаник Гарден Меран
 
21.09.22
17:48
Выбрать *,ВТ2.НужноеПоле Из ВТ1 КАК ВТ1
Левое Соединение ВТ2 КАК ВТ2 ПО ВТ1.ПолеСвязи = ВТ2.ПолеСвязи
И ВТ2.Период В (Выбрать Первые 1 Т.Период Из ВТ2 КАК Т ГДЕ Т.ПолеСвязи = ВТ1.ПолеСвязи Упорядочить По Т.Период Убыв)
4 БигБаг
 
22.09.22
08:26
(3) Писать код в одну строку это моветон. Тут даже Конструктор1С не нужен, что бы это осуждать. У тебя там лишнее и кривости были:


выбрать
    ВТ1.*,
    ВТ2.НужноеПоле
из
    ВТ1 левое соединение ВТ2
    по
        ВТ2.Ссылка в (
            выбрать Первые 1
                Т.Ссылка
            из
                ВТ2 как Т
            где
                Т.ПолеСвязи = ВТ1.ПолеСвязи
            упорядочить по
                Т.Дата Убыв
        )
5 lodger
 
22.09.22
10:14
лень читать всё

вот в этот запрос добавь группировку
выбрать * из Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг) КАК Реализации

по заказу минимум(реализация)
6 DrZombi
 
гуру
22.09.22
10:56
(4) >>> упорядочить по

Доступно только результирующей таблице. :) - У вас ошибка...

(0) Одним запросом не обойдешься.
Тебе нужны срезы последних, на дату.

https://infostart.ru/1c/articles/1302246/
7 1Сергей
 
22.09.22
10:59
(6) неверно.
УПОРЯДОЧИТЬ ПО доступно во всех запросах, если использовать ПЕРВЫЕ