Почему в отчете СКД не отображаются данные при разделении сумм по валютам и как это исправить

Программист 1С v8.3 (Управляемые формы) Управленческий учет
← На главную

При разработке отчетов на базе Системы компоновки данных (СКД) программисты часто сталкиваются с задачей разделения итоговых показателей по определенному признаку, например, по валютам. Типичная ситуация: в регистре накопления «Продажи» есть общая сумма, а в отчете нужно вывести две отдельные колонки — «Сумма в долларах» и «Сумма в рублях». Однако даже при написании, казалось бы, верного запроса с конструкцией ВЫБОР КОГДА, результат может оказаться неутешительным: колонки в сформированном отчете остаются пустыми. В этой статье мы подробно разберем причины возникновения этой проблемы и рассмотрим несколько способов ее эффективного решения.

Анализ структуры запроса и типичные ошибки группировки

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


ВЫБРАТЬ
    ПродажиОбороты.Клиент КАК Клиент,
    ПродажиОбороты.Номенклатура КАК Номенклатура,
    ПродажиОбороты.Период КАК Период,
    ПродажиОбороты.Валюта КАК Валюта,
    СУММА(ВЫБОР
            КОГДА ПродажиОбороты.Валюта = &Доллар
                ТОГДА ПродажиОбороты.СуммаОборот
            ИНАЧЕ 0
        КОНЕЦ) КАК СуммаОборотДоллар,
    ПродажиОбороты.СуммаОборот КАК СуммаОборот
ИЗ
    РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, Регистратор, ) КАК ПродажиОбороты
{ГДЕ
    (ПродажиОбороты.Клиент = &Клиент),
    (ПродажиОбороты.Номенклатура = &Номенклатура)}
СГРУППИРОВАТЬ ПО
    ПродажиОбороты.Клиент,
    ПродажиОбороты.Номенклатура,
    ПродажиОбороты.Период,
    ПродажиОбороты.Валюта,
    ПродажиОбороты.СуммаОборот

Первое, на что стоит обратить внимание, — это секция СГРУППИРОВАТЬ ПО. В данном примере в группировку ошибочно включено поле ПродажиОбороты.СуммаОборот. Разберем, почему это критично. Группировка в 1С (как и в классическом SQL) предназначена для объединения записей по измерениям. Сумма — это ресурс. Если мы включаем числовое поле (сумму) в список группировки, система будет создавать новую строку для каждого уникального значения суммы. Это не только лишает смысла использование агрегатной функции СУММА(), но и может привести к тому, что СКД не сможет корректно рассчитать итоги, особенно если поле помечено в схеме как ресурс.

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

Проблема сравнения с Перечислениями

Выясним причину, по которой условие ПродажиОбороты.Валюта = &Доллар может не срабатывать. Часто поле Валюта в самописных конфигурациях является типом ПеречислениеСсылка. Если в параметрах СКД (на вкладке «Параметры») тип параметра &Доллар указан неверно (например, «Строка» вместо ссылки на конкретное перечисление) или значение параметра не заполнено, условие всегда будет возвращать Ложь. В результате в колонку будет попадать 0, который в отчете визуально выглядит как пустая ячейка.

Для исключения ошибок, связанных с передачей параметров, рекомендуется использовать прямое обращение к объекту метаданных через функцию ЗНАЧЕНИЕ(). Посмотрим на исправленный фрагмент кода:


СУММА(ВЫБОР
        КОГДА ПродажиОбороты.Валюта = Значение(Перечисление.Валюты.Доллар)
            ТОГДА ПродажиОбороты.СуммаОборот
        ИНАЧЕ 0
    КОНЕЦ) КАК СуммаОборотДоллар

Использование ЗНАЧЕНИЕ() гарантирует, что сравнение происходит между двумя объектами одного типа (ссылка на перечисление), что снимает риск некорректной настройки параметров пользователем.

Обязательная настройка вкладки «Ресурсы»

Даже если запрос написан идеально, данные в СКД могут не отображаться, если поля не добавлены на закладку «Ресурсы». СКД работает по особому алгоритму: она сначала получает детальные записи, а затем рассчитывает итоги по уровням группировок на основе выражений, указанных в ресурсах.

Рассмотрим пошагово, как правильно настроить ресурсы:

  1. Откроем схему компоновки данных и перейдем на вкладку «Ресурсы».
  2. Добавим наши вычисляемые поля: СуммаОборотДоллар и СуммаОборотСум.
  3. В колонке «Выражение» для каждого из них пропишем Сумма(СуммаОборотДоллар) и Сумма(СуммаОборотСум) соответственно.
  4. Если мы хотим видеть эти суммы только в разрезе определенных группировок, укажем их в колонке «Рассчитывать по...».

Важный нюанс: если поле не является ресурсом, СКД воспринимает его как обычное текстовое поле. В итоговых строках (например, в группировке по Клиенту) такие поля будут пустыми, так как система не знает, как их агрегировать.

Альтернативный метод: Использование вычисляемых полей

Иногда перегружать SQL-запрос сложными конструкциями ВЫБОР КОГДА нецелесообразно. Рассмотрим более «чистый» с точки зрения архитектуры СКД метод — использование Вычисляемых полей. Это позволяет оставить запрос максимально простым, а логику разделения сумм вынести в настройки схемы.

Проанализируем алгоритм настройки:

  1. В запросе выберем только базовые поля: Валюта и СуммаОборот.
  2. Перейдем на вкладку «Вычисляемые поля».
  3. Создадим новое поле СуммаДоллар. В поле «Выражение» напишем: Выбор Когда Валюта = Значение(Перечисление.Валюты.Доллар) Тогда СуммаОборот Иначе 0 Конец.
  4. Аналогично создадим поле для другой валюты.
  5. Не забудем добавить эти вычисляемые поля на вкладку «Ресурсы», чтобы СКД могла посчитать по ним итоги.

Преимущество этого метода в том, что СКД оптимизирует выполнение запроса и корректно управляет типами данных на лету.

Локализация проблемы через консоль запросов

Если ячейки все еще пусты, выясним причину с помощью методики «от простого к сложному». Проанализируем ситуацию, выполнив следующие действия:

  1. Скопируем текст запроса и вставим его в Консоль запросов.
  2. Вместо параметров &Доллар подставим конкретные значения перечислений.
  3. Если консоль возвращает пустой результат или нули — проблема в данных. Возможно, в регистре «Продажи» за выбранный период просто нет оборотов по данной валюте.
  4. Если консоль возвращает верные цифры, а СКД — нет, значит, проблема в настройках компоновщика: проверьте вкладку «Настройки» -> «Выбранные поля». Убедитесь, что новые поля добавлены в список отображаемых.

Также стоит проверить настройку «Роль» поля в наборе данных. Если поле СуммаОборотДоллар ошибочно помечено как Измерение, СКД будет пытаться группировать данные по этому значению, что приведет к дублированию строк или отсутствию итогов в группировках верхнего уровня.

Подводя итог, можно сказать, что решение проблемы «пустых колонок» всегда кроется в трех плоскостях: правильное обращение к значениям перечислений (через ЗНАЧЕНИЕ()), корректная группировка в запросе (без участия сумм) и обязательное объявление суммовых полей ресурсами в схеме компоновки данных. Следуя этим правилам, мы обеспечим точность и надежность формирования отчетов любой сложности.

← На главную