При разработке управляемых форм часто возникает задача добавления колонок в табличную часть ТЧ программно. Однако разработчики сталкиваются с ограничением платформы: попытка использовать свойство ПутьКДаннымПодвала для таких колонок вызывает ошибку исполнения. Давайте разберем, почему это происходит и как реализовать расчет итогов правильно.
Механизм ОтображатьВПодвале и автоматический расчет итогов в платформе 1С жестко привязаны к метаданным реквизитов объекта. Когда мы добавляем колонки программно, для системы они не являются частью структуры данных Объекта. Следовательно, платформа не может «автоматически» вычислить итог для колонки, которая не существует на уровне метаданных конфигурации.
ТекстПодвалаСамый прямой способ — это ручной расчет итога с последующим присвоением результата свойству ТекстПодвала соответствующего элемента формы. Рассмотрим, как это реализовать.
Для того чтобы итоги всегда были актуальными, нам необходимо создать процедуру обновления, которую мы будем вызывать при любых изменениях в табличной части.
Процедура ОбновитьИтогиПодвала()
Для Сч = 1 По 12 Цикл
ИмяЭлемента = "НачисленияЗначение" + Сч;
Если Элементы.Найти(ИмяЭлемента) <> Неопределено Тогда
Элементы[ИмяЭлемента].ТекстПодвала = Объект.Начисления.Итог("Значение" + Сч);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Важно помнить, что эту процедуру нужно вызывать в следующих обработчиках:
ПриИзменении для каждого программно созданного поля ввода.ПриИзменении (или ПриОкончанииРедактирования) всей табличной части.ТЧ, так как эти операции не вызывают стандартные обработчики формы.Если вы хотите избежать прямого манипулирования текстом подвала, можно создать дополнительные реквизиты формы (типа Число) и выводить их в подвале как отдельные поля. Это более надежный подход, так как платформа сама будет управлять отображением значений, привязанных к реквизитам формы.
Рассмотрим пример создания таких полей:
// Добавление поля для значения
Значение = Элементы.Добавить(ИмяТаблицы + "Значение" + НомерПоказателя, Тип("ПолеФормы"), ГруппаЗначения);
Значение.Вид = ВидПоляФормы.ПолеВвода;
Значение.ПутьКДанным = "Объект.Начисления.Значение" + НомерПоказателя;
// Добавление поля-итога
ИтогПоле = Элементы.Добавить(ИмяТаблицы + "Итог" + НомерПоказателя, Тип("ПолеФормы"), ГруппаПодвала);
ИтогПоле.Вид = ВидПоляФормы.ПолеВвода;
ИтогПоле.ПутьКДанным = "ИтогПоказателя" + НомерПоказателя; // Отдельный реквизит формы
ИтогПоле.ТолькоПросмотр = Истина;
При таком подходе в процедуре обновления итогов вы просто присваиваете рассчитанное значение Объект.Начисления.Итог(...) соответствующему реквизиту формы, и значение в интерфейсе обновится автоматически благодаря связи ПутьКДанным.
При работе с программными колонками учитывайте следующие важные моменты:
ТекстПодвала на клиенте может провоцировать лишние серверные вызовы. Старайтесь выполнять расчеты и обновление данных максимально оптимизировано.Объект.ИмяТЧ.ЭтаФорма.Модифицированность = Истина, чтобы пользователь не потерял изменения при закрытии.Таким образом, для решения задачи вывода итогов по программным колонкам, выбирайте второй способ с отдельными реквизитами формы — он обеспечивает более предсказуемое поведение интерфейса и упрощает дальнейшую поддержку кода.