Как вывести итоги по колонкам в подвале Таблицы Значений на управляемой форме?

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

При работе с управляемыми формами (редактор форм в режиме предприятия) в 1С часто возникает задача отобразить итоговые значения по числовым колонкам в подвале таблицы. Если источником данных для таблицы на форме является табличная часть объекта (например, документа или справочника), платформа предоставляет удобный механизм: в свойстве колонки ПутьКДаннымПодвала можно выбрать поле с агрегатной функцией (сумма, количество и т.д.).

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

Выясним причину: платформа автоматически рассчитывает итоги для данных, которые хранятся в базе (табличные части). А ТаблицаЗначений — это объект в оперативной памяти, и управление расчетом итогов по ней полностью ложится на разработчика (программный вывод произвольной таблицы значений на управляемую форму).

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

Решение 1: Использование отдельного реквизита формы (Рекомендуемый способ)

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

  1. Создание реквизита для итога. В дереве реквизитов формы создадим новый реквизит для хранения итогового значения. Например, если нам нужен итог по колонке "Сумма", назовем реквизит ИтогСумма и зададим ему числовой тип, соответствующий типу данных в колонке.

  2. Привязка подвала колонки к реквизиту. Выделим на форме нужную колонку таблицы. В палитре свойств найдем свойство ПутьКДаннымПодвала и выберем в нем наш новый реквизит ИтогСумма.

    На этом настройка формы завершена. Теперь, как только значение реквизита ИтогСумма будет меняться, платформа автоматически обновит его отображение в подвале таблицы.

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

    Создадим отдельную процедуру на клиенте для пересчета итогов. Это позволит избежать дублирования кода.

    
    &НаКлиенте
    Процедура РассчитатьИтогиТаблицы()
        // Предположим, что реквизит формы с таблицей называется "МояТаблицаЗначений"
        // а колонка, по которой считаем итог, - "СуммаДокумента"
        ИтогСумма = МояТаблицаЗначений.Итог("СуммаДокумента");
    КонецПроцедуры
    
  4. Вызов процедуры расчета. Теперь нужно вызывать эту процедуру из всех необходимых событий. Основные события:

    • При изменении данных в ячейке: для числовой колонки нужно создать обработчик события ПриИзменении.
    • 
      &НаКлиенте
      Процедура МояТаблицаЗначенийСуммаДокументаПриИзменении(Элемент)
          РассчитатьИтогиТаблицы();
      КонецПроцедуры
      
    • После добавления строки: итог нужно пересчитать, когда пользователь добавляет новую строку. Используем событие ПриОкончанииРедактирования или обработчик команды добавления.
    • После удаления строки: используем событие таблицы ПослеУдаления.
    • 
      &НаКлиенте
      Процедура МояТаблицаЗначенийПослеУдаления(Элемент)
          РассчитатьИтогиТаблицы();
      КонецПроцедуры
      
    • При загрузке/обновлении данных: если данные в таблицу загружаются программно, не забудьте вызвать процедуру РассчитатьИтогиТаблицы() после завершения загрузки.

Преимущества этого способа:

Решение 2: Прямое изменение текста подвала

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

  1. Расчет и присвоение текста. Вместо изменения значения реквизита, мы будем обращаться к элементу формы (колонке) и устанавливать его свойство ТекстПодвала.

    Посмотрим на пример. Пусть таблица на форме называется Товары, а колонка, для которой нужен итог, — Сумма.

    
    // Предположим, что реквизит формы с таблицей называется "ОбъектТовары"
    ИтоговаяСумма = ОбъектТовары.Итог("Сумма");
    
    // Форматируем число в строку для красивого отображения
    ТекстИтога = Формат(ИтоговаяСумма, "ЧДЦ=2; ЧН=0.00");
    
    // Обращаемся к элементу формы и устанавливаем текст подвала
    Элементы.ТоварыСумма.ТекстПодвала = ТекстИтога;
    
  2. Вызов кода. Этот код, так же как и в первом решении, необходимо вызывать во всех обработчиках событий, где итоговая сумма может измениться (ПриИзменении, ПослеУдаления и т.д.).

Недостатки этого способа:

Этот же подход применим и для реквизита формы с типом ДеревоЗначений. Итог по верхнему уровню строк можно посчитать аналогично:


Элементы.МоеДеревоИмяКолонки.ТекстПодвала = МоеДерево.Строки.Итог("ИмяКолонки");

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

← На главную