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

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

В процессе разработки прикладных решений на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с жесткими требованиями заказчиков к эргономике интерфейса. Типичная задача: в табличной части документа необходимо выводить не стандартное наименование элемента справочника (например, полное название страны «Российская Федерация»), а его сокращенный код (например, «RU» или «643»). При этом стандартный функционал поля ввода — кнопка выбора, кнопка очистки, автоподбор при вводе с клавиатуры и открытие карточки — должен полностью сохраниться для исходного реквизита-ссылки.

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

Почему стандартный метод «ОбработкаПолученияПредставления» не всегда применим?

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

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

Способ 1. Условное оформление с подменой параметра «Текст» (Рекомендуемый)

Этот способ является наиболее изящным и технологичным. Он позволяет использовать стандартный механизм платформы — Условное оформление — для визуальной подмены отображаемого значения, при этом сам элемент управления (поле ввода) остается привязанным к исходному ссылочному реквизиту.

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

Рассмотрим пошаговый алгоритм реализации этого метода:

  1. Создание вспомогательного реквизита на форме:

    Откроем редактор управляемой формы документа. В верхнем правом окне перейдем на вкладку «Реквизиты», развернем структуру нашей табличной части (например, Объект.Товары) и добавим новый реквизит формы. Назовем его КодСтраны (тип данных: Строка). Обратите внимание: мы добавляем реквизит именно на форму, а не в метаданные самого документа в конфигураторе. Это позволяет избежать замусоривания структуры базы данных ненужными реквизитами. Выносить созданную колонку на саму форму в виде элемента не требуется.

  2. Заполнение вспомогательного реквизита при загрузке данных:

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

    
    &НаСервере
    Процедура ПриЧтенииНаСервере(ТекущийОбъект)
        
        // Заполняем текстовое представление кода для каждой строки ТЧ
        Для Каждого СтрокаТЧ Из Объект.Товары Цикл
            СтрокаТЧ.КодСтраны = СтрокаТЧ.Страна.Код;
        КонецЦикла;
        
    КонецПроцедуры
    
  3. Актуализация данных при интерактивном изменении:

    Когда пользователь выбирает другую страну в строке таблицы, нам нужно динамически обновлять значение в нашем вспомогательном реквизите. Для этого создадим обработчик события ПриИзменении у элемента формы (колонки) ТоварыСтрана:

    
    &НаКлиенте
    Процедура ТоварыСтранаПриИзменении(Элемент)
        
        СтрокаТЧ = Элементы.Товары.ТекущиеДанные;
        Если СтрокаТЧ <> Неопределено Тогда
            // Вызываем серверную функцию для быстрого получения кода новой страны
            СтрокаТЧ.КодСтраны = ПолучитьКодСтраныСервер(СтрокаТЧ.Страна);
        КонецЕсли;
        
    КонецПроцедуры
    
    &НаСервереБезКонтекста
    Функция ПолучитьКодСтраныСервер(Знач СсылкаНаСтрану)
        
        Если ЗначениеЗаполнено(СсылкаНаСтрану) Тогда
            Возврат СсылкаНаСтрану.Код;
        КонецЕсли;
        
        Возврат "";
        
    КонецФункции
    
  4. Программная настройка Условного Оформления:

    Теперь свяжем визуальное отображение реальной колонки с данными из нашей скрытой колонки. Добавим следующий код в процедуру формы ПриСозданииНаСервере:

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

Результат работы схемы: В обычном режиме отображения таблицы пользователь видит лаконичный код страны (например, «US»). Как только ячейка активизируется для редактирования, она превращается в полноценное поле выбора ссылки справочника со стандартной кнопкой «три точки», возможностью автоподбора и перехода в карточку по кнопке «лупа».

Способ 2. Виртуальное текстовое поле и обработчики событий

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

Рассмотрим шаги для этого подхода:

  1. Скрытие реальной колонки: Выделим элемент формы ТоварыСтрана и установим его свойство Видимость в значение Ложь. Реквизит останется в структуре данных, но исчезнет с экрана пользователя.
  2. Вывод виртуального поля: Перетащим добавленный ранее реквизит формы КодСтраны на форму в виде колонки табличной части вместо скрытой страны.
  3. Настройка свойств элемента управления: У созданного поля формы ТоварыКодСтраны в палитре свойств включим следующие флаги:
    • КнопкаВыбора = Истина
    • КнопкаОчистки = Истина
  4. Программирование логики выбора: Нам придется вручную переопределить стандартные события ввода для этой колонки, чтобы синхронизировать текстовые данные с реальной ссылкой в объекте:

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

&НаКлиенте
Процедура ТоварыКодСтраныОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
    
    // Перехватываем выбранное значение-ссылку
    СтандартнаяОбработка = Ложь;
    СтрокаТЧ = Элементы.Товары.ТекущиеДанные;
    
    Если СтрокаТЧ <> Неопределено И ЗначениеЗаполнено(ВыбранноеЗначение) Тогда
        // Записываем ссылку в скрытый реквизит объекта
        СтрокаТЧ.Страна = ВыбранноеЗначение;
        // Записываем текстовое представление во вспомогательный реквизит формы
        СтрокаТЧ.КодСтраны = ПолучитьКодСтраныСервер(ВыбранноеЗначение);
    КонецЕсли;
    
КонецПроцедуры

&НаКлиенте
Процедура ТоварыКодСтраныОчистка(Элемент, СтандартнаяОбработка)
    
    СтрокаТЧ = Элементы.Товары.ТекущиеДанные;
    Если СтрокаТЧ <> Неопределено Тогда
        СтрокаТЧ.Страна = ПредопределенноеЗначение("Справочник.СтраныМира.ПустаяСсылка");
        СтрокаТЧ.КодСтраны = "";
    КонецЕсли;
    
КонецПроцедуры

Преимущества и недостатки: Этот способ обеспечивает максимальное быстродействие интерфейса, так как не задействует механизмы динамической перерисовки условного оформления платформы. Однако он требует написания существенно большего объема программного кода и усложняет поддержку формы (дополнительно может потребоваться реализация обработчиков АвтоПодбор и ОкончаниеВводаТекста для ручного поиска страны по коду при ручном вводе символов пользователем).

Способ 3. Группировка колонок «В ячейке» (Без написания кода)

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

Выполним следующие шаги в конфигураторе:

  1. Откроем дерево элементов нашей управляемой формы.
  2. Нажмем правой кнопкой мыши на дерево элементов табличной части и выберем пункт Добавить -> Группа колонок.
  3. В свойствах созданной группы колонок установим свойство Группировка в значение В ячейке.
  4. Перетащим стандартное поле Страна внутрь созданной группы.
  5. Из окна реквизитов формы перетащим поле Страна.Код (доступное через точку от основного реквизита ссылки) и расположим его вторым элементом внутри этой группы колонок.
  6. Для обоих элементов внутри группы установим свойство ОтображатьЗаголовок в значение Ложь, чтобы заголовки полей не загромождали таблицу.

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

Резюме

Мы проанализировали три различных подхода к решению задачи кастомизации представления данных в табличных частях. Для большинства бизнес-задач оптимальным выбором будет Способ 1 (Условное оформление), поскольку он обеспечивает максимальную гибкость интерфейса и сохраняет стандартную эргономику платформы 1С. К альтернативным вариантам стоит прибегать лишь в случаях жестких требований к производительности или при готовности к компромиссам со стороны пользователей.

← На главную