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