Дано: внешняя обработка. Есть реквизит1 типа строка.
На форме поле ввода с РежимВыбораИзСписка=Истина и данными реквизит1.
Список заполнен некоторыми значениями с представлениями.
При выборе значения отображается список представлений, а по окончании - в поле будет отображено представление выбранного элемента. Все ок.
Однако с табличнойчастью такое не проходит - при выборе список представлений, а после - в поле попадает не представление, а значение. Как-то... я хочу отображать пользователю удобоваримые названия, а не идентификаторы типа 6040d92d-e286-f4f9-a613-ed0e6fd241e1
Вопрос: кто виноват и что делать? можно ли достичь поведения поля табличной части аналогично обычному полю ввода с режимом выбора из списка?
(1) к сожалению, поведение табличной части весьма своеобразное.
Есть способ:
1) создаем в ТЧ 2 реквизита: Представление - поле, в котором пользователь будет делать выбор, и Значение - поле,в котором будем хранить идентификатор(в данном примере)
2) Для Представления указываем выбор из списка и настраиваем этот самый список выбора
3) в обработчик При изменении пишем код:
(2)
Я тоже так делаю, но еще для красоты делаю следующие:
В событие НачалоВыбора (для реквизита - представления) устанавливаю для ПодсказкаВвода, текущее значение которое сейчас выбрано.
И в событие ПриИзменении устанавливаю для ПодсказкаВвода значение из Элемент.ТекстРедактирования. А то в момент после выбора поле остается пустым пока не будет переведен курсор.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Для Каждого Значение Из Элементы.ТабличнаяЧастьЗначение.СписокВыбора.ВыгрузитьЗначения() Цикл
Объект.ТабличнаяЧасть.Добавить().Значение = Значение;
КонецЦикла;
ДобавитьУсловноеОформлениеТекстаДляСпискаВыбора(Элементы.ТабличнаяЧастьЗначение);
КонецПроцедуры
// Добавит правила условного оформления для всех значений списка выбора элемента
// для отображения вместо значений текст из представления из списка выбора элемента
//
// Параметры:
// Элемент - ПолеФормы - Элемент управления
// для которого следует установить правила оформления на основании выбранного (установленного) значения
//
Процедура ДобавитьУсловноеОформлениеТекстаДляСпискаВыбора(Элемент, Отказ = Ложь)
Перем Форма;
Форма = ПолучитьФормуЧерезЭлементУправления(Элемент, Отказ);
Для Каждого ЭлементСпискаВыбора Из Элемент.СписокВыбора Цикл
// Новое правило оформления
ЭлементУсловногоОформления = Форма.УсловноеОформление.Элементы.Добавить();
ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("Текст", ЭлементСпискаВыбора.Представление);
// Условие
ЭлементУсловия = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементУсловия.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(Элемент.ПутьКДанным);
ЭлементУсловия.ВидСравнения=ВидСравненияКомпоновкиДанных.Равно;
ЭлементУсловия.ПравоеЗначение=ЭлементСпискаВыбора.Значение;
// Поле
ОформляемоеПоле = ЭлементУсловногоОформления.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(Элемент.Имя);
КонецЦикла;
КонецПроцедуры // УстановитьУсловноеОформлениеДляСпискаВыбораЭлементаУправления()
// Вернет управляемую форму на которой размещен элемент управления
//
// Параметры:
// Элемент - ПолеФормы - Элемент управления
// Отказ - Булево - будет содержать признак отказа выполнения метода
//
// Возвращаемое значение:
// - УправляемаяФорма -
Функция ПолучитьФормуЧерезЭлементУправления(Элемент, Отказ = Ложь)
Перем Родитель;
Родитель = Элемент.Родитель;
Пока ТипЗнч(Родитель) <> Тип("УправляемаяФорма") Цикл
Родитель = Родитель.Родитель;
КонецЦикла;
Возврат Родитель;
КонецФункции // ПолучитьФормуЧерезЭлементУправления()
(6) И правда - сработало. Выходит что все механизмы по раскраске/подмене значений в ячейках табличных полей из ПриВыводеСтроки/ПриПолученииДанных переехали в УсловноеОформление (ОФ->УФ)
ps: из всего кода воспользовался только процедурой "ДобавитьУсловноеОформлениеТекстаДляСпискаВыбора()"
(10) Подскажите, Вы этот код выполняете в серверной процедуре, или в клиентской?
Очевидно, нужно в серверной, программа сообщает, что "Условное оформление не работает на клиенте"
Но когда этот код помещаю в серверной процедуре, то ругается на "Элементы."
А когда условное оформление выношу в серверную процедуру и передаю в нее ПолеФормы, чтобы его оформить, как в
Ошибка отображения типов:
Отсутствует отображение для типа 'ПолеФормы'
{Дополнение Справочник.СхемыКомплексныхПроцессов.Форма.НастройкаУсловия.Форма(65)}: ДобавитьУсловноеОформлениеТекстаДляСпискаВыбора(Элементы.ДействияРезультатВыполненияСтрокой);
по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'param':
форма: Элемент
имя: {http://v8.1c.ru/8.2/managed-application/modules}param
по причине:
Ошибка отображения типов:
Отсутствует отображение для типа 'ПолеФормы'
Для управляемых форм можно сделать следующим образом.
В свойствах формы установить условное оформление для данного поля табличной части.
Т.е. для списка значений табличного поля "Поле1" таблицы "Таблица1" вида (0, "Ноль"); (1, "Один") и тд. Сделать следующее оформление:
В колонке оформление заполняем поле "Текст" необходимым нам текстом ("Ноль"). В условии указываем наше табличное поле и выбираем, чтобы оно равнялось 0. И в оформляемые поля добавляем наше поле.
Доброго времени суток! Прикладываю свой вариант решения - может пригодится кому.
У элемента "Колонка1" обращаем внимания на свойства:
РасширенноеРедактирование = Ложь;
КнопкаВыпадающегоСписка = Истина;
РежимВыбораИзСписка = Истина;
Единственный минус: то, что в СпискеВыбора помещаем как "Значение" должно быть уникальным среди всего списка. Иначе выбирает первое попавшееся в списке. Но и этот момент можно обыграть, думаю.