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