Как программно вывести итог в подвал для динамически добавленных колонок табличной части?

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

При разработке управляемых форм часто возникает задача добавления колонок в табличную часть ТЧ программно. Однако разработчики сталкиваются с ограничением платформы: попытка использовать свойство ПутьКДаннымПодвала для таких колонок вызывает ошибку исполнения. Давайте разберем, почему это происходит и как реализовать расчет итогов правильно.

Почему не работает стандартный механизм авто-итогов?

Механизм ОтображатьВПодвале и автоматический расчет итогов в платформе 1С жестко привязаны к метаданным реквизитов объекта. Когда мы добавляем колонки программно, для системы они не являются частью структуры данных Объекта. Следовательно, платформа не может «автоматически» вычислить итог для колонки, которая не существует на уровне метаданных конфигурации.

Способ №1: Использование свойства ТекстПодвала

Самый прямой способ — это ручной расчет итога с последующим присвоением результата свойству ТекстПодвала соответствующего элемента формы. Рассмотрим, как это реализовать.

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


Процедура ОбновитьИтогиПодвала()
    Для Сч = 1 По 12 Цикл
        ИмяЭлемента = "НачисленияЗначение" + Сч;
        Если Элементы.Найти(ИмяЭлемента) <> Неопределено Тогда
            Элементы[ИмяЭлемента].ТекстПодвала = Объект.Начисления.Итог("Значение" + Сч);
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Важно помнить, что эту процедуру нужно вызывать в следующих обработчиках:

  1. ПриИзменении для каждого программно созданного поля ввода.
  2. ПриИзменении (или ПриОкончанииРедактирования) всей табличной части.
  3. После программного заполнения или очистки ТЧ, так как эти операции не вызывают стандартные обработчики формы.

Способ №2: Использование отдельного реквизита формы

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

Рассмотрим пример создания таких полей:


// Добавление поля для значения
Значение = Элементы.Добавить(ИмяТаблицы + "Значение" + НомерПоказателя, Тип("ПолеФормы"), ГруппаЗначения);
Значение.Вид = ВидПоляФормы.ПолеВвода;
Значение.ПутьКДанным = "Объект.Начисления.Значение" + НомерПоказателя;

// Добавление поля-итога
ИтогПоле = Элементы.Добавить(ИмяТаблицы + "Итог" + НомерПоказателя, Тип("ПолеФормы"), ГруппаПодвала);
ИтогПоле.Вид = ВидПоляФормы.ПолеВвода;
ИтогПоле.ПутьКДанным = "ИтогПоказателя" + НомерПоказателя; // Отдельный реквизит формы
ИтогПоле.ТолькоПросмотр = Истина;

При таком подходе в процедуре обновления итогов вы просто присваиваете рассчитанное значение Объект.Начисления.Итог(...) соответствующему реквизиту формы, и значение в интерфейсе обновится автоматически благодаря связи ПутьКДанным.

Рекомендации по реализации

При работе с программными колонками учитывайте следующие важные моменты:

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

← На главную