Каталог решений - Переопределение представления ссылочного значения

Переопределение представления ссылочного значения

Переопределение представления ссылочного значения

В наличии

Переопределение представления ссылочного значения

Категория:

Описание

Приветствую, коллеги! Хочу сразу оговориться данная статья не претендует на оригинальность и написана в первую очередь для новичков (либо кто подзабыл), в которой я хотел бы наиболее подробно описать все способы решения такой задачи, как переопределение представления ссылочного значения. Естественно речь идет об управляемых формах (не знаю насколько об этом уместно говорить в 2020), я такой статьи на ИС не нашел (может плохо искал) и решил восполнить данный пробел.

Итак, постараюсь разбить способы реализации в формате кейсов:

Кейс 1 "Переопределение представления в рамках всей БД"

Заказчик: — Сделайте, чтобы валюта выводилась вместе с кодом

Программист: — Везде? Во всех списках, формах и т.д.?

Заказчик: — Да!

До:

Решение:

Данный способ изменяет представление ссылки абсолютно везде, где отображается наша ссылка т.е. действует в рамках всей БД.

Представление объекта по умолчанию настраивается на вкладке "Данные", раздел "Основное представление".

По умолчанию как мы видим, мы можем выбрать только Код или Наименование.

Открываем МодульМенеджера и создаем в нем процедуры ОбработкаПолученияПредставления

Если открыть отладку то мы увидим примерно следующую картину:

Переменная Данные представляет собой структуру, в которой находится Ссылка на объект и Поле основного представления.

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

В итоге весь модуль будет выглядеть примерно так:

Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	Представление = СтрШаблон("%1 (%2)", Данные.Наименование, Данные.Код);
	
КонецПроцедуры

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

Результат:

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

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

 

Кейс 2 "Переопределение представления в отчетах на СКД"

Заказчик: — Напишите вместо "Расход товара" — "Накладная" и время уберите у документа, оно мне не нужно

Программист: — Только в этом отчете?

Заказчик: — Да!

До:

Решение:

В случае СКД разработчику предоставляются огромные возможности по оформлению полей и в данном случае все решается буквально одной настройкой. В схеме для необходимого поля используем настройку "Выражение представления":

Указываем выражение: "Накладная " + Регистратор.Номер + " от " + Формат(Регистратор.Дата, "ДФ=dd.MM.yyyy")

Результат:

 

Кейс 3 "Переопределение представления в динамическом списке"

Заказчик: — Сделайте, чтобы в списке документов в наименовании склада в скобках отображался Регион

Программист: — Может Вам лучше сделать отдельную колонку?

Заказчик: — Нет, хочу в наименовании!

До:

 

Решение:

Установим произвольный запрос динамического списка и дополним полем "Регион":

Всем известно, что 1С оптимизирует получение данных и исключает из запроса поля по отсутствующим колонкам, поэтому у поле Регион установим флаг "Использовать всегда":

Создадим процедуру СписокПриПолученииДанныхНаСервере

Из справки: Обработчик события вызывается на сервере после получения данных динамическим списком, доступен, начиная с версии 8.3.10.

И пропишем туда примерное такой код:

&НаСервереБезКонтекста
Процедура СписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки)
	
    Для Каждого Стр Из Строки Цикл
       ОформлениеЯчейки = Стр.Значение.Оформление["Склад"];
       ОформлениеЯчейки.УстановитьЗначениеПараметра("Текст", СтрШаблон("%1 (%2)", Стр.Значение.Данные.Склад, Стр.Значение.Данные.Регион));
    КонецЦикла;	
	
КонецПроцедуры

Результат:

Дополнение от tjurikov_ivan:

Если не принципиально выводить в (скобках) то можно сделать следующим образом. (в моём примере номенклатура и ее код)
Через "Изменить форму" добавляем реквизит код, отключаем у колонки свойство отображать заголовок , добавляем группу колонок, у группы ставим группировка = в ячейке.
Теперь у нас в одной колонке отображается Номенклатура и код через запятую, быстро и без правок в конфигураторе.

Кейс 4 "Переопределение представления в таблице с источником данных табличная часть, таблица значений, дерево значений"

Заказчик: — Уберите из колонки "Счет" наименование документа и так же понятно, что это счет, оставьте только номер и дату

Программист: — Не вопрос

До:

Решение:

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

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	ОбновитьПредставлениеСчетов();
		
КонецПроцедуры

&НаСервере
Процедура ОбновитьПредставлениеСчетов()

	Массив = Объект.Товары.Выгрузить(,"Счет").ВыгрузитьКолонку("Счет");
	Соответствие = ПолучитьСоответствиеПредставлений(Массив);
	
	Для Каждого Стр Из Объект.Товары Цикл
		Стр.СчетПредставление = Соответствие[Стр.Счет];
	КонецЦикла;	

КонецПроцедуры // ОбновитьПредставлениеСчетов()

&НаСервереБезКонтекста
Функция ПолучитьСоответствиеПредставлений(Ссылка)

	Соответствие = Новый Соответствие;
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	Счет.Номер КАК Номер,
		|	Счет.Дата КАК Дата,
		|	Счет.Ссылка КАК Ссылка
		|ИЗ
		|	Документ.Счет КАК Счет
		|ГДЕ
		|	Счет.Ссылка В(&Ссылка)";
	
	Запрос.УстановитьПараметр("Ссылка", Ссылка);
	РезультатЗапроса = Запрос.Выполнить();
	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		Соответствие.Вставить(ВыборкаДетальныеЗаписи.Ссылка, СтрШаблон("%1 от %2", ВыборкаДетальныеЗаписи.Номер, ВыборкаДетальныеЗаписи.Дата));
	КонецЦикла;
	
	Возврат Соответствие;

КонецФункции // ПолучитьСоответствиеПредставлений()

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

&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
	
	ОбновитьПредставлениеСчетов();
	
КонецПроцедуры

Наконец, настраиваем УсловноеОформление формы, примерно так:

Результат:

Надеюсь, что статья окажется хоть кому-нибудь полезной, всем спасибо за внимание!

has been added to your cart:
Оформление заказа