Как посчитать количество сотрудников по категориям в отчете «Анализ ФОТ по начислениям» в 1С ЗУП/ERP?

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

При работе с типовыми отчетами в 1С, такими как «Анализ ФОТ по начислениям» в конфигурациях ЗУП и ERP, часто возникает задача подсчета количества сотрудников, сгруппированных по определенным критериям, например, по их категориям. Мы хотим узнать не только общее количество сотрудников, но и сколько из них относится к той или иной категории. При этом важно учесть, что сотрудники должны быть подсчитаны уникально, а не по количеству начислений или других строк отчета, связанных с ними. Давайте вместе разберем, как решить эту задачу, используя стандартные возможности Системы Компоновки Данных (СКД).

Определение исходной проблемы: подсчет уникальных сотрудников

Наша цель — получить в отчете две ключевые метрики:

  1. Общее количество всех сотрудников.
  2. Количество сотрудников в каждой категории.

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

Использование функции Количество(Различные) для подсчета уникальных значений

Для подсчета уникальных значений в СКД существует специальная агрегатная функция Количество(Различные ...). Это наш первый шаг к решению задачи.

Когда нам нужно получить общее количество уникальных сотрудников без какой-либо группировки, мы можем использовать выражение:

Количество(Различные Сотрудник)

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

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

Решение 1: Преобразование поля в ресурс и агрегация (для общего количества строк)

Один из часто предлагаемых способов подсчета — это создание вспомогательного поля в запросе, которое затем агрегируется. Хотя это решение не всегда подходит для уникального подсчета сотрудников, оно полезно для понимания работы с ресурсами.

  1. Изменение запроса набора данных:

    Нам потребуется добавить в запрос набора данных отчета новое поле. Если отчет типовой, и мы не имеем прямого доступа к запросу, это будет сложнее. Но если у нас есть возможность редактировать запрос или создать вычисляемое поле, мы можем добавить конструкцию типа:

    
    ВЫБРАТЬ
        ...
        1 КАК Кол_во, // Добавляем новое поле
        ...
    

    Здесь мы создаем поле Кол_во, которое всегда равно 1 для каждой строки результата запроса.

  2. Добавление поля в ресурсы СКД:

    После этого переходим на вкладку «Ресурсы» в настройках СКД. Здесь мы добавляем наше новое поле Кол_во в список ресурсов. В качестве агрегатной функции для него мы указываем СУММА. То есть, СКД будет суммировать единицы по этому полю.

    Сумма(Кол_во)

    Если мы просто хотим посчитать количество строк, то этот подход будет работать. Однако, как мы уже говорили, это посчитает количество строк, а не количество уникальных сотрудников, так как сотрудник, имеющий несколько начислений, будет иметь несколько строк с Кол_во = 1, и все эти единицы будут просуммированы.

Решение 2: Использование Количество(Различные Сотрудник) в качестве ресурса с корректной настройкой

Для получения именно уникального количества сотрудников, нам необходимо правильно использовать функцию Количество(Различные Сотрудник). Для этого:

  1. Добавление поля "Сотрудник" в выбранные поля и группировку (при необходимости):

    Убедимся, что поле Сотрудник присутствует в выбранных полях отчета. Если нам нужно считать сотрудников по категориям, то структура отчета должна иметь группировку по Категория, а внутри нее может быть детальная запись или просто возможность агрегирования по Сотруднику.

  2. Создание ресурса с функцией Количество(Различные Сотрудник):

    Переходим на вкладку «Ресурсы» в СКД. Создаем новый ресурс и даем ему понятное имя, например, «КоличествоУникальныхСотрудников». В поле «Выражение» указываем:

    Количество(Различные Сотрудник)

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

  3. Правильная настройка группировок:

    Убедитесь, что поле Сотрудник доступно на уровне группировки Категория или ниже. Если Категория является дополнительным свойством сотрудника, то в иерархии группировок Сотрудник должен быть "ниже", чем Категория или на том же уровне. Это позволяет СКД понять, какие именно сотрудники относятся к данной категории, и посчитать их уникально.

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

Решение 3: Двойное агрегирование с ВычислитьВыражениеСГруппировкойМассив (для сложных случаев)

В более сложных сценариях, когда прямое использование Количество(Различные) вызывает трудности из-за сложной структуры группировок или необходимости агрегации на разных уровнях, мы можем применить "двойное агрегирование" с использованием функции ВычислитьВыражениеСГруппировкойМассив.

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

  1. Создание вычисляемого поля:

    Перейдите на вкладку «Вычисляемые поля» в настройках СКД. Создайте новое поле.

  2. Использование ВычислитьВыражениеСГруппировкойМассив:

    В выражении для этого поля мы можем использовать нечто подобное (это пример, требующий адаптации под вашу конкретную структуру отчета):

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

    Здесь мы сначала вычисляем количество различных сотрудников для каждой детальной записи или подгруппы по "Сотруднику", а затем суммируем эти результаты на более высоком уровне группировки (например, по "Категории").

  3. Преобразование вычисляемого поля в ресурс:

    Как и в предыдущих случаях, если мы хотим видеть итоги по этому полю, его необходимо добавить в список ресурсов и указать соответствующие выражения для агрегации.

Использование пользовательских полей

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

  1. Добавление пользовательского поля типа "Выражение":

    Перейдите на вкладку «Пользовательские поля» в настройках СКД. Добавьте новое поле типа «Выражение».

  2. Формула для пользовательского поля:

    В поле «Выражение» вы можете использовать функции, аналогичные тем, что применяются в ресурсах, например:

    Количество(Различные Сотрудник)

    Или, если вы столкнулись с проблемой группировок, вы можете попытаться вычислить значение на более низком уровне, а затем просуммировать его, как в примере с ВычислитьВыражениеСГруппировкойМассив. Важно помнить, что в выражениях пользовательских полей нельзя использовать функции общих модулей напрямую.

  3. Настройка выражения для итогов:

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

Доступ к кадровой информации: подсчет количества ставок

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

В конфигурациях 1С, таких как ЗУП или ERP, данные о количестве ставок хранятся в кадровых регистрах. Для получения этой информации в запросе или вычисляемом поле СКД, мы можем использовать служебные функции общего модуля КадровыйУчет.

  1. Использование функции общего модуля:

    Одной из таких функций является КадровыйУчет.КадровыеДанныеСотрудников(). Она позволяет получить различные кадровые данные для сотрудника на определенную дату. Пример ее использования:

    
    КадровыйУчет.КадровыеДанныеСотрудников(Истина, Сотрудник, "КоличествоСтавок", &ТекущаяДата)
    

    Здесь:

    • Истина: указывает на то, что данные актуальны на определенную дату.
    • Сотрудник: ссылка на элемент справочника «Сотрудники».
    • "КоличествоСтавок": строковое имя параметра, который мы хотим получить.
    • &ТекущаяДата: параметр даты, на которую нам нужны данные. Важно корректно определить эту дату (например, конец периода отчета).

    Эта функция возвращает структурированный результат, который может выглядеть примерно так: «Нет; 31.12.3999 23:59:59; 14.10.2024 0:01:00; ...; 1». Где «1» в конце результата может быть искомым количеством ставок.

  2. Извлечение значения:

    Если функция возвращает строку, содержащую несколько значений, разделенных символами, вам потребуется дополнительно обработать эту строку, чтобы извлечь нужное числовое значение количества ставок. Это может быть сделано с помощью строковых функций (например, Прав(), Лев(), Найти()) или путем преобразования результата в структуру, если функция это позволяет.

  3. Интеграция в отчет:

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

Важные нюансы при работе с СКД

  1. Ресурсы и агрегатные функции: Все поля, по которым требуется рассчитать итоги (суммы, количества, средние и т.д.), должны быть определены как ресурсы на соответствующей вкладке СКД. Для каждого ресурса указывается агрегатная функция (СУММА, КОЛИЧЕСТВО, МАКСИМУМ, МИНИМУМ, СРЕДНЕЕ и другие).

  2. Структура отчета и группировки: Правильная вложенность группировок критически важна. Если вы хотите посчитать сотрудников по категориям, то категория должна быть на более высоком уровне группировки, чем деталь по сотрудникам, либо должна быть возможность агрегировать сотрудников на уровне категории.

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

  4. Контекст вычисления: Всегда помните о контексте, в котором вычисляется ваше выражение. Количество(Различные Сотрудник) будет работать по-разному в детальных записях, в группировке по категории и в общих итогах, если не настроить это явно.

Надеемся, эти подробные объяснения помогут вам успешно настроить отчет «Анализ ФОТ по начислениям» и получить точное количество сотрудников по категориям, а также необходимые кадровые данные.

← На главную