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