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