При разработке конфигураций на платформе 1С:Предприятие часто возникает задача изменить стандартное представление объекта (ссылки). По умолчанию система формирует строку вида "Заказ покупателя ТК000000013 от 15.02.2006", однако для удобства пользователей в поле ввода может потребоваться вывести дополнительную информацию: контрагента, сумму документа, статус или артикул номенклатуры. Разберем подробно все доступные способы решения этой задачи, начиная от глобальных механизмов платформы 8.3 и заканчивая локальными "хитростями" для конкретных форм.
Начиная с версии платформы 8.3, разработчикам стал доступен наиболее элегантный и правильный способ управления текстовым описанием объектов — использование событий модуля менеджера. Этот метод является глобальным: изменив логику в одном месте, мы получим обновленное представление во всей системе: в полях ввода, динамических списках, отчетах и заголовках форм.
Для реализации этого метода нам потребуется поработать с двумя процедурами в модуле менеджера объекта (например, документа ЗаказПокупателя или справочника Номенклатура).
1. ОбработкаПолученияПолейПредставления
Проанализируем работу этой процедуры. Ее главная задача — сообщить системе, какие именно данные (поля) нам понадобятся из базы данных для формирования строки. Если проигнорировать этот шаг, система будет выполнять дополнительные запросы к БД для каждой ссылки, что приведет к существенным задержкам при открытии списков.
Процедура ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка)
// Добавляем поля, которые хотим видеть в представлении
Поля.Добавить("Номер");
Поля.Добавить("Дата");
Поля.Добавить("Контрагент");
Поля.Добавить("СуммаДокумента");
// Отключаем стандартную генерацию полей
СтандартнаяОбработка = Ложь;
КонецПроцедуры
2. ОбработкаПолученияПредставления
Здесь происходит сама "магия" формирования текста. В параметр Данные попадает структура с полями, которые мы запросили в предыдущей процедуре. Рассмотрим пример формирования строки заказа, как просил автор темы:
Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
// Отключаем стандартное поведение
СтандартнаяОбработка = Ложь;
// Формируем произвольную строку
ТекстПредставления = Строка(Данные.Номер) + " от " + Формат(Данные.Дата, "ДФ=dd.MM.yyyy") + "; ";
ТекстПредставления = ТекстПредставления + "Покупатель: " + Строка(Данные.Контрагент) + "; ";
ТекстПредставления = ТекстПредставления + "Сумма: " + Формат(Данные.СуммаДокумента, "ЧЦ=15; ЧДЦ=2");
// Присваиваем результат
Представление = ТекстПредставления;
КонецПроцедуры
Важно помнить, что этот метод влияет на всю систему. Если вам нужно изменить текст только в одном поле ввода, перейдем к локальным способам.
Этот метод был предложен в обсуждении как альтернатива для тех случаев, когда не хочется менять модуль менеджера. Идея заключается в том, чтобы сделать реквизит документа или формы составным типом, включив в него тип Строка и нужный ссылочный тип (например, ДокументСсылка.ЗаказПокупателя).
Разберем алгоритм реализации этого подхода:
Внимание: У этого метода есть существенный минус — при записи в базу данных в реквизит попадет строка, а не ссылка. Если вам нужно сохранять именно ссылку, этот метод пригоден только для рекзитов формы, которые используются исключительно для отображения, но не для хранения данных в БД.
Если нам нужно оставить системное представление неизменным, но в конкретном поле ввода на определенной форме показывать расширенную информацию, мы можем использовать программное управление списком выбора. Рассмотрим, как это реализовать на управляемых формах.
Проанализируем ситуацию: когда пользователь начинает вводить текст в поле, срабатывает событие АвтоПодбор. Мы можем сформировать свой список значений, где в поле Значение будет лежать реальная ссылка, а в поле Представление — наш кастомный текст.
&НаКлиенте
Процедура ЗаказАвтоПодбор(Элемент, Текст, ДанныеВыбора, Параметры, Ожидание, СтандартнаяОбработка)
// Мы можем сами сформировать список выбора через запрос
// или дополнить стандартный список.
// Если мы хотим полностью свое представление:
СтандартнаяОбработка = Ложь;
ДанныеВыбора = ПолучитьСписокЗаказовДляПредставления(Текст);
КонецПроцедуры
В серверной функции ПолучитьСписокЗаказовДляПредставления мы создаем СписокЗначений, где для каждого найденного заказа задаем Представление в нужном нам формате. В итоге в поле ввода пользователь увидит "ТК000000013; Покупатель: Пирожков", но при выборе система запишет в реквизит полноценную ссылку.
Часто требуется изменить отображение ссылки не в одиночном поле ввода, а в колонке таблицы. В этом случае программировать модуль менеджера не обязательно — можно воспользоваться механизмом Условного оформления.
Выясним, как это работает:
Этот способ хорош тем, что он работает на уровне платформенного визуализатора. Физически в ячейке остается ссылка (по ней можно кликнуть, открыть объект), но пользователь видит ту строку, которую мы настроили. Это идеально подходит для динамических списков, где нужно вывести, например, статус заказа прямо в поле с его номером.
Если ваша задача — изменить представление ссылки только в отчетах, забудьте про модуль менеджера. В Системе Компоновки Данных (СКД) у каждого поля есть свойство "Выражение представления".
Рассмотрим пример. В схеме компоновки на закладке "Наборы данных" выберите поле Заказ. В колонке "Выражение представления" напишите:
Номер + " от " + Формат(Дата, "ДФ=dd.MM.yyyy") + " [ " + Контрагент.Наименование + " ]"
Теперь в отчете ссылка всегда будет выводиться именно в таком формате, при этом возможность расшифровки (перехода к документу) сохранится в полном объеме.
Выбор метода зависит от масштаба задачи:
ОбработкаПолученияПредставления в модуле менеджера. Это современный стандарт разработки на 1С 8.3.АвтоПодбор или создаем дополнительный строковый реквизит, который "прикрывает" основное поле (метод для обычных форм 8.2).Проанализировав все варианты, можно сделать вывод, что наиболее гибким является первый метод, так как он обеспечивает единообразие интерфейса и минимизирует дублирование кода в разных частях конфигурации.