Как исправить ошибки в запросе 1С при получении статусов по обращениям?

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

Просмотр 1 ветки ответов
  • Автор
    Сообщения
    • #34074
      Телеграм группа https://t.me/odineskiOdineski
      Участник

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

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

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

          Ошибка в запросе связана с некорректным использованием полей и синтаксисом в части выборки и соединения:

          1. В списке выбираемых полей вы пишете `ПоследнийСтатус.Обращение.Дата`, `ПоследнийСтатус.Обращение.Категория` и т.п. — но в подзапросе `ПоследнийСтатус` вы выбираете только поля `Обращение`, `Статус` и `МаксимальнаяДата`. Поля `Дата`, `Категория`, `Инициатор`, `ЕстьВложение`, `Ссылка` не выбираются и не доступны через псевдоним `ПоследнийСтатус.Обращение`.

          2. В подзапросе вы группируете по `Обращение` и `Статус`, при этом берёте максимум по дате, но не связываете дату с конкретным статусом — это может привести к неверной логике.

          3. В условии соединения вы используете `ПО (ПоследнийСтатус.Обращение = Документ.Ссылка) И (Документ.Дата = (ВЫБРАТЬ МАКСИМУМ(…)))` — это условие соединения с подзапросом, но оно не связано с подзапросом `ПоследнийСтатус`, а просто сравнивает дату документа с максимальной датой по всему регистру, что не корректно.

          4. В подзапросе `СрезПоследних(&НаДату, )` второй параметр пустой — это синтаксическая ошибка, нужно либо убрать запятую, либо указать параметр.

          **Как исправить:**

          — Чтобы получить последние статусы по обращениям, нужно сначала получить максимальную дату по каждому обращению, затем соединить с регистром по обращению и дате, чтобы получить актуальный статус.

          — Для получения полей из документа (например, `Категория`, `Инициатор` и т.п.) нужно обращаться к таблице `Документ`, а не к псевдониму `ПоследнийСтатус.Обращение`.

          — Пример исправленного запроса (упрощённый):

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

          — Здесь мы сначала находим для каждого обращения максимальную дату статуса, затем соединяем с регистром, чтобы получить статус на эту дату, и соединяем с документом по ссылке.

          — В выборке берем поля из документа и статус из подзапроса.

          — Уберите лишние запятые в вызове `СрезПоследних` или используйте обычный регистр с фильтрацией по дате.

          **Итог:**
          Ошибка — попытка обратиться к полям документа через псевдоним подзапроса, который их не содержит, а также синтаксическая ошибка с лишней запятой в `СрезПоследних(&НаДату, )`. Нужно разделить получение данных документа и получение статуса, корректно связать подзапросы и убрать лишние параметры.

          Рекомендую посмотреть здесь: https://infostart.ru/public/527518/ (раздел про СрезПоследних и оптимизацию запросов)

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