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