Как вывести расчетное значение в поле табличной части управляемой формы?

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

При разработке на управляемых формах 1С часто возникает задача отображения данных, которые не хранятся в базе данных, а вычисляются «на лету» — например, сумма двух реквизитов или разница остатков. В обычных формах мы использовали событие ПриВыводеСтроки, но в управляемых формах этот механизм отсутствует. Рассмотрим, как правильно реализовать вывод расчетных показателей, чтобы они не пропадали при обновлении формы.

Почему расчетные данные пропадают?

Основная причина заключается в архитектуре управляемых форм. Когда вы вызываете РеквизитФормыВЗначение("Объект"), вы получаете объект данных, в котором содержатся только физические реквизиты (те, что есть в структуре документа). Ваши расчетные поля, добавленные только на форму, в объект не попадают.

Когда вы завершаете манипуляции с объектом и вызываете ЗначениеВРеквизитФормы(ТекОбъект, "Объект"), платформа принудительно обновляет форму, опираясь на структуру объекта. В этот момент «лишние» данные, не привязанные к объекту, очищаются. Чтобы этого избежать, необходимо научиться правильно управлять процессом обновления.

Способ 1: Принудительное обновление после серверных процедур

Это самый распространенный и надежный способ для работы с документами. Суть заключается в том, что после каждого вызова ЗначениеВРеквизитФормы мы должны вручную запустить процедуру, которая снова заполнит расчетные колонки в табличной части.

Разберем это по шагам:

  1. Создайте серверную процедуру, которая обходит коллекцию строк табличной части формы и выполняет расчеты.
  2. Вызывайте эту процедуру во всех местах, где объект обновляется на сервере (например, ПриИзменении реквизитов шапки, после чтения или записи).

Пример реализации процедуры заполнения:


&НаСервере
Процедура ОбновитьРасчетныеПоказатели()
    Для Каждого СтрокаТЧ Из Объект.Товары Цикл
        СтрокаТЧ.РасчетноеПоле = СтрокаТЧ.Сумма1 + СтрокаТЧ.Сумма2;
    КонецЦикла;
КонецПроцедуры

Теперь вызовем эту процедуру в обработчике события, например, при изменении организации:


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

Способ 2: Использование динамических списков (для списков данных)

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

Это позволяет:

Важные рекомендации по работе с расчетными полями

Проанализируем основные правила, которые помогут вам избежать ошибок:

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

← На главную