В процессе разработки прикладных решений на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с жесткими требованиями заказчиков к эргономике интерфейса. Типичная задача: в табличной части документа необходимо выводить не стандартное наименование элемента справочника (например, полное название страны «Российская Федерация»), а его сокращенный код (например, «RU» или «643»). При этом стандартный функционал поля ввода — кнопка выбора, кнопка очистки, автоподбор при вводе с клавиатуры и открытие карточки — должен полностью сохраниться для исходного реквизита-ссылки.
В этой статье мы подробно разберем, почему стандартные глобальные методы платформы не всегда подходят для решения этой локальной задачи, и пошагово проанализируем три практических способа реализации такой подмены на управляемых формах.
Первое, что приходит на ум опытному разработчику при необходимости изменить отображение ссылки — использовать обработчик ОбработкаПолученияПредставления в модуле менеджера прикладного объекта (справочника). Этот метод позволяет переопределить то, как ссылка будет выглядеть во всех полях системы.
Однако этот способ имеет критическое ограничение: он работает глобально. Если мы изменим представление справочника «Страны мира» через модуль менеджера, то код страны вместо наименования начнет отображаться абсолютно во всех документах, отчетах, динамических списках и субконто по всей базе данных. Если перед нами стоит задача кастомизировать интерфейс только одного конкретного документа (например, таможенной декларации), глобальный метод использовать нельзя. Нам требуются локальные инструменты работы с управляемой формой.
Этот способ является наиболее изящным и технологичным. Он позволяет использовать стандартный механизм платформы — Условное оформление — для визуальной подмены отображаемого значения, при этом сам элемент управления (поле ввода) остается привязанным к исходному ссылочному реквизиту.
Здесь важно знать ключевую особенность платформы 1С: в управляемых формах для обычных табличных частей (в отличие от динамических списков) нельзя напрямую в параметре условного оформления «Текст» указать путь к данным через точку (например, Объект.Товары.Страна.Код). Платформа не умеет динамически считывать свойства ссылочных полей для оформления строк нединамических наборов данных. Поэтому нам потребуется вспомогательный реквизит.
Рассмотрим пошаговый алгоритм реализации этого метода:
Откроем редактор управляемой формы документа. В верхнем правом окне перейдем на вкладку «Реквизиты», развернем структуру нашей табличной части (например, Объект.Товары) и добавим новый реквизит формы. Назовем его КодСтраны (тип данных: Строка). Обратите внимание: мы добавляем реквизит именно на форму, а не в метаданные самого документа в конфигураторе. Это позволяет избежать замусоривания структуры базы данных ненужными реквизитами. Выносить созданную колонку на саму форму в виде элемента не требуется.
Нам необходимо обеспечить первоначальное заполнение текстового поля при открытии формы документа. Для этого будем использовать серверный обработчик формы ПриЧтенииНаСервере (или ПриСозданииНаСервере, если документ новый и создается интерактивно):
&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
// Заполняем текстовое представление кода для каждой строки ТЧ
Для Каждого СтрокаТЧ Из Объект.Товары Цикл
СтрокаТЧ.КодСтраны = СтрокаТЧ.Страна.Код;
КонецЦикла;
КонецПроцедуры
Когда пользователь выбирает другую страну в строке таблицы, нам нужно динамически обновлять значение в нашем вспомогательном реквизите. Для этого создадим обработчик события ПриИзменении у элемента формы (колонки) ТоварыСтрана:
&НаКлиенте
Процедура ТоварыСтранаПриИзменении(Элемент)
СтрокаТЧ = Элементы.Товары.ТекущиеДанные;
Если СтрокаТЧ <> Неопределено Тогда
// Вызываем серверную функцию для быстрого получения кода новой страны
СтрокаТЧ.КодСтраны = ПолучитьКодСтраныСервер(СтрокаТЧ.Страна);
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьКодСтраныСервер(Знач СсылкаНаСтрану)
Если ЗначениеЗаполнено(СсылкаНаСтрану) Тогда
Возврат СсылкаНаСтрану.Код;
КонецЕсли;
Возврат "";
КонецФункции
Теперь свяжем визуальное отображение реальной колонки с данными из нашей скрытой колонки. Добавим следующий код в процедуру формы ПриСозданииНаСервере:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Настраиваем подмену текста через условное оформление формы
НовыйЭлементУО = УсловноеОформление.Элементы.Добавить();
// Определяем параметр оформления "Текст" и связываем его с нашей вспомогательной колонкой
НовыйЭлементУО.Оформление.УстановитьЗначениеПараметра("Текст", Новый ПолеКомпоновкиДанных("Объект.Товары.КодСтраны"));
// Условие применения: оформление должно работать только когда поле Страна заполнено
ЭлементОтбора = НовыйЭлементУО.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Страна");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Заполнено;
// Указываем целевое оформляемое поле (имя элемента-колонки на форме)
ПолеОформления = НовыйЭлементУО.Поля.Элементы.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ТоварыСтрана");
КонецПроцедуры
Результат работы схемы: В обычном режиме отображения таблицы пользователь видит лаконичный код страны (например, «US»). Как только ячейка активизируется для редактирования, она превращается в полноценное поле выбора ссылки справочника со стандартной кнопкой «три точки», возможностью автоподбора и перехода в карточку по кнопке «лупа».
Иногда возникают ситуации, когда применение условного оформления нежелательно (например, при экстремально больших объемах данных в табличной части при работе через тонкий клиент по медленным каналам связи, где перерасчет оформления «на лету» может вызывать микрозадержки интерфейса). В этом случае мы можем пойти по пути создания полной программной имитации.
Рассмотрим шаги для этого подхода:
ТоварыСтрана и установим его свойство Видимость в значение Ложь. Реквизит останется в структуре данных, но исчезнет с экрана пользователя.КодСтраны на форму в виде колонки табличной части вместо скрытой страны.ТоварыКодСтраны в палитре свойств включим следующие флаги:
КнопкаВыбора = ИстинаКнопкаОчистки = Истина
&НаКлиенте
Процедура ТоварыКодСтраныНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
// Отменяем стандартное поведение текстового поля
СтандартнаяОбработка = Ложь;
// Программно вызываем форму выбора справочника "СтраныМира"
ПараметрыФормы = Новый Структура("ЗакрыватьПриВыборе", Истина);
ОткрытьФорму("Справочник.СтраныМира.ФормаВыбора", ПараметрыФормы, Элемент);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыКодСтраныОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
// Перехватываем выбранное значение-ссылку
СтандартнаяОбработка = Ложь;
СтрокаТЧ = Элементы.Товары.ТекущиеДанные;
Если СтрокаТЧ <> Неопределено И ЗначениеЗаполнено(ВыбранноеЗначение) Тогда
// Записываем ссылку в скрытый реквизит объекта
СтрокаТЧ.Страна = ВыбранноеЗначение;
// Записываем текстовое представление во вспомогательный реквизит формы
СтрокаТЧ.КодСтраны = ПолучитьКодСтраныСервер(ВыбранноеЗначение);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТоварыКодСтраныОчистка(Элемент, СтандартнаяОбработка)
СтрокаТЧ = Элементы.Товары.ТекущиеДанные;
Если СтрокаТЧ <> Неопределено Тогда
СтрокаТЧ.Страна = ПредопределенноеЗначение("Справочник.СтраныМира.ПустаяСсылка");
СтрокаТЧ.КодСтраны = "";
КонецЕсли;
КонецПроцедуры
Преимущества и недостатки: Этот способ обеспечивает максимальное быстродействие интерфейса, так как не задействует механизмы динамической перерисовки условного оформления платформы. Однако он требует написания существенно большего объема программного кода и усложняет поддержку формы (дополнительно может потребоваться реализация обработчиков АвтоПодбор и ОкончаниеВводаТекста для ручного поиска страны по коду при ручном вводе символов пользователем).
Если заказчик готов пойти на небольшой компромисс ради удешевления разработки и повышения надежности решения, можно использовать стандартную возможность платформы 1С по группировке колонок внутри одной ячейки. Это позволит выводить и ссылку (наименование), и код одновременно в одной компактной области.
Выполним следующие шаги в конфигураторе:
Группировка в значение В ячейке.Страна внутрь созданной группы.Страна.Код (доступное через точку от основного реквизита ссылки) и расположим его вторым элементом внутри этой группы колонок.ОтображатьЗаголовок в значение Ложь, чтобы заголовки полей не загромождали таблицу.Результат: Платформа автоматически сгруппирует два поля в одну ячейку таблицы. Визуально это будет выглядеть аккуратно, например: «RU, Российская Федерация». При этом пользователь сохраняет возможность полноценно редактировать поле ссылки, а код всегда остается перед его глазами. Главный плюс метода — абсолютная простота реализации без написания программного кода.
Мы проанализировали три различных подхода к решению задачи кастомизации представления данных в табличных частях. Для большинства бизнес-задач оптимальным выбором будет Способ 1 (Условное оформление), поскольку он обеспечивает максимальную гибкость интерфейса и сохраняет стандартную эргономику платформы 1С. К альтернативным вариантам стоит прибегать лишь в случаях жестких требований к производительности или при готовности к компромиссам со стороны пользователей.