Почему возникает ошибка "Поле, по которому рассчитываются итоги, должно присутствовать в списке выборки" в запросе 1С и как её исправить?

Программист IT и автоматизация бизнеса
← На главную

При написании сложных запросов в платформе 1С:Предприятие разработчики часто сталкиваются с ошибкой: «Поле, по которому рассчитываются итоги, должно присутствовать в списке выборки». Эта проблема обычно проявляется в момент добавления секции СГРУППИРОВАТЬ ПО в запрос, содержащий секцию ИТОГИ.

Рассмотрим подробно, почему платформой предъявляются такие требования, проанализируем пример ошибочного кода и разберем способы решения данной проблемы.

Выясним причину ошибки

При совместном использовании группировки (СГРУППИРОВАТЬ ПО) и расчета итогов (ИТОГИ) в языке запросов 1С действуют строгие правила обращения к полям:

  1. Когда в запросе выполняется группировка, все результирующие поля секции ВЫБРАТЬ либо включаются в список группировки, либо оборачиваются в агрегатные функции (СУММА, КОЛИЧЕСТВО, МАКСИМУМ и др.) и получают псевдонимы.
  2. Секция ИТОГИ при наличии группировки рассчитывает итоговые значения не по исходным полям таблиц (например, Данные.СтоимостьБезНДС), а по полям, уже сформированным в результирующей выборке.
  3. Если в секции ИТОГИ попытаться обратиться к полю исходной таблицы с указанием ее имени через точку (Данные.СебестоимостьКредитНота), конструктор и движок запросов 1С не смогут сопоставить его с агрегированным псевдонимом из списка ВЫБРАТЬ и выдадут ошибку.

Посмотрим на пример запроса, вызывающего ошибку при компиляции или в конструкторе запросов:


ВЫБРАТЬ
    СУММА(Данные.СтоимостьБезНДС) КАК СтоимостьБезНДС,
    СУММА(Данные.СебестоимостьКредитНота) КАК СебестоимостьКредитНота
ИЗ
    Данные КАК Данные
СГРУППИРОВАТЬ ПО
    Данные.Покупатель
ИТОГИ
    СУММА(Данные.СтоимостьБезНДС) - СУММА(Данные.СебестоимостьКредитНота) КАК Прибыль
ПО
    ОБЩИЕ

В данном выражении платформа выдаст ошибку, так как в секции ИТОГИ используются имена Данные.СтоимостьБезНДС и Данные.СебестоимостьКредитНота, в то время как в выборке присутствуют поля с псевдонимами СтоимостьБезНДС и СебестоимостьКредитНота.

Решение проблемы: использование псевдонимов выборки

Разберем по шагам, как исправить эту ошибку. Чтобы запрос успешно выполнился, в выражениях секции ИТОГИ необходимо обращаться не к полям таблицы-источника через точку, а к псевдонимам полей, объявленным в секции ВЫБРАТЬ.

Заменим обращения к составным именам на короткие псевдонимы:


ВЫБРАТЬ
    СУММА(Данные.СтоимостьБезНДС) КАК СтоимостьБезНДС,
    СУММА(Данные.СебестоимостьКредитНота) КАК СебестоимостьКредитНота
ИЗ
    Данные КАК Данные
СГРУППИРОВАТЬ ПО
    Данные.Покупатель
ИТОГИ
    СУММА(СтоимостьБезНДС) - СУММА(СебестоимостьКредитНота) КАК Прибыль
ПО
    ОБЩИЕ

Обратите внимание: указание псевдонима СебестоимостьКредитНота вместо Данные.СебестоимостьКредитНота позволяет конструктору запросов корректно сопоставить поля и выгрузить итоговые данные без ошибок.

Альтернативные варианты решения

Если запрос содержит сложные вычисляемые выражения с логическими операторами ВЫБОР КОГДА или делением, синтаксис секции ИТОГИ может стать громоздким. Рассмотрим альтернативные подходы к построению таких запросов:

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