При работе с Системой Компоновки Данных (СКД) в 1С разработчики часто сталкиваются с ситуацией, когда вычисляемые поля, определенные как ресурсы, начинают «размазываться» по всей ширине периода отчета. Это означает, что если данные для расчета такого ресурса существуют только в одном конкретном месяце, то его значение может неожиданно отобразиться и в последующих месяцах, где по факту данных нет. Давайте разберем, почему это происходит и как мы можем управлять поведением вычисляемых ресурсов.
Чтобы понять причину этого поведения, нам необходимо глубже рассмотреть, как СКД работает с ресурсами и группировками. Когда мы определяем поле как ресурс в СКД, мы сообщаем системе, что это поле предназначено для подсчета итогов. СКД, в свою очередь, стремится рассчитать эти итоги по всем заданным в отчете группировкам. Это фундаментальное свойство ресурсов.
Рассмотрим подробнее:
СуммаПродаж и группировка по месяцам, СКД попытается вывести СуммуПродаж для каждого месяца. Если для месяца 01.11.2024 есть данные, а для 01.12.2024 нет, но ресурс был рассчитан на основе данных, которые могут быть агрегированы по более широким группировкам, СКД может распространить это значение на смежные периоды, поскольку это является его естественным поведением при подведении итогов.Таким образом, основная проблема заключается в том, что ресурсы по умолчанию выводятся по всем группировкам, включая группировку по периоду. Если вычисляемое поле, которое является ресурсом, рассчитывается на основе данных, не привязанных строго к конкретной детальной записи в рамках выбранного периода, оно может быть "размазано".
Теперь, когда мы понимаем причину, давайте выясним, как мы можем контролировать это поведение и ограничить вывод ресурсов только для тех периодов, где это действительно необходимо.
Одним из наиболее эффективных способов является точная настройка свойства "Рассчитывать по..." для наших ресурсов. Это свойство находится на вкладке "Ресурсы" в конструкторе СКД. Мы можем указать, по каким конкретным группировкам данный ресурс должен быть рассчитан. Это позволяет нам:
Рассмотрим пример: если у нас есть ресурс ТранспортныйКоэффициент, который должен вычисляться один раз для всего документа или для конкретного месяца, но не распространяться на пустые месяцы, мы должны убедиться, что в свойстве "Рассчитывать по..." для этого ресурса указаны только те группировки, которые действительно определяют его уникальность (например, ссылка на документ, если коэффициент уникален для документа), и исключить группировку по периоду, если она приводит к нежелательному "размазыванию".
Хотя этот метод может быть воспринят как "костыль" некоторыми разработчиками, он является рабочим способом скрыть нежелательные значения. Мы можем использовать условное оформление для того, чтобы не выводить значения ресурса в тех периодах, где он не должен отображаться.
Мы действуем по следующим шагам:
Этот подход скрывает данные на уровне представления, но не предотвращает их расчет. Это может быть полезно в случаях, когда точное управление расчетом через "Рассчитывать по..." затруднено.
Если наш ресурс предназначен исключительно для вывода в итоговых строках, а не в каждой детальной записи по периодам, мы можем использовать функцию "Итоги по" в запросе или выражении вычисляемого поля. Эта функция позволяет агрегировать данные таким образом, чтобы они отображались только для итоговых группировок.
Пример использования в выражении СКД (хотя чаще это делается в запросе):
ВЫБОР
КОГДА УРОВЕНЬГРУППИРОВКИ("Период") = 0
ТОГДА Сумма(МойРесурс)
ИНАЧЕ NULL
КОНЕЦ
В этом примере МойРесурс будет выведен только на итоговом уровне группировки по периоду (или если группировка по периоду отсутствует), а в остальных случаях будет NULL, который можно скрыть условным оформлением или специальными настройками вывода.
В некоторых сложных случаях, особенно когда у нас есть вложенные группировки внутри группировки по периоду (например, "ПериодМесяц" -> "ГруппаНоменклатуры"), удаление или изменение этих вложенных группировок может помочь. Иногда избыточные или некорректно построенные вложенные группировки могут приводить к неожиданному "размазыванию" ресурсов. Мы должны тщательно проанализировать структуру отчета и убедиться, что каждая группировка действительно необходима и правильно взаимодействует с нашими ресурсами.
Возникает также другая проблема: когда мы пытаемся преобразовать результат числовой формулы в строку и добавить к нему символ (например, знак процента "%"), это может привести к некорректному отображению ресурса, и он также может начать "размазываться" или отображаться не так, как ожидалось.
Давайте разберем эту ситуацию:
Крайне важно избегать ручного преобразования числовых значений в строки внутри выражений СКД или запросов, если эти значения затем используются как ресурсы. Когда мы преобразуем число в строку, СКД теряет информацию о его числовом типе, что затрудняет корректное агрегирование и форматирование. Вместо этого мы должны использовать специализированные настройки форматирования СКД:
Пример использования форматирования для поля МойКоэффициент (в свойствах поля на вкладке "Выбранные поля", в поле "Формат"):
Ч=2; ЧС=; ЧРГ=; ДФ=истина; ПФ=" %"
Здесь Ч=2 означает два знака после запятой, ПФ=" %" добавляет пробел и знак процента после числа.
Аналогично, если мы хотим форматировать итоговое значение ресурса, мы можем задать форматирование непосредственно на вкладке "Ресурсы" в колонке "Выражение". Здесь мы указываем, как именно ресурс должен быть рассчитан, но его форматирование лучше контролировать через стандартные механизмы СКД, как описано выше.
Использование правильного форматирования гарантирует, что числовые значения останутся числами для целей агрегации, но будут выглядеть так, как нам нужно, при выводе в отчете.
Часто возникает вопрос, где лучше рассчитывать вычисляемые поля: непосредственно в запросе к базе данных или же использовать механизм вычисляемых полей самой СКД. Давайте рассмотрим оба подхода и выясним, когда какой из них предпочтительнее.
Когда мы добавляем расчетное поле непосредственно в текст запроса, это поле вычисляется по каждой строке выборки данных из базы данных. Такой подход является нормальным и часто предпочтительным в следующих случаях:
Цена * Количество), то логично выполнять его в запросе.Пример такого расчета в запросе:
ВЫБРАТЬ
Номенклатура.Наименование КАК Номенклатура,
Продажи.Количество КАК Количество,
Продажи.Цена КАК Цена,
Продажи.Количество * Продажи.Цена КАК СуммаПродажи
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК Продажи
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
ПО Продажи.Номенклатура = Номенклатура.Ссылка
В этом примере СуммаПродажи рассчитывается на уровне каждой строки.
Вычисляемые поля СКД позволяют нам создавать новые поля, значения которых вычисляются по некоторой формуле, используя уже имеющиеся поля из различных наборов данных или выполняя операции над ними. Они идеально подходят для "доработки" таблицы, полученной в запросе, своими собственными колонками. Мы используем вычисляемые поля СКД, когда:
Пример вычисляемого поля в СКД (вкладка "Вычисляемые поля" в конструкторе отчета):
(СуммаОборот / ОбщаяСумма) * 100
Здесь СуммаОборот и ОбщаяСумма могут быть ресурсами или другими вычисляемыми полями.
Очень важно четко понимать различие между вычисляемыми полями и ресурсами:
Мы принимаем решение о том, является ли поле вычисляемым полем или ресурсом, исходя из его назначения:
Например, в случае с "транспортным коэффициентом", если он уникален для каждой строки или документа и просто является множителем, его можно рассчитать как вычисляемое поле. Но если мы хотим увидеть "ИТОГО транспортных коэффициентов" или его среднее по месяцам, то это поле должно стать ресурсом.
В заключение, для эффективного использования СКД и избежания проблемы "размазывания" вычисляемых полей-ресурсов, мы должны тщательно настраивать свойство "Рассчитывать по..." для каждого ресурса. Это позволяет нам указать только те группировки, по которым действительно требуется подсчет итогов. Для корректного форматирования значений ресурсов мы всегда используем специальные настройки форматирования СКД, избегая преобразования числовых значений в строки. Такой подход обеспечивает точный и наглядный вывод данных в наших отчетах.