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

17.09.20

Разработка - Работа с интерфейсом

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

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

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

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

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

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

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

До:

Решение:

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

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

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

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

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

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

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

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

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

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

Результат:

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

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

 

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

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

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

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

До:

Решение:

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

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

Результат:

 

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

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

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

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

До:

 

Решение:

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

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

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

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

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

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

Результат:

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

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

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

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

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

До:

Решение:

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

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


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

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

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

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

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

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

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

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

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

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

Результат:

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

См. также

Богатый редактор картинок, хранимых в базе, с возможностью РИСОВАНИЯ. Редактор внешних файлов картинок. Объект, расширяющий возможности работы с картинками из встроенного языка (Три в одном) + Обработка «Стандартизация картинок»

Работа с интерфейсом Рабочее место Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Обработка предназначена для редактирования картинок в режиме «Предприятие», с возможностью РИСОВАТЬ на них. Поддерживается работа как в обычных формах (толстый клиент) так и на управляемых формах (тонкий клиент). Обработка позволяет редактировать как картинки, хранимые в базе, так и графические файлы с диска на файловой системе. Помимо базовых функций (изменение размеров, преобразование формата, обрезание картинки, повороты и т.п.) – редактор имеет богатый набор инструментов для рисования. Доступна функция вставки изображения из буфера обмена. Также обработка может быть использована из встроенного языка как объект для редактирования картинок. Объект может быть использован: на стороне клиента, на стороне сервера, из внешнего соединения. Данная обработка будет особенно полезна тем, кто вносит картинки в базу (изображения номенклатуры, фотографии физических лиц и т.п.). Функционал реализуется с использованием JavaScript и бесплатного ПО ImageMagick (без использования внешних компонент).

6000 руб.

16.01.2015    61706    43    59    

80

[Расширения] Динамическое управление видимостью и доступностью элементов форм (УФ) (8.3.6+)

Работа с интерфейсом Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Механизм «Динамическое управление доступом к элементам форм объектов 1С8» предназначен для обеспечения возможности оперативного управления видимостью и доступностью элементов форм документов и справочников продуктов фирмы «1С» «1С:Предприятие 8». Решение универсальное, встраивается в любую конфигурацию с минимальными доработками, что позволяет без проблем обновлять типовые решения.

5000 руб.

14.01.2016    54320    16    21    

42

Управление дашбордами

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Обработка предназначена для создания и управления дашбордами.

2400 руб.

29.06.2020    16625    21    4    

35

Новогоднее оформление для 1С

Работа с интерфейсом Платформа 1С v8.3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 Бесплатно (free)

Добавьте новогоднего настроения! Расширение создает декорацию в виде гирлянды на некоторых формах объектов.

27.12.2023    10565    745    elcoan    45    

106

Конструктор HTML, CSS и javascript

Инструментарий разработчика Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

2 стартмани

10.04.2023    9486    150    acces969    31    

115

Модель состояния для MVC

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.

1 стартмани

05.07.2022    3581    kalyaka    2    

27

Табло очереди заказов на экран телевизора

WEB-интеграция Работа с интерфейсом Платформа 1С v8.3 1С:Розница 2 Платные (руб)

Связка из веб-приложения и расширения для 1С: Розница 2.3.

3600 руб.

29.04.2022    12013    1    5    

10
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Maddream 17.09.20 12:06 Сейчас в теме
Надеюсь, что статья окажется хоть кому-нибудь полезной

Оказалась, спасибо :)
ILEO_911; Ali_q; dim9; serge-ce1; Рамзес; portwein; Jeka44; sam441; DimaKors; +9 Ответить
2. Evg-Lylyk 4547 17.09.20 12:34 Сейчас в теме
(0) Хорошая статья
Разработка близкая по теме
DimaKors; +1 Ответить
6. sam441 211 17.09.20 16:16 Сейчас в теме
3. ComboBoy 15 17.09.20 13:53 Сейчас в теме
4. Yashazz 4707 17.09.20 15:55 Сейчас в теме
Хороший обзор для новичков.
Потому как, кроме ссылочного значения, есть ещё множество занимательного. Начиная от UID'ов и перечислений, системных переменных, и заканчивая сложными ключами или битыми/кривыми ссылками. И кроме юзерского интерфейса, есть ещё всякое, вроде ЖР или ТЖ. Вот там в смысле представления - множество интересных нюансов. Там и языковые настройки, и платформенные cfg-файлы, и релиз влияет, и вообще. Было б время и силы - написал бы. Но новичкам и того, что в статье, за глаза достаточно)
5. sam441 211 17.09.20 16:16 Сейчас в теме
(4)Благодарю за развёрнутый комментарий! По поводу того, о чем Вы говорите, то если найдёте время, то обязательно пишите, я думаю данный материал будет многим интересен)
7. u_n_k_n_o_w_n 34 17.09.20 16:34 Сейчас в теме
Статья для тех, кто хочет знать обо всем по немногу.
9. Cmapnep 18 18.09.20 10:49 Сейчас в теме
Спасибо за систематизацию - будет куда заглянуть когда начнутся проблемы с памятью)

По последнему кейсу - я правильно понимаю, что у вас там два запроса в цикле по каждой строке ТЧ (для Номер и Дата) да еще и через точку?
Как-то это совсем не оптимально. Может перепишите на один запрос без цикла, чтобы не учить новичков плохому?
10. sam441 211 18.09.20 12:47 Сейчас в теме
(9)Да вы правы, там будет запрос в цикле, но т.к. писалось в первую очередь для новичков, то решил не усложнять, все-таки статья не про оптимизацию, но возможно и перепишу, как найду время.
11. sam441 211 18.09.20 14:13 Сейчас в теме
12. Cmapnep 18 18.09.20 14:46 Сейчас в теме
13. tjurikov_ivan 213 18.09.20 15:30 Сейчас в теме
Я бы дополнил кейс №3.
Заказчик может быть и хочет в наименовании, но мы же можем не говорить ему о том как это реализовано.
Если не принципиально выводить в (скобках) то можно сделать следующим образом. (в моём примере номенклатура и ее код)
Через "Изменить форму" добавляем реквизит код, отключаем у колонки свойство отображать заголовок , добавляем группу колонок, у группы ставим группировка = в ячейке.
Теперь у нас в одной колонке отображается Номенклатура и код через запятую, быстро и без правок в конфигураторе.
Прикрепленные файлы:
dammit666; u_n_k_n_o_w_n; sam441; triviumfan; Рамзес; +5 Ответить
14. sam441 211 22.09.20 12:11 Сейчас в теме
(13)Благодарю, дополнил статью.
15. пользователь 23.09.20 10:39
Сообщение было скрыто модератором.
...
16. chuff 24.09.20 05:20 Сейчас в теме
17. IKS_T 27.03.23 08:42 Сейчас в теме
18. Rabin 49 19.09.23 13:37 Сейчас в теме
Помогла ваша статья, спасибо! (Кейс 4)
19. user1336416 23.11.23 20:36 Сейчас в теме
это просто вау. спасибо!
Оставьте свое сообщение