В процессе разработки часто возникает задача обработки данных, хранящихся в объекте ТаблицаЗначений. Одной из наиболее частых операций является сворачивание данных по определенному признаку, например, по должности, с последующим расчетом средних показателей. Давайте разберем, как эффективно выполнить эту задачу, используя стандартные средства платформы 1С.
Самым элегантным и производительным способом работы с ТаблицаЗначений является использование объекта Запрос. Платформа 1С позволяет передавать таблицу значений в запрос как параметр, что открывает доступ к мощному функционалу агрегатных функций, таких как СУММА() и СРЕДНЕЕ().
Чтобы вычислить средний стаж, нам необходимо не только сгруппировать данные, но и знать количество строк, которые вошли в каждую группу. Поскольку стандартный метод Свернуть() не возвращает количество записей, мы добавим «техническую» колонку с единицей в каждую строку нашей таблицы.
Рассмотрим пошаговое выполнение этой задачи:
ПОМЕСТИТЬ для временной таблицы, чтобы подготовить данные для группировки.СРЕДНЕЕ() и СУММА().Вот пример кода, который реализует данный алгоритм:
// Предположим, что ТаблицаЗначений уже заполнена данными
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТЗ.Должность КАК Должность,
| ТЗ.Стаж КАК Стаж,
| 1 КАК Количество
|ПОМЕСТИТЬ ВТ_Данные
|ИЗ
| &ТЗ КАК ТЗ
|;
|
|ВЫБРАТЬ
| ВТ.Должность КАК Должность,
| СРЕДНЕЕ(ВТ.Стаж) КАК СреднийСтаж,
| СУММА(ВТ.Количество) КАК КоличествоСотрудников
|ИЗ
| ВТ_Данные КАК ВТ
|СГРУППИРОВАТЬ ПО
| ВТ.Должность";
Запрос.УстановитьПараметр("ТЗ", ТаблицаЗначений);
Результат = Запрос.Выполнить().Выгрузить();
Использование запроса дает нам несколько преимуществ:
ТаблицаЗначений, что позволяет быстро обрабатывать значительные объемы строк.Хотя запросы являются предпочтительным методом, полезно знать и другие подходы для разных сценариев разработки:
СвернутьВы можете использовать встроенный метод ТаблицаЗначений.Свернуть(). Однако, как было отмечено ранее, он не считает количество автоматически. Чтобы получить количество, вам необходимо заранее добавить в таблицу колонку, заполненную единицами, и включить её в параметры метода:
// Добавляем колонку для подсчета
ТаблицаЗначений.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));
ТаблицаЗначений.ЗаполнитьЗначения(1, "Количество");
// Сворачиваем таблицу
ТаблицаЗначений.Свернуть("Должность", "Стаж, Количество");
После этого метода в колонке Стаж будет сумма стажа, а в колонке Количество — количество свернутых строк. Чтобы получить среднее, достаточно будет пройтись по получившейся таблице и разделить значение колонки Стаж на Количество.
СоответствиеЕсли данные таблицы очень малы (например, до 10-20 строк) и использование запроса кажется избыточным, можно воспользоваться методом Соответствие. Вы создаете два соответствия: одно для накопления суммы стажа, другое — для количества записей. Проходя циклом по ТаблицаЗначений, вы обновляете значения в этих коллекциях по ключу (Должность). Этот метод работает полностью в оперативной памяти и не требует формирования структуры запроса.
Подведем итог: для большинства задач в 1С самым надежным и профессиональным способом является использование Запрос, так как он позволяет переложить всю «грязную работу» по группировке и агрегации на мощный движок платформы.