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