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