База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как исправить ошибки в запросе 1С при получении статусов по обращениям? › RE: Как исправить ошибки в запросе 1С при получении статусов по обращениям?
Ошибка в запросе связана с некорректным использованием полей и синтаксисом в части выборки и соединения:
1. В списке выбираемых полей вы пишете ПоследнийСтатус.Обращение.Дата, ПоследнийСтатус.Обращение.Категория и т.п. — но в подзапросе ПоследнийСтатус вы выбираете только поля Обращение, Статус и МаксимальнаяДата. Поля Дата, Категория, Инициатор, ЕстьВложение, Ссылка не выбираются и не доступны через псевдоним ПоследнийСтатус.Обращение.
2. В подзапросе вы группируете по Обращение и Статус, при этом берёте максимум по дате, но не связываете дату с конкретным статусом — это может привести к неверной логике.
3. В условии соединения вы используете ПО (ПоследнийСтатус.Обращение = Документ.Ссылка) И (Документ.Дата = (ВЫБРАТЬ МАКСИМУМ(…))) — это условие соединения с подзапросом, но оно не связано с подзапросом ПоследнийСтатус, а просто сравнивает дату документа с максимальной датой по всему регистру, что не корректно.
4. В подзапросе СрезПоследних(&НаДату, ) второй параметр пустой — это синтаксическая ошибка, нужно либо убрать запятую, либо указать параметр.
—
**Как исправить:**
— Чтобы получить последние статусы по обращениям, нужно сначала получить максимальную дату по каждому обращению, затем соединить с регистром по обращению и дате, чтобы получить актуальный статус.
— Для получения полей из документа (например, Категория, Инициатор и т.п.) нужно обращаться к таблице Документ, а не к псевдониму ПоследнийСтатус.Обращение.
— Пример исправленного запроса (упрощённый):
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
ВЫБРАТЬ Документ.Дата КАК Дата, Документ.Категория КАК Категория, Документ.Инициатор КАК Инициатор, Документ.ЕстьВложение КАК ЕстьВложение, Документ.Ссылка КАК Ссылка, ПоследнийСтатус.Статус КАК Статус ИЗ Документ.ик_ОбращениеВПоддержку КАК Документ ЛЕВОЕ СОЕДИНЕНИЕ ( ВЫБРАТЬ СОБСТВЕННОЕ.Обращение, СОБСТВЕННОЕ.Статус, СОБСТВЕННОЕ.Дата ИЗ РегистрСведений.ик_СостояниеОбработкиОбращенийВПоддержку КАК СОБСТВЕННОЕ ВНУТРЕННЕЕ СОЕДИНЕНИЕ ( ВЫБРАТЬ Обращение, МАКСИМУМ(Дата) КАК МаксимальнаяДата ИЗ РегистрСведений.ик_СостояниеОбработкиОбращенийВПоддержку ГДЕ Дата <= &НаДату СГРУППИРОВАТЬ ПО Обращение ) КАК МаксДата ПО СОБСТВЕННОЕ.Обращение = МаксДата.Обращение И СОБСТВЕННОЕ.Дата = МаксДата.МаксимальнаяДата ) КАК ПоследнийСтатус ПО ПоследнийСтатус.Обращение = Документ.Ссылка ГДЕ Документ.Дата <= &НаДату |
— Здесь мы сначала находим для каждого обращения максимальную дату статуса, затем соединяем с регистром, чтобы получить статус на эту дату, и соединяем с документом по ссылке.
— В выборке берем поля из документа и статус из подзапроса.
— Уберите лишние запятые в вызове СрезПоследних или используйте обычный регистр с фильтрацией по дате.
—
**Итог:**
Ошибка — попытка обратиться к полям документа через псевдоним подзапроса, который их не содержит, а также синтаксическая ошибка с лишней запятой в СрезПоследних(&НаДату, ). Нужно разделить получение данных документа и получение статуса, корректно связать подзапросы и убрать лишние параметры.
Рекомендую посмотреть здесь: https://infostart.ru/public/527518/ (раздел про СрезПоследних и оптимизацию запросов)