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