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