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

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

В процессе разработки часто возникает задача обработки данных, хранящихся в объекте ТаблицаЗначений. Одной из наиболее частых операций является сворачивание данных по определенному признаку, например, по должности, с последующим расчетом средних показателей. Давайте разберем, как эффективно выполнить эту задачу, используя стандартные средства платформы 1С.

Решение задачи с помощью языка запросов 1С

Самым элегантным и производительным способом работы с ТаблицаЗначений является использование объекта Запрос. Платформа 1С позволяет передавать таблицу значений в запрос как параметр, что открывает доступ к мощному функционалу агрегатных функций, таких как СУММА() и СРЕДНЕЕ().

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

Рассмотрим пошаговое выполнение этой задачи:

  1. Подготовим таблицу данных, добавив колонку для счетчика.
  2. Передадим эту таблицу в запрос.
  3. Используем конструкцию ПОМЕСТИТЬ для временной таблицы, чтобы подготовить данные для группировки.
  4. Выполним итоговую группировку с применением функций СРЕДНЕЕ() и СУММА().

Вот пример кода, который реализует данный алгоритм:


// Предположим, что ТаблицаЗначений уже заполнена данными
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ТЗ.Должность КАК Должность,
    |	ТЗ.Стаж КАК Стаж,
    |	1 КАК Количество
    |ПОМЕСТИТЬ ВТ_Данные
    |ИЗ
    |	&ТЗ КАК ТЗ
    |;
    |
    |ВЫБРАТЬ
    |	ВТ.Должность КАК Должность,
    |	СРЕДНЕЕ(ВТ.Стаж) КАК СреднийСтаж,
    |	СУММА(ВТ.Количество) КАК КоличествоСотрудников
    |ИЗ
    |	ВТ_Данные КАК ВТ
    |СГРУППИРОВАТЬ ПО
    |	ВТ.Должность";

Запрос.УстановитьПараметр("ТЗ", ТаблицаЗначений);
Результат = Запрос.Выполнить().Выгрузить();

Почему этот метод эффективен?

Использование запроса дает нам несколько преимуществ:

Альтернативные подходы к группировке

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

Использование метода Свернуть

Вы можете использовать встроенный метод ТаблицаЗначений.Свернуть(). Однако, как было отмечено ранее, он не считает количество автоматически. Чтобы получить количество, вам необходимо заранее добавить в таблицу колонку, заполненную единицами, и включить её в параметры метода:


// Добавляем колонку для подсчета
ТаблицаЗначений.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));
ТаблицаЗначений.ЗаполнитьЗначения(1, "Количество");

// Сворачиваем таблицу
ТаблицаЗначений.Свернуть("Должность", "Стаж, Количество");

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

Использование коллекции Соответствие

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

Подведем итог: для большинства задач в 1С самым надежным и профессиональным способом является использование Запрос, так как он позволяет переложить всю «грязную работу» по группировке и агрегации на мощный движок платформы.

← На главную