В обычных формах 1С для динамического изменения текста ячеек разработчики активно использовали событие табличного поля ПриПолученииДанных. При переходе на управляемые формы клиент-серверная архитектура исключила возможность построчной модификации отображения на лету без серверных вызовов. Рассмотрим подробнее, какими способами можно реализовать вывод номенклатуры в формате (Артикул) Наименование в табличной части документа.
Если требуется, чтобы во всей конфигурации ссылки на номенклатуру отображались с артикулом в скобках, наиболее правильным решением будет использование событий модуля менеджера справочника Номенклатура.
Разберем по шагам, как настроить этот механизм:
Номенклатура.ОбработкаПолученияПолейПредставления, чтобы платформа при выборке данных оптимизированно считывала только нужные поля (артикул и наименование), не загружая объект целиком.ОбработкаПолученияПредставления, в которой сформируем итоговую строку.Посмотрим на пример реализации кода в модуле менеджера:
Процедура ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка)
Поля.Добавить("Наименование");
Поля.Добавить("Артикул");
СтандартнаяОбработка = Ложь;
КонецПроцедуры
Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Артикул = СокрЛП(Данные.Артикул);
Наименование = СокрЛП(Данные.Наименование);
Если ЗначениеЗаполнено(Артикул) Тогда
Представление = СтрШаблон("(%1) %2", Артикул, Наименование);
Иначе
Представление = Наименование;
КонецЕсли;
КонецПроцедуры
Важная особенность: данный метод изменит представление номенклатуры абсолютно во всех формах, списках, отчетах и документах конфигурации. Если такое поведение нежелательно, следует применить локальные решения на уровне конкретной формы.
Когда изменить представление требуется только в одном конкретном документе, оптимально добавить дополнительную строковую колонку в коллекцию реквизитов формы.
Выполним следующую последовательность действий:
Объект.Товары добавим новый строковый реквизит, например НоменклатураПредставление с достаточной длиной (например, 150–200 символов).Номенклатура скроем (свойство Видимость = Ложь).Посмотрим на пример реализации логики в модуле формы документа:
&НаСервере
Процедура ЗаполнитьПредставленияНоменклатурыНаСервере()
Для Каждого Стр Из Объект.Товары Цикл
СформироватьПредставлениеСтроки(Стр);
КонецЦикла;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура СформироватьПредставлениеСтроки(СтрокаТЧ)
Если Не ЗначениеЗаполнено(СтрокаТЧ.Номенклатура) Тогда
СтрокаТЧ.НоменклатураПредставление = "";
Возврат;
КонецЕсли;
// Получаем реквизиты (в реальном проекте артикул можно хранить в скрытом реквизите ТЧ или получать с сервера)
Артикул = СтрокаТЧ.Номенклатура.Артикул;
Наименование = СтрокаТЧ.Номенклатура.Наименование;
Если ЗначениеЗаполнено(Артикул) Тогда
СтрокаТЧ.НоменклатураПредставление = СтрШаблон("(%1) %2", Артикул, Наименование);
Иначе
СтрокаТЧ.НоменклатураПредставление = Наименование;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
ЗаполнитьПредставленияНоменклатурыНаСервере();
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ЗаполнитьПредставленияНоменклатурыНаСервере();
КонецПроцедуры
&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено Тогда
СформироватьПредставлениеСтроки(ТекущиеДанные);
КонецЕсли;
КонецПроцедуры
В управляемых формах доступен механизм группировки элементов таблицы. В дерево элементов таблицы формы можно добавить группу колонок со свойством Группировка = В ячейке и перенести туда поля Номенклатура.Артикул и Номенклатура.
Проанализируем ограничения этого подхода:
().Текст задает только статическую строковую константу.Если табличная часть документа используется исключительно для отображения информации без возможности интерактивного редактирования строк пользователем, данные можно вывести через ДинамическийСписок с произвольным запросом:
ВЫБРАТЬ
Товары.НомерСтроки КАК НомерСтроки,
ВЫБОР
КОГДА Товары.Номенклатура.Артикул = "" ТОГДА Товары.Номенклатура.Наименование
ИНАЧЕ "(" + Товары.Номенклатура.Артикул + ") " + Товары.Номенклатура.Наименование
КОНЕЦ КАК НоменклатураПредставление,
Товары.Количество КАК Количество
ИЗ
Документ.ЗаказКлиента.Товары КАК Товары
ГДЕ
Товары.Ссылка = &ТекущийДокумент
В этом случае платформа на уровне СУБД объединит значения полей и обеспечит высокую скорость отрисовки формы.