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

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

При разработке форм документов и обработок часто возникает задача отобразить ссылку на другой документ в компактном виде. По умолчанию платформа 1С формирует стандартное системное представление вида «ГТД по импорту 125453 от 11.10.2014». Если вся колонка таблицы предназначена исключительно для одного вида документов, постоянное повторение названия документа загромождает интерфейс. Разберем, как вывести сокращенную строку (например, «125453 от 11.10.2014») локально в рамках одной формы, не ломая типовое поведение конфигурации.

Почему не подходят стандартные свойства и события менеджера

Прежде чем перейти к практическим способам решения, проанализируем ограничения платформы:

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

Способ 1. Использование событий «ПриВыводеСтроки» и «ПриПолученииДанных» (Обычные формы)

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

Рассмотрим реализацию через событие ПриВыводеСтроки:


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

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


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

Способ 2. Разделение на отображаемую строку и скрытую ссылку (Управляемые и обычные формы)

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

Разберем по шагам логику синхронизации данных:

  1. В табличной части создаем невидимую колонку ДокументСсылка и видимую строковую колонку ПредставлениеДокумента.
  2. Для поля ПредставлениеДокумента включаем кнопку выбора (свойство КнопкаВыбора = Истина) и кнопку открытия.
  3. При открытии формы или заполнении таблицы генерируем текстовые представления.
  4. Переопределяем обработчики выбора и открытия для ячейки представления.

Посмотрим на пример кода обработки событий ячейки:


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

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

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

Способ 3. Формирование представления в запросе (Динамические списки)

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


ВЫБРАТЬ
    ДокументТаблица.Ссылка КАК ДокументСсылка,
    ДокументТаблица.Номер + " от " + ФОРМАТ(ДокументТаблица.Дата, "ДФ=dd.MM.yyyy") КАК ДокументПредставление
ИЗ
    Документ.ГТДПоИмпорту КАК ДокументТаблица

Выводим в список поле ДокументПредставление, сохраняя при этом возможность оперировать полем ДокументСсылка в логике формы.

← На главную