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