При написании сложных запросов в платформе 1С:Предприятие разработчики часто сталкиваются с ошибкой: «Поле, по которому рассчитываются итоги, должно присутствовать в списке выборки». Эта проблема обычно проявляется в момент добавления секции СГРУППИРОВАТЬ ПО в запрос, содержащий секцию ИТОГИ.
Рассмотрим подробно, почему платформой предъявляются такие требования, проанализируем пример ошибочного кода и разберем способы решения данной проблемы.
При совместном использовании группировки (СГРУППИРОВАТЬ ПО) и расчета итогов (ИТОГИ) в языке запросов 1С действуют строгие правила обращения к полям:
ВЫБРАТЬ либо включаются в список группировки, либо оборачиваются в агрегатные функции (СУММА, КОЛИЧЕСТВО, МАКСИМУМ и др.) и получают псевдонимы.ИТОГИ при наличии группировки рассчитывает итоговые значения не по исходным полям таблиц (например, Данные.СтоимостьБезНДС), а по полям, уже сформированным в результирующей выборке.ИТОГИ попытаться обратиться к полю исходной таблицы с указанием ее имени через точку (Данные.СебестоимостьКредитНота), конструктор и движок запросов 1С не смогут сопоставить его с агрегированным псевдонимом из списка ВЫБРАТЬ и выдадут ошибку.Посмотрим на пример запроса, вызывающего ошибку при компиляции или в конструкторе запросов:
ВЫБРАТЬ
СУММА(Данные.СтоимостьБезНДС) КАК СтоимостьБезНДС,
СУММА(Данные.СебестоимостьКредитНота) КАК СебестоимостьКредитНота
ИЗ
Данные КАК Данные
СГРУППИРОВАТЬ ПО
Данные.Покупатель
ИТОГИ
СУММА(Данные.СтоимостьБезНДС) - СУММА(Данные.СебестоимостьКредитНота) КАК Прибыль
ПО
ОБЩИЕ
В данном выражении платформа выдаст ошибку, так как в секции ИТОГИ используются имена Данные.СтоимостьБезНДС и Данные.СебестоимостьКредитНота, в то время как в выборке присутствуют поля с псевдонимами СтоимостьБезНДС и СебестоимостьКредитНота.
Разберем по шагам, как исправить эту ошибку. Чтобы запрос успешно выполнился, в выражениях секции ИТОГИ необходимо обращаться не к полям таблицы-источника через точку, а к псевдонимам полей, объявленным в секции ВЫБРАТЬ.
Заменим обращения к составным именам на короткие псевдонимы:
ВЫБРАТЬ
СУММА(Данные.СтоимостьБезНДС) КАК СтоимостьБезНДС,
СУММА(Данные.СебестоимостьКредитНота) КАК СебестоимостьКредитНота
ИЗ
Данные КАК Данные
СГРУППИРОВАТЬ ПО
Данные.Покупатель
ИТОГИ
СУММА(СтоимостьБезНДС) - СУММА(СебестоимостьКредитНота) КАК Прибыль
ПО
ОБЩИЕ
Обратите внимание: указание псевдонима СебестоимостьКредитНота вместо Данные.СебестоимостьКредитНота позволяет конструктору запросов корректно сопоставить поля и выгрузить итоговые данные без ошибок.
Если запрос содержит сложные вычисляемые выражения с логическими операторами ВЫБОР КОГДА или делением, синтаксис секции ИТОГИ может стать громоздким. Рассмотрим альтернативные подходы к построению таких запросов:
ВЫБРАТЬ, присвоив ему псевдоним (например, Прибыль), а в секции ИТОГИ укажите простую агрегатную функцию СУММА(Прибыль).ПОМЕСТИТЬ ВТ_Данные). В финальном запросе выберем готовые поля из временной таблицы и применим к ним нужные агрегаты в секции ИТОГИ. Это делает структуру запроса читаемой и предотвращает конфликты имен.СГРУППИРОВАТЬ ПО и ИТОГИ в тексте запроса. Настройте группировки и рассчитываемые поля на вкладке «Ресурсы» в схеме компоновки данных — платформа выполнит расчет итогов автоматически.