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