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