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

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

В обычных формах 1С для динамического изменения текста ячеек разработчики активно использовали событие табличного поля ПриПолученииДанных. При переходе на управляемые формы клиент-серверная архитектура исключила возможность построчной модификации отображения на лету без серверных вызовов. Рассмотрим подробнее, какими способами можно реализовать вывод номенклатуры в формате (Артикул) Наименование в табличной части документа.

Способ 1. Переопределение представления в модуле менеджера справочника (глобальный подход)

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

Разберем по шагам, как настроить этот механизм:

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

Посмотрим на пример реализации кода в модуле менеджера:


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

Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    Артикул = СокрЛП(Данные.Артикул);
    Наименование = СокрЛП(Данные.Наименование);
    
    Если ЗначениеЗаполнено(Артикул) Тогда
        Представление = СтрШаблон("(%1) %2", Артикул, Наименование);
    Иначе
        Представление = Наименование;
    КонецЕсли;
    
КонецПроцедуры

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

Способ 2. Использование дополнительного строкового реквизита на форме (локальный подход)

Когда изменить представление требуется только в одном конкретном документе, оптимально добавить дополнительную строковую колонку в коллекцию реквизитов формы.

Выполним следующую последовательность действий:

  1. В редакторе формы в табличную часть Объект.Товары добавим новый строковый реквизит, например НоменклатураПредставление с достаточной длиной (например, 150–200 символов).
  2. Разместим этот реквизит в таблице на форме, а стандартную колонку Номенклатура скроем (свойство Видимость = Ложь).
  3. Настроим заполнение вычисляемой строки при открытии формы и при изменении номенклатуры пользователем.

Посмотрим на пример реализации логики в модуле формы документа:


&НаСервере
Процедура ЗаполнитьПредставленияНоменклатурыНаСервере()
    
    Для Каждого Стр Из Объект.Товары Цикл
        СформироватьПредставлениеСтроки(Стр);
    КонецЦикла;
    
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура СформироватьПредставлениеСтроки(СтрокаТЧ)
    
    Если Не ЗначениеЗаполнено(СтрокаТЧ.Номенклатура) Тогда
        СтрокаТЧ.НоменклатураПредставление = "";
        Возврат;
    КонецЕсли;
    
    // Получаем реквизиты (в реальном проекте артикул можно хранить в скрытом реквизите ТЧ или получать с сервера)
    Артикул = СтрокаТЧ.Номенклатура.Артикул;
    Наименование = СтрокаТЧ.Номенклатура.Наименование;
    
    Если ЗначениеЗаполнено(Артикул) Тогда
        СтрокаТЧ.НоменклатураПредставление = СтрШаблон("(%1) %2", Артикул, Наименование);
    Иначе
        СтрокаТЧ.НоменклатураПредставление = Наименование;
    КонецЕсли;
    
КонецПроцедуры

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
    ЗаполнитьПредставленияНоменклатурыНаСервере();
КонецПроцедуры

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    ЗаполнитьПредставленияНоменклатурыНаСервере();
КонецПроцедуры

&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
    
    ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
    Если ТекущиеДанные <> Неопределено Тогда
        СформироватьПредставлениеСтроки(ТекущиеДанные);
    КонецЕсли;
    
КонецПроцедуры

Способ 3. Группировка колонок в ячейке

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

Проанализируем ограничения этого подхода:

  1. Колонки будут выводиться последовательно (друг за другом или одна под другой).
  2. Стандартное форматирование не позволяет динамически убрать скобки, если артикул пустой: при установке формата префикса/суффикса для пустых артикулов останутся пустые скобки ().
  3. Условное оформление формы не поддерживает динамическое объединение строк и формулы — свойство Текст задает только статическую строковую константу.

Способ 4. Динамический список для таблиц только на просмотр

Если табличная часть документа используется исключительно для отображения информации без возможности интерактивного редактирования строк пользователем, данные можно вывести через ДинамическийСписок с произвольным запросом:


ВЫБРАТЬ
    Товары.НомерСтроки КАК НомерСтроки,
    ВЫБОР
        КОГДА Товары.Номенклатура.Артикул = "" ТОГДА Товары.Номенклатура.Наименование
        ИНАЧЕ "(" + Товары.Номенклатура.Артикул + ") " + Товары.Номенклатура.Наименование
    КОНЕЦ КАК НоменклатураПредставление,
    Товары.Количество КАК Количество
ИЗ
    Документ.ЗаказКлиента.Товары КАК Товары
ГДЕ
    Товары.Ссылка = &ТекущийДокумент

В этом случае платформа на уровне СУБД объединит значения полей и обеспечит высокую скорость отрисовки формы.

← На главную