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

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

При разработке интерфейсов в среде 1С:Предприятие 8.3 на управляемых формах нередко возникает задача изменить стандартное представление ссылочного поля в строках табличной части (например, выводить документ в формате «Номер от Дата»). При этом стандартный механизм переопределения представления в модуле менеджера — событие ОбработкаПолученияПредставления — не всегда применим, так как он изменяет вид ссылки глобально по всей конфигурации, а нестандартный вид может требоваться только в одном документе или рабочем месте.

Разберем, почему попытки решить эту задачу «в лоб» через условное оформление вызывают трудности, какие системные ограничения существуют у табличных частей в управляемых формах и как правильно реализовать требуемое поведение на практике.

Ограничения платформы и типичные ошибки

Проанализируем основные подводные камни, с которыми сталкиваются разработчики:

  1. Параметр «Текст» в условном оформлении: стандартный механизм условного оформления управляемой формы не умеет вычислять динамические выражения (формулы со сложением строк) «на лету». В параметр оформления Текст нельзя просто передать формулу вида Строка(Номер) + " от " + Строка(Дата). Туда можно передать либо фиксированную статическую строку, либо ссылку на другое поле через специальный объект платформы.
  2. Построчное создание элементов условного оформления: некоторые разработчики пытаются программно обойти ограничение, создавая для каждой строки табличной части отдельное правило в коллекции УсловноеОформление.Элементы. Этот путь крайне неэффективен: при росте числа строк производительность формы резко падает. Кроме того, при любом изменении состава строк (добавление, удаление, смена ссылки) список правил приходится полностью пересчитывать и очищать на сервере.
  3. Отсутствие события «ПриПолученииДанных»: в управляемых формах обработчик ПриПолученииДанныхНаСервере доступен исключительно для объекта ДинамическийСписок. Табличные части объектов привязаны к коллекции типа ДанныеФормыКоллекция, и для них платформой не предусмотрены серверные обработчики построчной отрисовки данных.

Рассмотрим рабочие и оптимизированные варианты решения этой задачи.

Способ 1. Использование вспомогательного реквизита формы и одного правила условного оформления

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

Разберем по шагам, как это реализовать:

  1. В редакторе формы добавляем в табличную часть Объект.ТЧ строковый реквизит формы (например, ПредставлениеДокумента). Обратите внимание: реквизит добавляется только в структуру формы, состав метаданных в дереве конфигурации менять не требуется.
  2. Создаем на форме всего одно общее правило условного оформления, которое будет брать значение из созданной колонки. Это правило связывается с ячейкой через ПолеКомпоновкиДанных.
  3. При открытии формы (в процедурах ПриСозданииНаСервере или ПриЧтенииНаСервере) заполняем вспомогательную колонку для всех строк, а при интерактивном изменении ячейки пользователем обновляем значение в обработчике ПриИзменении.

Посмотрим на пример программной настройки условного оформления при создании формы:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Настраиваем одно общее правило условного оформления
    ЭлементОформления = УсловноеОформление.Элементы.Добавить();
    
    // Указываем оформляемое поле (колонка с ссылкой)
    ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
    ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("ТЧДокумент");
    
    // Подменяем текст значением из вспомогательной колонки формы
    ЭлементОформления.Оформление.УстановитьЗначениеПараметра(
        "Текст", 
        Новый ПолеКомпоновкиДанных("Объект.ТЧ.ПредставлениеДокумента")
    );
    
    // Заполняем представление для уже существующих строк
    ОбновитьПредставленияВТабличнойЧасти();
    
КонецПроцедуры

На стороне сервера заполняем строки компактным запросом или циклом:


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

Для поддержания актуальности данных при редактировании таблицы пользователем, подключим обработчик к полю ввода документа:


&НаКлиенте
Процедура ТЧДокументПриИзменении(Элемент)
    
    ТекущаяСтрока = Элементы.ТЧ.ТекущиеДанные;
    Если ТекущаяСтрока <> Неопределено Тогда
        ТекущаяСтрока.ПредставлениеДокумента = ПолучитьПредставлениеНаСервере(ТекущаяСтрока.Документ);
    КонецЕсли;
    
КонецПроцедуры

Способ 2. Отображение строковой колонки вместо ссылки

Если нет строгой необходимости использовать именно поле ввода ссылки для показа текста, можно поступить еще проще:

  1. Добавляем строковый реквизит в коллекцию формы Объект.ТЧ, как и в первом способе.
  2. Выносим созданную строковую колонку в таблицу на форме, а саму колонку с ссылкой делаем невидимой (свойство Видимость = Ложь).
  3. Для строковой колонки включаем свойства Гиперссылка или КнопкаОткрытия и в обработчике нажатия открываем исходный документ через процедуру ПоказатьЗначение.

Этот подход избавляет от механизма условного оформления вовсе, снижает нагрузку на клиентское приложение и делает отображение ячейки предсказуемым.

Способ 3. Визуальное объединение полей «В ячейке» без написания кода

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

  1. В дереве элементов формы внутри таблицы создаем новый элемент Группа - Группа колонок.
  2. В свойствах созданной группы находим параметр Группировка и устанавливаем его в значение В ячейке.
  3. Перетаскиваем внутрь группы поле номера и поле даты.

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

← На главную