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