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

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

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

Синтаксис динамического обращения к колонкам

Когда имя колонки хранится в переменной, обращение через точку вида ЭлементыФормы.Заказы.Колонки.ИмяКолонки вызывает синтаксическую ошибку или ошибку времени выполнения. Для динамического доступа к коллекции элементов или колонок по строковому имени используется оператор индексирования — квадратные скобки [].

Разберем базовую конструкцию:

ЭлементыФормы.Заказы.Колонки[ИмяПеременнойСИменемКолонки].ТекстПодвала = "100";

Реализация вывода итогов в цикле на обычных формах

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

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


Для Каждого Колонка Из ЭлементыФормы.Заказы.Колонки Цикл
    // Проверяем, привязана ли колонка к данным таблицы
    Если ЗначениеЗаполнено(Колонка.Данные) И ТаблицаДанных.Колонки.Найти(Колонка.Данные) <> Неопределено Тогда
        // Проверяем, является ли колонка числовой
        Если ТаблицаДанных.Колонки[Колонка.Данные].ТипЗначения.СодержитТип(Тип("Число")) Тогда
            СуммаИтога = ТаблицаДанных.Итог(Колонка.Данные);
            Колонка.ТекстПодвала = Формат(СуммаИтога, "ЧДЦ=2; ЧГ=3,0");
        КонецЕсли;
    КонецЕсли;
КонецЦикла;

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

  1. Событие таблицы ПослеУдаления.
  2. Событие таблицы ПриОкончанииРедактирования (при интерактивном вводе данных пользователем).
  3. Сразу после любой программной загрузки, заполнения или очистки строк таблицы.

Особенности установки итогов на управляемых формах

На управляемых формах архитектура работы с интерфейсом отличается. Элементы формы не содержат коллекции Колонки, а представляют собой плоский список элементов или дерево элементов в свойстве Элементы.

Рассмотрим два способа настройки подвала на управляемых формах:

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

Для Каждого Колонка Из ТаблицаДанных.Колонки Цикл
    Если Колонка.ТипЗначения.СодержитТип(Тип("Число")) Тогда
        ИмяЭлемента = "Заказы" + Колонка.Имя;
        Если Элементы.Найти(ИмяЭлемента) <> Неопределено Тогда
            Элементы[ИмяЭлемента].ТекстПодвала = Формат(ТаблицаДанных.Итог(Колонка.Имя), "ЧДЦ=2; ЧГ=3,0");
            Элементы[ИмяЭлемента].ГоризонтальноеПоложениеВПодвале = ГоризонтальноеПоложениеЭлемента.Право;
        КонецЕсли;
    КонецЕсли;
КонецЦикла;

Важные нюансы и ограничения платформы

Выясним типичные тонкости, с которыми можно столкнуться при реализации итогов в подвале:

  1. Тип свойства: свойство ТекстПодвала всегда имеет строковый тип данных. Передача числа напрямую может привести к отображению неформатированного значения, поэтому обязательно используем функцию Формат() с явным указанием разрядности и группировки.
  2. Пользовательские отборы: стандартный метод ТаблицаЗначений.Итог() суммирует значения по всем строкам таблицы, полностью игнорируя визуальные отборы, установленные пользователем в интерфейсе. Если требуется подсчитать итог только по отфильтрованным строкам, необходимо использовать обход строк таблицы с проверкой видимости через Элементы.ИмяТаблицы.ПроверитьСтроку().
  3. Динамические списки: для элементов с типом ДинамическийСписок подсчет итогов в подвале платформой не предусмотрен, так как данные считываются с сервера порциями. В таком случае итог рассчитывается отдельным запросом к базе данных.
← На главную