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

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

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

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

Понимание проблемы: почему СКД ошибается?

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

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

Метод 1: Дополнение данных через левое соединение

Чтобы среднее значение учитывало пустые периоды или отсутствующие начисления как «0», нам необходимо дополнить набор данных. Рассмотрим, как это сделать программно.

  1. Подготовка таблицы-эталона: Нам нужно сформировать список всех возможных комбинаций (например, все сотрудники и все виды начислений для каждого месяца). Если у вас уже есть список всех периодов и сотрудников, используйте его как левую таблицу.
  2. Использование левого соединения: Соединим нашу «полную» таблицу с реальными данными из регистра расчета или регистра накопления.
  3. Применение функции ЕСТЬNULL: В итоговом поле запроса обязательно используем ЕСТЬNULL(ТаблицаДанных.Результат, 0). Это позволит заменить отсутствующие значения на ноль, который будет распознан системой как полноценная строка для агрегации.

Пример построения запроса с использованием левого соединения:


ВЫБРАТЬ
    СправочникСотрудники.Ссылка КАК Сотрудник,
    ВидыНачислений.Ссылка КАК ВидНачисления,
    ЕСТЬNULL(Начисления.Результат, 0) КАК Результат
ИЗ
    Справочник.Сотрудники КАК СправочникСотрудники
    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВидыНачислений КАК ВидыНачислений
    ПО ИСТИНА
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.Начисления КАК Начисления
    ПО Начисления.Сотрудник = СправочникСотрудники.Ссылка
    И Начисления.ВидРасчета = ВидыНачислений.Ссылка

Метод 2: Работа с периодами через пересечение таблиц

Если ваша задача — считать среднее по месяцам, используйте таблицу периодов. Это классический подход для отчетов по зарплате. Создадим таблицу периодов (например, за текущий год) и соединим её с данными сотрудников.

Разберем логику:

Можно ли решить задачу через функции СКД?

Многие разработчики пытаются решить вопрос через вкладку «Ресурсы» в СКД, используя функцию ВычислитьВыражение. Например:

ВычислитьВыражение("Сумма(Результат)", "Подразделение") / ВычислитьВыражение("Количество(Сотрудник)", "Подразделение")

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

Практические советы по оптимизации

При использовании метода с декартовым произведением или полным списком всех комбинаций, учитывайте следующие нюансы:

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

← На главную