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