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

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

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

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

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

Способ 1. Программный метод: использование строкового реквизита формы

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

Рассмотрим подробнее реализацию этого метода на конкретном примере. Предположим, у нас есть документ, на форму которого вынесен реквизит Договор (ссылка на справочник Договоры контрагентов). Мы хотим, чтобы на этой форме договор отображался в формате «Договор № [Номер] от [Дата]», в то время как во всей остальной базе он должен выводиться стандартно по наименованию.

Выполним следующие шаги для настройки формы:

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

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

Во-первых, при открытии формы нам необходимо инициализировать наше строковое представление текущим значением из объекта. Для этого пропишем код в событии ПриСозданииНаСервере:


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

&НаСервереБезКонтекста
Функция ПолучитьАльтернативноеПредставлениеДоговора(СсылкаНаДоговор)
    
    // Получаем нужные реквизиты через запрос для оптимальной производительности
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	ДоговорыКонтрагентов.Номер КАК Номер,
        |	ДоговорыКонтрагентов.Дата КАК Дата,
        |	ДоговорыКонтрагентов.Наименование КАК Наименование
        |ИЗ
        |	Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
        |ГДЕ
        |	ДоговорыКонтрагентов.Ссылка = &Ссылка";
    
    Запрос.УстановитьПараметр("Ссылка", СсылкаНаДоговор);
    Выборка = Запрос.Выполнить().Выбрать();
    
    Если Выборка.Следующий() Тогда
        Возврат "Договор № " + Выборка.Номер + " от " + Формат(Выборка.Дата, "ДЛФ=D");
    КонецЕсли;
    
    Возврат "";
КонецФункции

Во-вторых, нам нужно перехватить нажатие кнопки выбора у нашего строкового поля, чтобы открыть стандартную форму выбора справочника договоров. Для этого создадим обработчик события НачалоВыбора для поля ДоговорПредставление:


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

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


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

В-четвертых, обеспечим корректную очистку поля при нажатии на крестик. Создадим обработчик события Очистка:


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

И, наконец, добавим возможность открытия карточки договора по клику на наше строковое поле (так как мы включили свойство Гиперссылка). Создадим обработчик события Нажатие:


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

Способ 2. Визуальный трюк: связка реквизита «через точку» и скрытого оригинального поля

Проанализируем ситуацию, когда писать много программного кода не хочется или требуется максимально быстро настроить интерфейс (подход Low-code). В платформе 1С 8.3 существует изящный визуальный трюк, который позволяет обойтись практически без кода на встроенном языке.

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

Выполним настройку по шагам:

  1. Добавим на управляемую форму новую группу элементов. Тип группы выберем Группа колонок или обычная Группа - Горизонтальная. Отключим у этой группы отображение заголовка и границ (свойства ОтображениеУправления и ОтображатьЗаголовок установим в значение Ложь).
  2. Внутрь созданной группы перетащим реквизит «через точку». Для этого в дереве реквизитов формы развернем путь Объект -> Договор, найдем там нужный нам текстовый реквизит (например, Номер или Описание) и перетащим его в нашу группу. Назовем этот элемент, например, ПолеТекстаПредставления.
  3. В свойствах элемента ПолеТекстаПредставления установим ТолькоПросмотр = Истина. Это поле будет автоматически и мгновенно обновляться самой платформой 1С при любом изменении ссылки в объекте, причем абсолютно без кода!
  4. Рядом в эту же горизонтальную группу поместим оригинальный реквизит Объект.Договор.
  5. Теперь применим главную хитрость позиционирования. У оригинального элемента Объект.Договор отключаем отображение текста. Для этого установим ширину поля равной 1 или 2 (минимально возможная), снимем флаг отображения заголовка. При этом свойства КнопкаВыбора и КнопкаОчистки оставляем включенными (равными Истина).
  6. В свойствах группы установим минимальные интервалы между элементами, чтобы они плотно прилегали друг к другу.

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

Способ 3. Переопределение текста через Условное Оформление (для таблиц и списков)

Рассмотрим ситуацию, когда альтернативное представление ссылки требуется настроить не в одиночном поле ввода на форме, а в колонке динамического списка или в табличной части документа. Писать код для каждой строки таблицы — крайне неоптимальное решение, которое сильно замедлит работу интерфейса.

В этом случае на помощь приходит встроенный механизм управляемых форм — Условное Оформление. Разберем, как его настроить:

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

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

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


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

Сравнение методов и рекомендации по выбору

Подводя итоги нашего анализа, сопоставим рассмотренные подходы, чтобы вы могли выбрать наиболее подходящий под ваши задачи:

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

← На главную