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