Как в запросе 1С получить регистратор с максимальным периодом?

База знаний Одина — Одинэсника Форумы ODIN — Форум по 1С Предприятию Как в запросе 1С получить регистратор с максимальным периодом?

Просмотр 1 ветки ответов
  • Автор
    Сообщения
    • #38624
      Фото аватараOdineski
      Участник

        ВЫБРАТЬ
        ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d) КАК Период
        ПОМЕСТИТЬ ВТ_ТабДат
        ИЗ
        (ВЫБРАТЬ
        0 КАК a

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
        1

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
        2

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
        3

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
        4

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
        5

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
        6

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
        7

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
        8

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
        9) КАК aa
        ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
        0 КАК b

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
        1

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
        2

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
        3

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
        4

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
        5

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
        6

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
        7

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
        8

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
        9) КАК bb
        ПО (ИСТИНА)
        ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
        0 КАК c

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
        1

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
        2

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
        3

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
        4

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
        5

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
        6

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
        7

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
        8

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
        9) КАК cc
        ПО (ИСТИНА)
        ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
        0 КАК d

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
        1

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
        2

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
        3

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
        4

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
        5

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
        6

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
        7

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
        8

        ОБЪЕДИНИТЬ

        ВЫБРАТЬ
        9) КАК dd
        ПО (ИСТИНА)
        ГДЕ
        aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ)
        ;

        ////////////////////////////////////////////////////////////////////////////////
        ВЫБРАТЬ
        Номенклатура.Ссылка КАК Номенклатура
        ПОМЕСТИТЬ ВТ_ТабТоваров
        ИЗ
        Справочник.Номенклатура КАК Номенклатура
        ГДЕ
        НЕ Номенклатура.ЭтоГруппа
        И НЕ Номенклатура.ПометкаУдаления
        И Номенклатура.ВидНоменклатуры.Наименование ПОДОБНО «%Товар%»
        И Номенклатура.Ссылка В ИЕРАРХИИ(&ПарамОтборТовар)
        ;

        ////////////////////////////////////////////////////////////////////////////////
        ВЫБРАТЬ
        ВТ_ТабДат.Период,
        ВТ_ТабТоваров.Номенклатура
        ПОМЕСТИТЬ ВТ_ТабДатТоваров
        ИЗ
        ВТ_ТабДат КАК ВТ_ТабДат,
        ВТ_ТабТоваров КАК ВТ_ТабТоваров
        ;

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

        СГРУППИРОВАТЬ ПО
        ВТ_ТабДатТоваров.Номенклатура,
        ВТ_ТабДатТоваров.Период
        ;

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

        УПОРЯДОЧИТЬ ПО
        Период

        Как в этом запросе также получить регистратор?

      • #38625
        bot_avaOdin — Одинэсник
        Участник

          В вашем запросе регистратор хранится в регистре накопления ТоварыНаСкладах.ОстаткиИОбороты, но в итоговой выборке вы его не выбираете.

          Чтобы получить регистратор, нужно:

          1. В последнем большом запросе добавить поле Регистратор из регистра в список выбираемых полей.

          2. В запросе с группировкой (где вы берёте максимум периода) регистратор не выбирается, так как там агрегирование по Номенклатуре и Периоду. Чтобы получить регистратор, нужно изменить логику — например, выбрать максимальный период и связанный с ним регистратор.

          Практическое решение:

          — В запросе с группировкой по максимальному периоду (ВТ_ТабМаксимальныхПериодов) оставьте как есть.

          — В итоговом запросе добавьте Регистратор из регистра:

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

          Если хотите получить регистратор в запросе с максимальным периодом, то нужно использовать подзапрос или дополнительный прием, например:

          — Вместо МАКСИМУМ(Период) выбрать максимальный период и регистратор, связанный с этим периодом.

          — В 1С запросах это можно сделать через вложенный запрос с фильтром по максимальному периоду.

          Пример для получения регистратора с максимальным периодом:

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

          Если нужна помощь с конкретным примером — могу помочь написать запрос под ваши данные.

      Просмотр 1 ветки ответов
      • Для ответа в этой теме необходимо авторизоваться.
      База знаний 1С