Почему в таблице на управляемой форме вместо значения отображается представление и как это исправить?

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

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

Однако при таком подходе разработчики сталкиваются с неожиданным поведением платформы: в обеих колонках таблицы выводится один и тот же текст представления. Разберем причины такого поведения и рассмотрим корректные способы реализации подобной задачи.

Посмотрим на пример исходного кода, приводящего к ошибке отображения:

Расшифровка.Добавить(1000, "Сумма взаиморасчетов");

Ожидается, что в строке таблицы отобразится строка «Сумма взаиморасчетов» и число 1000. На практике же клиентское приложение в обеих ячейках показывает текст «Сумма взаиморасчетов».

Причина поведения платформы

Выясним причину, почему так происходит. В управляемом интерфейсе 1С свойство Представление объекта ЭлементСпискаЗначений обладает безусловным приоритетом при отображении данных в элементах управления. Если свойство заполнено строковым значением, платформа подменяет им вывод ячейки даже в тех случаях, когда путь к данным элемента формы явно указывает на реквизит Значение.

Кроме того, объект СписокЗначений изначально предназначен для выбора значений из выпадающего списка, множественного выбора с флажками или настройки отборов, а не для отображения произвольных многоколоночных табличных структур.

Способ 1. Использование полноценной ТаблицыЗначений на форме

Наиболее надежный и архитектурно правильный способ — отказаться от использования типа СписокЗначений в пользу объекта ТаблицаЗначений в реквизитах формы. Это позволяет жестко типизировать каждую колонку и избежать неоднозначностей при отрисовке интерфейса.

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

  1. Создаем массив добавляемых реквизитов формы.
  2. Добавляем реквизит-коллекцию типа ТаблицаЗначений и колонки с нужными типами данных.
  3. Вызываем метод ИзменитьРеквизиты().
  4. Создаем соответствующие элементы формы для отображения таблицы и ее колонок.

Рассмотрим пример создания и заполнения реквизита на стороне сервера:


&НаСервере
Процедура СоздатьТаблицуРасшифровкиНаСервере()
    // Создаем реквизиты формы
    МассивРеквизитов = Новый Массив;
    МассивРеквизитов.Добавить(Новый РеквизитФормы("ТаблицаРасшифровки", Новый ОписаниеТипов("ТаблицаЗначений")));
    МассивРеквизитов.Добавить(Новый РеквизитФормы("Наименование", Новый ОписаниеТипов("Строка",,,, Новый КвалификаторыСтроки(150)), "ТаблицаРасшифровки"));
    МассивРеквизитов.Добавить(Новый РеквизитФормы("Сумма", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2)), "ТаблицаРасшифровки"));
    
    ИзменитьРеквизиты(МассивРеквизитов);
    
    // Заполняем данными
    НоваяСтрока = ТаблицаРасшифровки.Добавить();
    НоваяСтрока.Наименование = "Сумма взаиморасчетов";
    НоваяСтрока.Сумма = 1000;
КонецПроцедуры

Способ 2. Принудительное переопределение текста через Условное оформление

Если структура данных уже жестко завязана на СписокЗначений и менять тип реквизита нежелательно, можно переопределить отображаемый текст колонки «Значение» с помощью механизма условного оформления формы.

Проанализируем программную настройку условного оформления:

  1. Добавляем новый элемент в коллекцию УсловноеОформление формы.
  2. В свойстве Оформление устанавливаем параметр Текст.
  3. В качестве оформляемого поля указываем колонку формы, привязанную к значению.

Посмотрим на пример кода, переопределяющего текст ячейки:


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

Способ 3. Организация иерархических и вложенных данных (Master-Detail)

Нередко потребность хранить СписокЗначений внутри таблицы возникает из-за необходимости сделать вложенную расшифровку для каждой строки основной таблицы. Объект ДанныеФормыКоллекция не поддерживает прямую вложенность других таблиц внутри своих ячеек на клиенте. В таких случаях рекомендуется использовать архитектурный паттерн Master-Detail («Мастер — Деталь»).

Разберем по шагам реализацию схемы:

  1. На форме создаются две независимые таблицы: основная и подчиненная.
  2. Данные расшифровок для всех строк хранятся на сервере в структуре, соответствии или во временном хранилище с привязкой к идентификатору строки главной таблицы.
  3. В обработчике события ПриАктивизацииСтроки главной таблицы подчиненная таблица на форме перезаполняется актуальными данными текущей строки через вызов сервера или из кэша.

Рассмотрим пример обновления подчиненной таблицы при смене текущей строки:


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

&НаСервере
Процедура ОбновитьПодчиненнуюТаблицуНаСервере(ИдентификаторСтроки)
    ТаблицаПодчиненная.Очистить();
    
    // Получаем ранее сохраненные данные расшифровки для переданной строки
    НайденныеДанные = ПолучитьДанныеРасшифровкиПоИдентификатору(ИдентификаторСтроки);
    Для Каждого Стр Из НайденныеДанные Цикл
        ЗаполнитьЗначенияСвойств(ТаблицаПодчиненная.Добавить(), Стр);
    КонецЦикла;
КонецПроцедуры

Использование правильных коллекций и паттернов проектирования интерфейса позволяет избежать конфликтов визуализации платформы 1С и гарантирует корректное отображение любых типов данных на управляемой форме.

← На главную