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