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

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

При работе с Системой Компоновки Данных (СКД) в 1С разработчики часто сталкиваются с ситуацией, когда вычисляемые поля, определенные как ресурсы, начинают «размазываться» по всей ширине периода отчета. Это означает, что если данные для расчета такого ресурса существуют только в одном конкретном месяце, то его значение может неожиданно отобразиться и в последующих месяцах, где по факту данных нет. Давайте разберем, почему это происходит и как мы можем управлять поведением вычисляемых ресурсов.

Причина 'размазывания' вычисляемых полей-ресурсов по периоду

Чтобы понять причину этого поведения, нам необходимо глубже рассмотреть, как СКД работает с ресурсами и группировками. Когда мы определяем поле как ресурс в СКД, мы сообщаем системе, что это поле предназначено для подсчета итогов. СКД, в свою очередь, стремится рассчитать эти итоги по всем заданным в отчете группировкам. Это фундаментальное свойство ресурсов.

Рассмотрим подробнее:

  1. Назначение ресурсов: Ресурсы в СКД созданы для агрегирования данных, то есть для подсчета сумм, средних значений, максимумов, минимумов и других итоговых показателей по группам записей. Когда мы указываем поле как ресурс, СКД будет пытаться вычислить его значение для каждой комбинации группировок, даже если для конкретной комбинации детальных данных нет.
  2. Группировка по периоду: В большинстве отчетов мы используем группировку по периоду (например, по месяцам, кварталам или годам). Если в нашем отчете присутствует такая группировка, СКД будет рассчитывать ресурс для каждого периода. Например, если у нас есть ресурс СуммаПродаж и группировка по месяцам, СКД попытается вывести СуммуПродаж для каждого месяца. Если для месяца 01.11.2024 есть данные, а для 01.12.2024 нет, но ресурс был рассчитан на основе данных, которые могут быть агрегированы по более широким группировкам, СКД может распространить это значение на смежные периоды, поскольку это является его естественным поведением при подведении итогов.

Таким образом, основная проблема заключается в том, что ресурсы по умолчанию выводятся по всем группировкам, включая группировку по периоду. Если вычисляемое поле, которое является ресурсом, рассчитывается на основе данных, не привязанных строго к конкретной детальной записи в рамках выбранного периода, оно может быть "размазано".

Как ограничить вывод ресурсов только для конкретного периода

Теперь, когда мы понимаем причину, давайте выясним, как мы можем контролировать это поведение и ограничить вывод ресурсов только для тех периодов, где это действительно необходимо.

  1. Настройка "Рассчитывать по..." для ресурсов

    Одним из наиболее эффективных способов является точная настройка свойства "Рассчитывать по..." для наших ресурсов. Это свойство находится на вкладке "Ресурсы" в конструкторе СКД. Мы можем указать, по каким конкретным группировкам данный ресурс должен быть рассчитан. Это позволяет нам:

    • Ограничить подведение итогов: Если мы хотим, чтобы ресурс рассчитывался только по определенным группировкам (например, по номенклатуре или контрагенту), но не по периоду, мы можем исключить период из списка группировок для данного ресурса. Таким образом, СКД не будет пытаться вывести значение ресурса для каждого подпериода, где оно не имеет смысла.
    • Избежать лишних расчетов: Это не только помогает решить проблему "размазывания", но и может оптимизировать производительность отчета, так как СКД не будет выполнять ненужные расчеты итогов.

    Рассмотрим пример: если у нас есть ресурс ТранспортныйКоэффициент, который должен вычисляться один раз для всего документа или для конкретного месяца, но не распространяться на пустые месяцы, мы должны убедиться, что в свойстве "Рассчитывать по..." для этого ресурса указаны только те группировки, которые действительно определяют его уникальность (например, ссылка на документ, если коэффициент уникален для документа), и исключить группировку по периоду, если она приводит к нежелательному "размазыванию".

  2. Использование условного оформления

    Хотя этот метод может быть воспринят как "костыль" некоторыми разработчиками, он является рабочим способом скрыть нежелательные значения. Мы можем использовать условное оформление для того, чтобы не выводить значения ресурса в тех периодах, где он не должен отображаться.

    Мы действуем по следующим шагам:

    1. Создаем условие: На вкладке "Условное оформление" в конструкторе СКД создаем новое правило.
    2. Определяем условие скрытия: В качестве условия указываем, когда значение ресурса не должно отображаться. Например, если значение ресурса равно нулю, или если текущий период отчета не соответствует периоду, в котором реально существуют данные для ресурса. Мы можем использовать специальные функции СКД для работы с текущими значениями группировок.
    3. Указываем оформляемое поле: В списке оформляемых полей выбираем наш ресурс.
    4. Выбираем тип оформления: В качестве оформления выбираем "Скрыть" или устанавливаем цвет шрифта, совпадающий с цветом фона, чтобы сделать текст невидимым.

    Этот подход скрывает данные на уровне представления, но не предотвращает их расчет. Это может быть полезно в случаях, когда точное управление расчетом через "Рассчитывать по..." затруднено.

  3. Функция "Итоги по"

    Если наш ресурс предназначен исключительно для вывода в итоговых строках, а не в каждой детальной записи по периодам, мы можем использовать функцию "Итоги по" в запросе или выражении вычисляемого поля. Эта функция позволяет агрегировать данные таким образом, чтобы они отображались только для итоговых группировок.

    Пример использования в выражении СКД (хотя чаще это делается в запросе):

    
    ВЫБОР
        КОГДА УРОВЕНЬГРУППИРОВКИ("Период") = 0
        ТОГДА Сумма(МойРесурс)
        ИНАЧЕ NULL
    КОНЕЦ
    

    В этом примере МойРесурс будет выведен только на итоговом уровне группировки по периоду (или если группировка по периоду отсутствует), а в остальных случаях будет NULL, который можно скрыть условным оформлением или специальными настройками вывода.

  4. Изменение структуры отчета

    В некоторых сложных случаях, особенно когда у нас есть вложенные группировки внутри группировки по периоду (например, "ПериодМесяц" -> "ГруппаНоменклатуры"), удаление или изменение этих вложенных группировок может помочь. Иногда избыточные или некорректно построенные вложенные группировки могут приводить к неожиданному "размазыванию" ресурсов. Мы должны тщательно проанализировать структуру отчета и убедиться, что каждая группировка действительно необходима и правильно взаимодействует с нашими ресурсами.

Проблема с преобразованием результата формулы в строку и добавлением знака процента

Возникает также другая проблема: когда мы пытаемся преобразовать результат числовой формулы в строку и добавить к нему символ (например, знак процента "%"), это может привести к некорректному отображению ресурса, и он также может начать "размазываться" или отображаться не так, как ожидалось.

Давайте разберем эту ситуацию:

  1. Оформление через "Формат поля"

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

    • Вкладка "Настройки" -> "Выбранные поля" -> "Поле" -> "Формат": Для каждого поля (включая вычисляемые поля) мы можем задать формат вывода. Здесь можно указать число знаков после запятой, разделители, а также добавить префикс или суффикс, например, "%". Это позволит сохранить числовой тип данных для поля, но при этом красиво его отобразить.
    • Выражение форматирования: Для более сложного форматирования можно использовать выражение форматирования, которое позволяет динамически формировать строку вывода на основе числового значения.

    Пример использования форматирования для поля МойКоэффициент (в свойствах поля на вкладке "Выбранные поля", в поле "Формат"):

    
    Ч=2; ЧС=; ЧРГ=; ДФ=истина; ПФ=" %"
    

    Здесь Ч=2 означает два знака после запятой, ПФ=" %" добавляет пробел и знак процента после числа.

  2. Выражение в ресурсах

    Аналогично, если мы хотим форматировать итоговое значение ресурса, мы можем задать форматирование непосредственно на вкладке "Ресурсы" в колонке "Выражение". Здесь мы указываем, как именно ресурс должен быть рассчитан, но его форматирование лучше контролировать через стандартные механизмы СКД, как описано выше.

    Использование правильного форматирования гарантирует, что числовые значения останутся числами для целей агрегации, но будут выглядеть так, как нам нужно, при выводе в отчете.

Подход к вычисляемым полям: в запросе или в СКД?

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

  1. Вычисляемые поля в запросе

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

    • Зависимость от детальных данных: Если расчет поля полностью зависит от значений других полей в той же детальной строке (например, Цена * Количество), то логично выполнять его в запросе.
    • Оптимизация производительности: Иногда СУБД может более эффективно выполнять расчеты, особенно если используются сложные функции или соединения.
    • Использование для фильтрации: Поле, рассчитанное в запросе, может быть легко использовано для дальнейшей фильтрации данных на этапе получения выборки.

    Пример такого расчета в запросе:

    
    ВЫБРАТЬ
        Номенклатура.Наименование КАК Номенклатура,
        Продажи.Количество КАК Количество,
        Продажи.Цена КАК Цена,
        Продажи.Количество * Продажи.Цена КАК СуммаПродажи
    ИЗ
        Документ.РеализацияТоваровУслуг.Товары КАК Продажи
    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
    ПО Продажи.Номенклатура = Номенклатура.Ссылка
    

    В этом примере СуммаПродажи рассчитывается на уровне каждой строки.

  2. Вычисляемые поля в СКД

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

    • Нужен расчет на основе уже скомпонованных данных: Например, расчет процента от общей суммы, где общая сумма еще не была известна на этапе запроса.
    • Логика расчета нетривиальна или требует доступа к данным из разных наборов: СКД позволяет объединять данные из нескольких источников и выполнять расчеты над ними.
    • Требуется гибкость настройки: Вычисляемые поля СКД легко настраиваются пользователем или программистом без изменения текста запроса.

    Пример вычисляемого поля в СКД (вкладка "Вычисляемые поля" в конструкторе отчета):

    
    (СуммаОборот / ОбщаяСумма) * 100
    

    Здесь СуммаОборот и ОбщаяСумма могут быть ресурсами или другими вычисляемыми полями.

  3. Разница между вычисляемыми полями и ресурсами

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

    • Вычисляемые поля: Предназначены для расчета значений на уровне детальных записей или для формирования новых колонок на основе существующих. Их значения вычисляются для каждой строки данных.
    • Ресурсы: Используются для настройки расчета итогов на уровне группировки. Они агрегируют значения по группам записей, а не по каждой отдельной строке. Если поле должно быть суммой, средним, количеством или любым другим агрегированным значением по группировке, оно должно быть ресурсом.
  4. Когда использовать вычисляемые поля или ресурсы

    Мы принимаем решение о том, является ли поле вычисляемым полем или ресурсом, исходя из его назначения:

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

    Например, в случае с "транспортным коэффициентом", если он уникален для каждой строки или документа и просто является множителем, его можно рассчитать как вычисляемое поле. Но если мы хотим увидеть "ИТОГО транспортных коэффициентов" или его среднее по месяцам, то это поле должно стать ресурсом.

В заключение, для эффективного использования СКД и избежания проблемы "размазывания" вычисляемых полей-ресурсов, мы должны тщательно настраивать свойство "Рассчитывать по..." для каждого ресурса. Это позволяет нам указать только те группировки, по которым действительно требуется подсчет итогов. Для корректного форматирования значений ресурсов мы всегда используем специальные настройки форматирования СКД, избегая преобразования числовых значений в строки. Такой подход обеспечивает точный и наглядный вывод данных в наших отчетах.

← На главную