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

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

В процессе разработки на платформе 1С:Предприятие 8 (особенно при использовании Обычных форм) часто возникает задача изменить визуальное отображение значения в поле ввода. Стандартно платформа выводит основное представление объекта (обычно это поле Наименование или Код). Однако в бизнес-логике может потребоваться вывести сокращенное ФИО, дополнить название договора его датой или отобразить специфический артикул рядом с названием товара, при этом не меняя само наименование в справочнике.

В обычных формах, в отличие от управляемых, нет прямого свойства «ТекстРедактирования», поэтому нам придется использовать обходные пути или, как говорят разработчики, «костыли». В этой статье мы подробно разберем несколько проверенных методов: от простых манипуляций с экранными формами до использования возможностей модуля менеджера.

Метод 1. Использование двух полей ввода (визуальная подмена)

Это один из самых надежных способов, если нам нужно реализовать нестандартное поведение в конкретной форме документа или обработки. Суть метода заключается в разделении данных и их представления. Мы создаем на форме текстовое поле для пользователя, а реальную ссылку храним в скрытом реквизите.

Разберем по шагам алгоритм реализации:

  1. Создадим на форме строковый реквизит (например, ПредставлениеОбъекта) и разместим его в поле ввода.
  2. Создадим скрытый реквизит с типом нужной нам ссылки (например, СправочникСсылка.Контрагенты).
  3. Для строкового поля ввода включим свойство КнопкаВыбора.
  4. Напишем обработчик события НачалоВыбора для строкового поля.

Рассмотрим пример кода, который открывает форму выбора и формирует краткое представление:


Процедура ПолеПредставленияНачалоВыбора(Элемент, СтандартнаяОбработка)
    
    // Отключаем стандартный механизм, чтобы открыть форму выбора программно
    СтандартнаяОбработка = Ложь;
    
    // Вызываем форму выбора справочника модально (или через описание оповещения)
    РезультатВыбора = ОткрытьФормуМодально("Справочник.Сотрудники.ФормаВыбора");
    
    Если ЗначениеЗаполнено(РезультатВыбора) Тогда
        // Сохраняем реальную ссылку в скрытый реквизит объекта или формы
        Объект.Сотрудник = РезультатВыбора;
        
        // Формируем нужное нам представление (например, Фамилия И.О.)
        ФИО = Строка(РезультатВыбора); // "Иванов Иван Иванович"
        ЧастиФИО = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивСлов(ФИО);
        
        Если ЧастиФИО.Количество() >= 3 Тогда
            КраткоеФИО = ЧастиФИО[0] + " " + Лев(ЧастиФИО[1], 1) + "." + Лев(ЧастиФИО[2], 1) + ".";
            ПолеПредставления = КраткоеФИО;
        Иначе
            ПолеПредставления = ФИО;
        КонецЕсли;
    КонецЕсли;

КонецПроцедуры

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

Метод 2. Использование режима «Поле со списком»

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

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

Реализация через список значений:


Процедура СотрудникНачалоВыбора(Элемент, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    
    ВыбранноеЗначение = ОткрытьФормуМодально("Справочник.Сотрудники.ФормаВыбора");
    
    Если ЗначениеЗаполнено(ВыбранноеЗначение) Тогда
        // Очищаем текущий список выбора и добавляем туда один элемент
        Элемент.СписокВыбора.Очистить();
        
        // Формируем красивый текст
        ТекстПредставления = Лев(Строка(ВыбранноеЗначение), 10) + "..."; 
        
        // Добавляем ссылку с нужным нам текстом
        Элемент.СписокВыбора.Добавить(ВыбранноеЗначение, ТекстПредставления);
        
        // Устанавливаем значение в реквизит
        Сотрудник = ВыбранноеЗначение;
    КонецЕсли;
КонецПроцедуры

Важно: для корректной работы этого метода у поля ввода на форме должно быть установлено свойство РежимВыбораИзСписка = Истина.

Метод 3. Событие «ПриПолученииТекста» (для табличных частей)

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

Выясним причину популярности этого метода: он не меняет данные в базе, а лишь перехватывает момент отрисовки ячейки на экране. Это максимально производительно и «чисто» с точки зрения архитектуры.

Пример использования:


Процедура ТабличнаяЧастьПриПолученииТекста(Элемент, ОформлениеСтроки, ДанныеСтроки, Текст)
    
    // Проверяем наличие данных
    Если ДанныеСтроки = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    // Если в колонке ссылка на договор, добавим к ней дату
    Если ЗначениеЗаполнено(ДанныеСтроки.Договор) Тогда
        Текст = Строка(ДанныеСтроки.Договор) + " от " + Формат(ДанныеСтроки.Договор.Дата, "ДФ=dd.MM.yyyy");
    КонецЕсли;
    
КонецПроцедуры

Обратите внимание: параметр Текст является выходным. Записывая в него значение, вы определяете, что именно увидит пользователь в ячейке.

Метод 4. Глобальное изменение через модуль менеджера

Если вам нужно, чтобы измененное представление объекта отображалось во всей системе (во всех формах, отчетах и списках), следует использовать механизмы модуля менеджера. Этот функционал появился в поздних версиях платформы 8.2 и доступен в 8.3.

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

  1. ОбработкаПолученияПолейПредставления — здесь мы указываем, какие данные из БД нам нужны для формирования строки.
  2. ОбработкаПолученияПредставления — здесь мы формируем саму строку.

Пример кода в модуле менеджера:


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

Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    // Формируем строку вида: Иванов И. И.
    Инициалы = ?(ЗначениеЗаполнено(Данные.Имя), Лев(Данные.Имя, 1) + ".", "");
    Инициалы = Инициалы + ?(ЗначениеЗаполнено(Данные.Отчество), Лев(Данные.Отчество, 1) + ".", "");
    
    Представление = Данные.Фамилия + " " + Инициалы;
КонецПроцедуры

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

Метод 5. Графическая накладка (Label Overlay)

Существует специфический «хак» для Обычных форм, когда поверх стандартного поля ввода накладывается декоративный элемент Надпись. У надписи устанавливается прозрачный фон, а ее текст программно обновляется при изменении значения в поле под ней.

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

Резюме

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

Мы проанализировали основные подходы к кастомизации представления в 1С. Несмотря на то что Обычные формы считаются устаревшими, знание этих нюансов позволяет создавать удобные и профессиональные интерфейсы в legacy-системах.

← На главную