Приветствую, коллеги! Хочу сразу оговориться данная статья не претендует на оригинальность и написана в первую очередь для новичков (либо кто подзабыл), в которой я хотел бы наиболее подробно описать все способы решения такой задачи, как переопределение представления ссылочного значения. Естественно речь идет об управляемых формах (не знаю насколько об этом уместно говорить в 2020), я такой статьи на ИС не нашел (может плохо искал) и решил восполнить данный пробел.
Итак, постараюсь разбить способы реализации в формате кейсов:
Кейс 1 "Переопределение представления в рамках всей БД"
Заказчик: - Сделайте, чтобы валюта выводилась вместе с кодом
Программист: - Везде? Во всех списках, формах и т.д.?
Заказчик: - Да!
До:
Решение:
Данный способ изменяет представление ссылки абсолютно везде, где отображается наша ссылка т.е. действует в рамках всей БД.
Представление объекта по умолчанию настраивается на вкладке "Данные", раздел "Основное представление".
По умолчанию как мы видим, мы можем выбрать только Код или Наименование.
Открываем МодульМенеджера и создаем в нем процедуры ОбработкаПолученияПредставления
Если открыть отладку то мы увидим примерно следующую картину:
Переменная Данные представляет собой структуру, в которой находится Ссылка на объект и Поле основного представления.
Все, что нам необходимо сделать, это отключить стандартную обработку и сформировать необходимое представление. У нас уже есть значение реквизита Наименование, а Код мы можем вытянуть по ссылке, но подождите, так лучше не делать т.к. обращение к реквизиту через точку негативно сказывается на производительности, поэтому предварительно нам необходимо включить Код в поля представления. Для этого создаем процедуру ОбработкаПолученияПолейПредставления и добавляем необходимые поля.
В итоге весь модуль будет выглядеть примерно так:
Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Представление = СтрШаблон("%1 (%2)", Данные.Наименование, Данные.Код);
КонецПроцедуры
Процедура ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Поля.Добавить("Наименование");
Поля.Добавить("Код");
КонецПроцедуры
Результат:
И еще раз повторюсь, теперь ссылка на валюту будет отображаться так везде, и в списках, и в формах, и даже в запросе, при условии, что мы выбираем именно Представление:
Кстати для тех, кто дорабатывает типовые логичнее создать отдельную подписку на событие, где в качестве источника указать менеджер объекта и прописать соответствующие процедуры.
Кейс 2 "Переопределение представления в отчетах на СКД"
Заказчик: - Напишите вместо "Расход товара" - "Накладная" и время уберите у документа, оно мне не нужно
Программист: - Только в этом отчете?
Заказчик: - Да!
До:
Решение:
В случае СКД разработчику предоставляются огромные возможности по оформлению полей и в данном случае все решается буквально одной настройкой. В схеме для необходимого поля используем настройку "Выражение представления":
Указываем выражение: "Накладная " + Регистратор.Номер + " от " + Формат(Регистратор.Дата, "ДФ=dd.MM.yyyy")
Результат:
Кейс 3 "Переопределение представления в динамическом списке"
Заказчик: - Сделайте, чтобы в списке документов в наименовании склада в скобках отображался Регион
Программист: - Может Вам лучше сделать отдельную колонку?
Заказчик: - Нет, хочу в наименовании!
До:
Решение:
Установим произвольный запрос динамического списка и дополним полем "Регион":
Всем известно, что 1С оптимизирует получение данных и исключает из запроса поля по отсутствующим колонкам, поэтому у поле Регион установим флаг "Использовать всегда":
Создадим процедуру СписокПриПолученииДанныхНаСервере
Из справки: Обработчик события вызывается на сервере после получения данных динамическим списком, доступен, начиная с версии 8.3.10.
И пропишем туда примерное такой код:
&НаСервереБезКонтекста
Процедура СписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки)
Для Каждого Стр Из Строки Цикл
ОформлениеЯчейки = Стр.Значение.Оформление["Склад"];
ОформлениеЯчейки.УстановитьЗначениеПараметра("Текст", СтрШаблон("%1 (%2)", Стр.Значение.Данные.Склад, Стр.Значение.Данные.Регион));
КонецЦикла;
КонецПроцедуры
Результат:
Дополнение от tjurikov_ivan:
Если не принципиально выводить в (скобках) то можно сделать следующим образом. (в моём примере номенклатура и ее код)
Через "Изменить форму" добавляем реквизит код, отключаем у колонки свойство отображать заголовок , добавляем группу колонок, у группы ставим группировка = в ячейке.
Теперь у нас в одной колонке отображается Номенклатура и код через запятую, быстро и без правок в конфигураторе.
Кейс 4 "Переопределение представления в таблице с источником данных табличная часть, таблица значений, дерево значений"
Заказчик: - Уберите из колонки "Счет" наименование документа и так же понятно, что это счет, оставьте только номер и дату
Программист: - Не вопрос
До:
Решение:
Нам требуется сохранить всю функциональность (выбор, очистка и т.д.), поэтому добавим дополнительную колонку, назовем ее СчетПредставление с типом Строка:
Напишем код, который будет заполнять данную колонку, нужным нам представлением, необходимо отработать открытие существующего документа, а также событие изменения ссылки, в итоге имеем примерно следующий код:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ОбновитьПредставлениеСчетов();
КонецПроцедуры
&НаСервере
Процедура ОбновитьПредставлениеСчетов()
Массив = Объект.Товары.Выгрузить(,"Счет").ВыгрузитьКолонку("Счет");
Соответствие = ПолучитьСоответствиеПредставлений(Массив);
Для Каждого Стр Из Объект.Товары Цикл
Стр.СчетПредставление = Соответствие[Стр.Счет];
КонецЦикла;
КонецПроцедуры // ОбновитьПредставлениеСчетов()
&НаСервереБезКонтекста
Функция ПолучитьСоответствиеПредставлений(Ссылка)
Соответствие = Новый Соответствие;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Счет.Номер КАК Номер,
| Счет.Дата КАК Дата,
| Счет.Ссылка КАК Ссылка
|ИЗ
| Документ.Счет КАК Счет
|ГДЕ
| Счет.Ссылка В(&Ссылка)";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Соответствие.Вставить(ВыборкаДетальныеЗаписи.Ссылка, СтрШаблон("%1 от %2", ВыборкаДетальныеЗаписи.Номер, ВыборкаДетальныеЗаписи.Дата));
КонецЦикла;
Возврат Соответствие;
КонецФункции // ПолучитьСоответствиеПредставлений()
&НаКлиенте
Процедура ТоварыСчетПриИзменении(Элемент)
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено Тогда
Соответствие = ПолучитьСоответствиеПредставлений(ТекущиеДанные.Счет);
ТекущиеДанные.СчетПредставление = Соответствие[ТекущиеДанные.Счет];
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
ОбновитьПредставлениеСчетов();
КонецПроцедуры
Наконец, настраиваем УсловноеОформление формы, примерно так:
Результат:
Надеюсь, что статья окажется хоть кому-нибудь полезной, всем спасибо за внимание!