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

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

Зачастую перед разработчиками 1С встает задача по визуализации промежуточных итогов в табличной части (ТЧ) документа. Пользователи хотят видеть сумму не по всей таблице целиком, а с учетом наложенных фильтров — например, только по конкретному контрагенту или организации. Рассмотрим основные подходы к решению этой задачи, от простых методов вывода до более сложных архитектурных решений.

Использование стандартных подвалов с программным пересчетом

Самый простой и наглядный способ — использование стандартных подвалов колонок. Однако в платформе 1С они не фильтруются автоматически при наложении отбора на ТЧ. Чтобы реализовать эту функциональность, выполним следующие шаги:

  1. Включим отображение подвала для нужных колонок в свойствах элемента формы ТаблицаФормы.
  2. Создадим процедуру-обработчик, которая будет вызываться при изменении отборов или данных в табличной части.
  3. В обработчике будем пересчитывать сумму только для тех строк, которые удовлетворяют условиям отбора.

Для эффективного подсчета значений, не перебирая всю таблицу вручную, воспользуемся комбинацией методов НайтиСтроки и структурированного доступа:


// Пример программного расчета итога по условию
СтруктураОтбора = Новый Структура("Контрагент, Организация", ВыбранныйКонтрагент, ВыбраннаяОрганизация);
МассивНайденныхСтрок = Объект.Товары.НайтиСтроки(СтруктураОтбора);

ИтогСумма = 0;
Для Каждого СтрокаТЧ Из МассивНайденныхСтрок Цикл
    ИтогСумма = ИтогСумма + СтрокаТЧ.Сумма;
КонецЦикла;

Элементы.ТоварыСумма.ПодвалТекст = Формат(ИтогСумма, "ЧДЦ=2");

Важно помнить про производительность: если вызывать этот код при каждом изменении любой ячейки (событие ПриИзменении), интерфейс может начать «подтормаживать» на больших объемах данных. Оптимально выполнять расчет при завершении редактирования строки или по кнопке обновления.

Реализация через дерево значений на форме

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

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

Быстрые вычисления в коде: альтернатива pandas

Часто программисты задаются вопросом, как упростить агрегацию данных «на лету» без циклов. Хотя прямого аналога библиотеки pandas в платформе 1С нет, мы можем эффективно использовать метод Скопировать для временной выборки строк:


// Быстрое получение итога через копирование таблицы
Фильтр = Новый Структура("Контрагент", ТекущийКонтрагент);
ТЗ_Отбор = Объект.Товары.Выгрузить().Скопировать(Объект.Товары.НайтиСтроки(Фильтр));
ИтогПоКонтрагенту = ТЗ_Отбор.Итог("Сумма");

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

Заключение и рекомендации

При выборе метода реализации итогов по отборам учитывайте следующие рекомендации:

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

← На главную