Как программно добавить итоги в подвал таблицы на управляемой форме 1С?

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

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

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

Решение базовой задачи: вывод итогов для табличной части документа

Рассмотрим стандартный сценарий. У нас есть документ (например, «Материальная помощь» или «Начисление зарплаты»), в котором присутствует табличная часть Начисления с числовой колонкой Результат. Наша задача — программно отобразить сумму всех начислений внизу таблицы.

Для того чтобы итоги отобразились на форме, необходимо выполнить два обязательных шага:

  1. Включить отображение подвала у самого элемента формы (таблицы).
  2. Связать свойство подвала конкретной колонки с источником данных — итогом табличной части.

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


// ОШИБОЧНЫЙ КОД
Элементы.НачисленияРезультат.ПутьКДаннымПодвала = Объект.Начисления.ИтогРезультат; 
// или так
Элементы.НачисленияРезультат.ПутьКДаннымПодвала = Объект.Начисления.Итог("Результат");

При выполнении такого кода платформа выдаст ошибку: Поле объекта не обнаружено (ИтогРезультат) или попытается присвоить свойству числовое значение вместо пути к данным. Свойство ПутьКДаннымПодвала ожидает получить строку, описывающую путь к данным объекта, а не конкретное вычисленное число!

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

Ниже представлен рабочий пример кода:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Безопасная вставка кода (пропускаем выполнение при автотестах)
    Если Параметры.Свойство("АвтоТест") Тогда 
        Возврат;
    КонецЕсли;

    // Шаг 1. Включаем отображение подвала у таблицы на форме
    Элементы.Начисления.Подвал = Истина;
    
    // Шаг 2. Задаем строковый путь к итогам для конкретного поля
    // Обратите внимание: путь указывается в кавычках как текстовая строка!
    Элементы.НачисленияРезультат.ПутьКДаннымПодвала = "Объект.Начисления.ИтогРезультат";

КонецПроцедуры

При таком подходе платформа берет на себя всю рутину по расчету суммы. Как только пользователь изменит значение в колонке Результат, число в подвале обновится автоматически без отправки контекстных запросов на сервер.

Сложный сценарий: вывод итогов для Таблицы Значений (ТЗ) на форме

Что делать, если таблица на форме является не табличной частью документа, а созданным вручную реквизитом формы с типом ТаблицаЗначений? В этом случае стандартный механизм автоматического расчета через ПутьКДаннымПодвала (вида "ИмяТЗ.ИтогИмяКолонки") работать не будет, так как у реквизитов формы типа ТЗ нет встроенных платформенных агрегатов для автоматического подсчета итогов.

Разберем по шагам два возможных способа решения этой проблемы.

Способ А: Расчет через свойство ТекстПодвала

Мы можем рассчитывать итог вручную при каждом изменении данных в таблице и выводить его как текст. Посмотрим на пример реализации:


&НаКлиенте
Процедура МояТаблицаКоличествоПриИзменении(Элемент)
    
    // Метод Итог() доступен для таблиц значений на клиенте в управляемом приложении
    ИтогКолонки = МояТаблица.Итог("Количество");
    
    // Принудительно форматируем число и записываем в ТекстПодвала
    Элементы.МояТаблицаКоличество.ТекстПодвала = Формат(ИтогКолонки, "ЧДЦ=2");
    
КонецПроцедуры

Важно: Не забывайте вызывать аналогичный расчет в процедуре ПриОткрытии или ПриСозданииНаСервере, чтобы при открытии формы пользователь сразу видел актуальные данные.

Способ Б: Связка со вспомогательным реквизитом формы

Этот способ более изящен и позволяет переложить форматирование вывода на саму платформу:

  1. Создаем новый реквизит формы с именем ИтогПоТаблице (тип данных — Число).
  2. Для элемента формы (колонки) прописываем путь к данным подвала: Элементы.МояТаблицаКоличество.ПутьКДаннымПодвала = "ИтогПоТаблице";.
  3. В обработчике изменения строк на клиенте пересчитываем значение реквизита: ИтогПоТаблице = МояТаблица.Итог("Количество");.

Особенности работы с Динамическими Списками

В динамических списках (например, в списках документов продаж или справочников) платформа считывает данные порциями (постранично). По этой причине она физически не может на клиенте моментально посчитать сумму по всей базе данных.

Для реализации итогов в динамических списках обычно используют следующий алгоритм на сервере:

  1. Включают видимость подвала таблицы динамического списка.
  2. При изменении отборов или при получении данных на сервере программно извлекают исполняемую схему компоновки данных (СКД) списка и текущие настройки пользователя.
  3. Выполняют запрос к базе данных с учетом всех наложенных пользователем фильтров и рассчитывают агрегатную сумму.
  4. Записывают результат в свойство ТекстПодвала нужной колонки.

Рассмотрим пример получения настроек СКД для расчета:


&НаСервере
Процедура РассчитатьИтогДинамическогоСписка()
    
    Схема = Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
    Настройки = Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
    
    // Далее выполняем компоновку макета, выгружаем результат в ТЗ и берем итог
    // Либо строим прямой запрос к БД на основе структуры полученных настроек
    
    // Пример вывода результата:
    Элементы.СписокСумма.ТекстПодвала = Формат(РассчитаннаяСумма, "ЧДЦ=2");
    
КонецПроцедуры

Оформление итогов по стандартам ИТС (Фирмы «1С»)

Разрабатывая интерфейсы, крайне важно придерживаться единых стандартов эргономики ИТС. Рассмотрим ключевые правила оформления итогов:

Внимание: Баг в среде разработки 1С:EDT

Если вы ведете разработку в современной среде 1С:EDT (Enterprise Development Tools), будьте предельно внимательны при интерактивной настройке путей к подвалам. В некоторых версиях EDT присутствует баг автоподстановки.

Среда разработки может предложить вам ошибочный путь вида: Элементы.ИмяТаблицы.ТекущиеДанные.ИтогИмяРеквизита.

Если согласиться с этой подсказкой, проект успешно сохранится, но на этапе сборки базы данных или обновления конфигурации платформа выдаст критическую ошибку. Всегда контролируйте, чтобы путь к данным указывал непосредственно на данные объекта базы (например, "Объект.Начисления.ИтогРезультат").

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

← На главную