При разработке в среде 1С:Предприятие 8.3 программисты часто сталкиваются с задачей кастомизации интерфейса под конкретные требования пользователей. Одной из классических задач является изменение отображения (представления) ссылочного реквизита на форме. Например, когда в одном документе или справочнике ссылку на контрагента нужно показывать стандартно (по наименованию), а в другом — в виде связки «ИНН + Наименование» или по коду.
Стандартный механизм платформы предлагает использовать модуль менеджера прикладного объекта и переопределять процедуру ОбработкаПолученияПредставления. Однако этот метод работает глобально для всей конфигурации. Попытки обойти это ограничение через параметры сеанса или глобальные переменные приводят к критическим ошибкам: платформа кэширует представления ссылок как на сервере, так и на клиенте. В результате измененное представление может непредсказуемо «всплыть» в других отчетах, списках или документах текущего сеанса пользователя.
Выясним причину этой проблемы и разберем по шагам несколько надежных, проверенных временем способов решения этой задачи на управляемых формах 1С 8.3 без изменения глобального представления.
Этот метод считается наиболее гибким и профессиональным. Мы полностью заменяем стандартное поле ввода на строковый реквизит формы, перехватываем события выбора и программно управляем отображаемым текстом.
Рассмотрим подробнее реализацию этого метода на конкретном примере. Предположим, у нас есть документ, на форму которого вынесен реквизит Договор (ссылка на справочник Договоры контрагентов). Мы хотим, чтобы на этой форме договор отображался в формате «Договор № [Номер] от [Дата]», в то время как во всей остальной базе он должен выводиться стандартно по наименованию.
Выполним следующие шаги для настройки формы:
Строка и назовем его, например, ДоговорПредставление. Длину строки зададим с запасом (например, 150-200 символов).Объект.Договор уберем с формы или снимем у него флаг Видимость.ДоговорПредставление в свойствах установим флаги: КнопкаВыбора = Истина, КнопкаОчистки = Истина, ТолькоПросмотр = Истина (чтобы пользователь не мог вручную редактировать текст, но мог нажимать на кнопки управления).Гиперссылка = Истина.Теперь перейдем к написанию программного кода в модуле формы. Разберем по шагам, какие обработчики событий нам понадобятся.
Во-первых, при открытии формы нам необходимо инициализировать наше строковое представление текущим значением из объекта. Для этого пропишем код в событии ПриСозданииНаСервере:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Инициализируем строковое представление при открытии
Если ЗначениеЗаполнено(Объект.Договор) Тогда
ДоговорПредставление = ПолучитьАльтернативноеПредставлениеДоговора(Объект.Договор);
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьАльтернативноеПредставлениеДоговора(СсылкаНаДоговор)
// Получаем нужные реквизиты через запрос для оптимальной производительности
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДоговорыКонтрагентов.Номер КАК Номер,
| ДоговорыКонтрагентов.Дата КАК Дата,
| ДоговорыКонтрагентов.Наименование КАК Наименование
|ИЗ
| Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
|ГДЕ
| ДоговорыКонтрагентов.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", СсылкаНаДоговор);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат "Договор № " + Выборка.Номер + " от " + Формат(Выборка.Дата, "ДЛФ=D");
КонецЕсли;
Возврат "";
КонецФункции
Во-вторых, нам нужно перехватить нажатие кнопки выбора у нашего строкового поля, чтобы открыть стандартную форму выбора справочника договоров. Для этого создадим обработчик события НачалоВыбора для поля ДоговорПредставление:
&НаКлиенте
Процедура ДоговорПредставлениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
// Отключаем стандартный выбор платформы для строки
СтандартнаяОбработка = Ложь;
// Настраиваем параметры открытия формы выбора
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ТекущаяСтрока", Объект.Договор);
// Открываем форму выбора справочника договоров с владельцем - текущим элементом формы
ОткрытьФорму("Справочник.ДоговорыКонтрагентов.ФормаВыбора", ПараметрыФормы, Элемент);
КонецПроцедуры
В-третьих, обработаем выбор значения пользователем. Для этого создадим обработчик события ОбработкаВыбора у элемента формы ДоговорПредставление:
&НаКлиенте
Процедура ДоговорПредставлениеОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
// Если пользователь закрыл форму без выбора, ничего не делаем
Если Не ЗначениеЗаполнено(ВыбранноеЗначение) Тогда
Возврат;
КонецЕсли;
// Записываем реальную ссылку в реквизит объекта
Объект.Договор = ВыбранноеЗначение;
// Получаем и устанавливаем новое представление на форме
ДоговорПредставление = ПолучитьАльтернативноеПредставлениеДоговора(ВыбранноеЗначение);
КонецПроцедуры
В-четвертых, обеспечим корректную очистку поля при нажатии на крестик. Создадим обработчик события Очистка:
&НаКлиенте
Процедура ДоговорПредставлениеОчистка(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Объект.Договор = ПредопределенноеЗначение("Справочник.ДоговорыКонтрагентов.ПустаяСсылка");
ДоговорПредставление = "";
КонецПроцедуры
И, наконец, добавим возможность открытия карточки договора по клику на наше строковое поле (так как мы включили свойство Гиперссылка). Создадим обработчик события Нажатие:
&НаКлиенте
Процедура ДоговорПредставлениеНажатие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если ЗначениеЗаполнено(Объект.Договор) Тогда
// Программное открытие карточки объекта
ПоказатьЗначение(, Объект.Договор);
КонецЕсли;
КонецПроцедуры
Проанализируем ситуацию, когда писать много программного кода не хочется или требуется максимально быстро настроить интерфейс (подход Low-code). В платформе 1С 8.3 существует изящный визуальный трюк, который позволяет обойтись практически без кода на встроенном языке.
Суть метода заключается в том, что мы разделяем отображение информации и интерактивные кнопки управления на два разных элемента формы, но визуально объединяем их в одну строчку.
Выполним настройку по шагам:
Группа колонок или обычная Группа - Горизонтальная. Отключим у этой группы отображение заголовка и границ (свойства ОтображениеУправления и ОтображатьЗаголовок установим в значение Ложь).Объект -> Договор, найдем там нужный нам текстовый реквизит (например, Номер или Описание) и перетащим его в нашу группу. Назовем этот элемент, например, ПолеТекстаПредставления.ПолеТекстаПредставления установим ТолькоПросмотр = Истина. Это поле будет автоматически и мгновенно обновляться самой платформой 1С при любом изменении ссылки в объекте, причем абсолютно без кода!Объект.Договор.Объект.Договор отключаем отображение текста. Для этого установим ширину поля равной 1 или 2 (минимально возможная), снимем флаг отображения заголовка. При этом свойства КнопкаВыбора и КнопкаОчистки оставляем включенными (равными Истина).Посмотрим на результат наших настроек. Для конечного пользователя это выглядит как единое поле ввода: слева выводится красивое альтернативное текстовое значение (взятое напрямую «через точку» из связанного справочника), а справа аккуратно расположены стандартные кнопки выбора («...») и очистки («Х»). При нажатии на кнопку выбора открывается стандартный диалог, пользователь выбирает значение, ссылка в Объект.Договор обновляется, и платформа автоматически перерисовывает текстовое поле слева.
Рассмотрим ситуацию, когда альтернативное представление ссылки требуется настроить не в одиночном поле ввода на форме, а в колонке динамического списка или в табличной части документа. Писать код для каждой строки таблицы — крайне неоптимальное решение, которое сильно замедлит работу интерфейса.
В этом случае на помощь приходит встроенный механизм управляемых форм — Условное Оформление. Разберем, как его настроить:
Условное оформление (или программно обратимся к свойству УсловноеОформление формы на сервере).Текст. Нажмем на кнопку выбора. Важно: вместо ввода статичного текста мы можем нажать на кнопку выбора типа данных и выбрать Поле компоновки данных. Укажем путь к нужному реквизиту «через точку» (например, Объект.Товары.Номенклатура.Артикул).Номенклатура в табличной части).Платформа 1С 8.3 при выводе строк таблицы будет автоматически подменять отображаемый текст ссылки на значение выбранного нами поля. Этот метод работает молниеносно, так как выполняется на уровне платформенных алгоритмов отображения данных. Для быстрой генерации таких настроек в программном коде можно использовать конструктор кода условного оформления для табличных частей.
Если вам требуется задать условное оформление программно (например, при создании формы), используйте следующий пример кода:
&НаСервере
Процедура НастроитьУсловноеОформлениеНаСервере()
// Создаем новое правило оформления
ЭлементОформления = УсловноеОформление.Элементы.Добавить();
// Настраиваем оформляемое поле (колонку таблицы)
ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ТоварыНоменклатура");
ПолеОформления.Использование = Истина;
// Задаем параметр оформления "Текст" через связь с другим полем компоновки
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Текст", Новый ПолеКомпоновкиДанных("Объект.Товары.Номенклатура.Артикул"));
КонецПроцедуры
Подводя итоги нашего анализа, сопоставим рассмотренные подходы, чтобы вы могли выбрать наиболее подходящий под ваши задачи:
Используя эти паттерны проектирования интерфейса, вы сможете делать управляемые формы в 1С 8.3 максимально удобными для пользователей, сохраняя при этом чистоту архитектуры и стабильность работы глобального кэша представлений ссылок вашей конфигурации.