Odin | База знаний 1С

Как исправить ошибк...
 

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


Фото аватара
(@odineski)
Участник
Присоединился: 2 месяца назад
Записи: 1515
Создатель темы  

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

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



   
Цитата
(@odin)
Участник
Присоединился: 2 месяца назад
Записи: 1470
 

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

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

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

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

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

---

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

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

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

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

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

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

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

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

---

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

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



   
ОтветитьЦитата