Как изменить стандартное отображение ссылки в поле ввода 1С?

Программист 1С v8.3 (Управляемые формы)
← На главную

При разработке конфигураций на платформе 1С:Предприятие часто возникает задача изменить стандартное представление объекта (ссылки). По умолчанию система формирует строку вида "Заказ покупателя ТК000000013 от 15.02.2006", однако для удобства пользователей в поле ввода может потребоваться вывести дополнительную информацию: контрагента, сумму документа, статус или артикул номенклатуры. Разберем подробно все доступные способы решения этой задачи, начиная от глобальных механизмов платформы 8.3 и заканчивая локальными "хитростями" для конкретных форм.

Метод 1: Переопределение представления в модуле менеджера

Начиная с версии платформы 8.3, разработчикам стал доступен наиболее элегантный и правильный способ управления текстовым описанием объектов — использование событий модуля менеджера. Этот метод является глобальным: изменив логику в одном месте, мы получим обновленное представление во всей системе: в полях ввода, динамических списках, отчетах и заголовках форм.

Для реализации этого метода нам потребуется поработать с двумя процедурами в модуле менеджера объекта (например, документа ЗаказПокупателя или справочника Номенклатура).

1. ОбработкаПолученияПолейПредставления

Проанализируем работу этой процедуры. Ее главная задача — сообщить системе, какие именно данные (поля) нам понадобятся из базы данных для формирования строки. Если проигнорировать этот шаг, система будет выполнять дополнительные запросы к БД для каждой ссылки, что приведет к существенным задержкам при открытии списков.


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

2. ОбработкаПолученияПредставления

Здесь происходит сама "магия" формирования текста. В параметр Данные попадает структура с полями, которые мы запросили в предыдущей процедуре. Рассмотрим пример формирования строки заказа, как просил автор темы:


Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
    
    // Отключаем стандартное поведение
    СтандартнаяОбработка = Ложь;
    
    // Формируем произвольную строку
    ТекстПредставления = Строка(Данные.Номер) + " от " + Формат(Данные.Дата, "ДФ=dd.MM.yyyy") + "; ";
    ТекстПредставления = ТекстПредставления + "Покупатель: " + Строка(Данные.Контрагент) + "; ";
    ТекстПредставления = ТекстПредставления + "Сумма: " + Формат(Данные.СуммаДокумента, "ЧЦ=15; ЧДЦ=2");
    
    // Присваиваем результат
    Представление = ТекстПредставления;
    
КонецПроцедуры

Важно помнить, что этот метод влияет на всю систему. Если вам нужно изменить текст только в одном поле ввода, перейдем к локальным способам.

Метод 2: Использование составного типа данных (Реквизит "Ссылка + Строка")

Этот метод был предложен в обсуждении как альтернатива для тех случаев, когда не хочется менять модуль менеджера. Идея заключается в том, чтобы сделать реквизит документа или формы составным типом, включив в него тип Строка и нужный ссылочный тип (например, ДокументСсылка.ЗаказПокупателя).

Разберем алгоритм реализации этого подхода:

  1. В свойствах реквизита выбираем два типа: Ссылка и Строка.
  2. На форме для поля ввода устанавливаем режим выбора из списка или программно перехватываем момент окончания выбора.
  3. После того как пользователь выбрал объект, мы программно формируем нужную нам строку и присваиваем ее этому реквизиту, но фактически храним там строковое значение.

Внимание: У этого метода есть существенный минус — при записи в базу данных в реквизит попадет строка, а не ссылка. Если вам нужно сохранять именно ссылку, этот метод пригоден только для рекзитов формы, которые используются исключительно для отображения, но не для хранения данных в БД.

Метод 3: Локальная подмена через события "АвтоПодбор" и "ОкончаниеВводаТекста"

Если нам нужно оставить системное представление неизменным, но в конкретном поле ввода на определенной форме показывать расширенную информацию, мы можем использовать программное управление списком выбора. Рассмотрим, как это реализовать на управляемых формах.

Проанализируем ситуацию: когда пользователь начинает вводить текст в поле, срабатывает событие АвтоПодбор. Мы можем сформировать свой список значений, где в поле Значение будет лежать реальная ссылка, а в поле Представление — наш кастомный текст.


&НаКлиенте
Процедура ЗаказАвтоПодбор(Элемент, Текст, ДанныеВыбора, Параметры, Ожидание, СтандартнаяОбработка)
    
    // Мы можем сами сформировать список выбора через запрос
    // или дополнить стандартный список.
    // Если мы хотим полностью свое представление:
    СтандартнаяОбработка = Ложь;
    
    ДанныеВыбора = ПолучитьСписокЗаказовДляПредставления(Текст);
    
КонецПроцедуры

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

Метод 4: Условное оформление формы (для списков и табличных частей)

Часто требуется изменить отображение ссылки не в одиночном поле ввода, а в колонке таблицы. В этом случае программировать модуль менеджера не обязательно — можно воспользоваться механизмом Условного оформления.

Выясним, как это работает:

  1. Переходим в свойства формы, вкладка "Условное оформление".
  2. Добавляем новый элемент оформления.
  3. В поле "Оформление" выбираем параметр "Текст".
  4. В качестве значения текста мы можем указать поле другого реквизита или вычислить его.
  5. В "Оформляемых полях" указываем нашу колонку со ссылкой.

Этот способ хорош тем, что он работает на уровне платформенного визуализатора. Физически в ячейке остается ссылка (по ней можно кликнуть, открыть объект), но пользователь видит ту строку, которую мы настроили. Это идеально подходит для динамических списков, где нужно вывести, например, статус заказа прямо в поле с его номером.

Метод 5: Выражение представления в СКД (для отчетов)

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

Рассмотрим пример. В схеме компоновки на закладке "Наборы данных" выберите поле Заказ. В колонке "Выражение представления" напишите:

Номер + " от " + Формат(Дата, "ДФ=dd.MM.yyyy") + " [ " + Контрагент.Наименование + " ]"

Теперь в отчете ссылка всегда будет выводиться именно в таком формате, при этом возможность расшифровки (перехода к документу) сохранится в полном объеме.

Резюме и рекомендации

Выбор метода зависит от масштаба задачи:

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

← На главную