Как в СКД перевести количество дней стажа в текстовую строку с годами и месяцами?

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

При формировании кадровых и аналитических отчетов в схеме компоновки данных (СКД) нередко возникает задача отобразить накопленный стаж работы сотрудника в привычном для пользователя виде — например, «2 года 4 мес. 15 дн.». Однако в исходных данных зачастую присутствует только агрегированное число — общее количество дней.

Разберем, почему стандартное форматирование здесь не подходит, с какими ограничениями можно столкнуться в языке запросов и как правильно решить задачу с помощью языка выражений СКД.

Ограничения языка запросов 1С при работе с делением

Попытка преобразовать число дней непосредственно в тексте запроса через функции ДОБАВИТЬКДАТЕ, РАЗНОСТЬДАТ или арифметическое деление часто приводит к ошибкам. Рассмотрим основные причины:

  1. Отсутствие функций целочисленного деления: в языке запросов 1С нет операторов DIV и MOD (остаток от деления), а также функции ЦЕЛ().
  2. Особенности округления: конструкция ВЫРАЗИТЬ(Число КАК ЧИСЛО(15, 0)) выполняет математическое округление до ближайшего целого (по правилам округления), а не отбрасывание дробной части. Это приводит к завышению количества месяцев или лет.
  3. Плавающая длина месяцев: если у нас нет точных дат начала и окончания каждого расчетного периода, то прибавление дней к произвольной дате дает плавающую погрешность из-за високосных лет и месяцев с 28, 30 и 31 днем.

Решение через вычисляемые поля СКД по нормативному алгоритму

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

Согласно общепринятым правилам подсчета стажа при отсутствии точных календарных границ периодов каждые 30 дней переводятся в 1 полный месяц, а каждые 12 месяцев — в 1 полный год.

Проанализируем математические формулы для языка выражений СКД:

  1. Общее количество месяцев: Цел(КоличествоДней / 30)
  2. Количество лет: Цел(Цел(КоличествоДней / 30) / 12)
  3. Остаток месяцев: Цел(КоличествоДней / 30) - Цел(Цел(КоличествоДней / 30) / 12) * 12
  4. Остаток дней: КоличествоДней - Цел(КоличествоДней / 30) * 30

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

  1. Открываем схему компоновки данных и переходим на вкладку «Вычисляемые поля».
  2. Добавляем новое поле, указываем путь к данным, например: СтажСтрокой, и заголовок Стаж.
  3. В колонку «Выражение» помещаем формулу формирования итоговой строки с проверкой на нулевые значения.

Посмотрим на пример итогового выражения для вычисляемого поля СКД:


ВЫБОР 
    КОГДА Есть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), писать громоздкие формулы в СКД необязательно. В языке выражений вычисляемых полей СКД разрешено напрямую вызывать экспортные функции неглобальных серверных общих модулей.

Разберем, как это работает:

  1. В типовых конфигурациях уже реализованы специализированные процедуры формирования представления стажа с правильным склонением слов («год», «года», «лет»).
  2. В выражении вычисляемого поля достаточно указать вызов функции общего модуля, передав туда число дней или структуру параметров.

Пример вызова серверной функции из вычисляемого поля:

ИмяСерверногоОбщегоМодуля.СформироватьПредставлениеСтажа(КоличествоДней)

Такой подход обеспечивает идеальное форматирование с учетом правил русского языка и избавляет от необходимости усложнять схему компоновки длинными строковыми выражениями.

← На главную