Представление спискавыбора в табличной части

1. oyti 55 30.08.18 10:13 Сейчас в теме
Здравствуйте.

Дано: внешняя обработка. Есть реквизит1 типа строка.
На форме поле ввода с РежимВыбораИзСписка=Истина и данными реквизит1.
Список заполнен некоторыми значениями с представлениями.
При выборе значения отображается список представлений, а по окончании - в поле будет отображено представление выбранного элемента. Все ок.

Однако с табличнойчастью такое не проходит - при выборе список представлений, а после - в поле попадает не представление, а значение. Как-то... я хочу отображать пользователю удобоваримые названия, а не идентификаторы типа 6040d92d-e286-f4f9-a613-ed0e6fd241e1

Вопрос: кто виноват и что делать? можно ли достичь поведения поля табличной части аналогично обычному полю ввода с режимом выбора из списка?
Merkalov; +1 Ответить
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. neuro88 30.08.18 13:02 Сейчас в теме
(1) к сожалению, поведение табличной части весьма своеобразное.

Есть способ:
1) создаем в ТЧ 2 реквизита: Представление - поле, в котором пользователь будет делать выбор, и Значение - поле,в котором будем хранить идентификатор(в данном примере)
2) Для Представления указываем выбор из списка и настраиваем этот самый список выбора
3) в обработчик При изменении пишем код:
Процедура ТЧПредставлениеПриИзменении(Элемент)
	СтрокаТаблицы = Элементы.ТЧ.ТекущиеДанные;
	СтрокаТаблицы.Значение = СтрокаТаблицы.Представление;
	СтрокаТаблицы.Представление = Элемент.ТекстРедактирования;
КонецПроцедуры

4) получаем возможность показывать пользователю то, что он хочет видеть, а также хранить и обрабатывать нужные нам данные.

Не очень красиво, но думаю суть ясна.
Прикрепленные файлы:
kaliuzhnyi; +1 Ответить
4. kaliuzhnyi 135 19.03.19 16:01 Сейчас в теме
(2)
Я тоже так делаю, но еще для красоты делаю следующие:
В событие НачалоВыбора (для реквизита - представления) устанавливаю для ПодсказкаВвода, текущее значение которое сейчас выбрано.
И в событие ПриИзменении устанавливаю для ПодсказкаВвода значение из Элемент.ТекстРедактирования. А то в момент после выбора поле остается пустым пока не будет переведен курсор.
5. kaliuzhnyi 135 19.03.19 16:05 Сейчас в теме
(2) а еще вспомнил, вариант он мне больше нравится, уже даже не помню почему))

Пример:
&НаКлиенте
Процедура ЦелиПериодПредставлениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;

	Элемент.ПодсказкаВвода = Элементы.Цели.ТекущиеДанные.ПериодПредставление;
	
	ДанныеВыбора = Новый СписокЗначений;
	Для Каждого Строка Из Объект.Периоды Цикл
		ДанныеВыбора.Добавить(Строка.УИ, Строка.Наименование);
	КонецЦикла;

КонецПроцедуры // ЦелиПериодПредставлениеНачалоВыбора

&НаКлиенте
Процедура ЦелиПериодПредставлениеОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	НайденныеСтроки = Объект.Периоды.НайтиСтроки(Новый Структура("УИ", ВыбранноеЗначение));
	Если НайденныеСтроки.Количество() > 0  Тогда
		
		Элемент.ПодсказкаВвода = НайденныеСтроки[0].Наименование;
		
		ТекущиеДанные = Элементы.Цели.ТекущиеДанные;
		ТекущиеДанные.Период = НайденныеСтроки[0].УИ;
		ТекущиеДанные.ПериодПредставление = НайденныеСтроки[0].Наименование;
		
	КонецЕсли;
	
КонецПроцедуры // ЦелиПериодПредставлениеОбработкаВыбора
Показать
3. soft_wind 30.08.18 13:13 Сейчас в теме
формы какие?
для неуправляемых форм используйте событие ПриВыводеСтроки(,,,)
заполняйте Оформление строки
см.пример
Прикрепленные файлы:
ТестСписокЗначений2.epf
6. tyasytova 22.04.19 10:21 Сейчас в теме
У меня получилось по СписокВыбора. Показать Представление вместо Значения
Для УФ:
&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

     

    Для Каждого Значение Из Элементы.ТабличнаяЧастьЗначение.СписокВыбора.ВыгрузитьЗначения() Цикл

        Объект.ТабличнаяЧасть.Добавить().Значение = Значение;

    КонецЦикла;

     

    ДобавитьУсловноеОформлениеТекстаДляСпискаВыбора(Элементы.ТабличнаяЧастьЗначение);

         

КонецПроцедуры

  

  

// Добавит правила условного оформления для всех значений списка выбора элемента

// для отображения вместо значений текст из представления из списка выбора элемента

//

// Параметры:

//  Элемент - ПолеФормы - Элемент управления

//       для которого следует установить правила оформления на основании выбранного (установленного) значения

//

Процедура ДобавитьУсловноеОформлениеТекстаДляСпискаВыбора(Элемент, Отказ = Ложь)

     

    Перем Форма;

     

    Форма = ПолучитьФормуЧерезЭлементУправления(Элемент, Отказ);

     

    Для Каждого ЭлементСпискаВыбора Из Элемент.СписокВыбора  Цикл

        // Новое правило оформления

        ЭлементУсловногоОформления = Форма.УсловноеОформление.Элементы.Добавить();

        ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("Текст", ЭлементСпискаВыбора.Представление);

        // Условие

        ЭлементУсловия  = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));

        ЭлементУсловия.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(Элемент.ПутьКДанным);

        ЭлементУсловия.ВидСравнения=ВидСравненияКомпоновкиДанных.Равно;

        ЭлементУсловия.ПравоеЗначение=ЭлементСпискаВыбора.Значение;

        // Поле

        ОформляемоеПоле = ЭлементУсловногоОформления.Поля.Элементы.Добавить();

        ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(Элемент.Имя);

    КонецЦикла;

     

КонецПроцедуры // УстановитьУсловноеОформлениеДляСпискаВыбораЭлементаУправлени­я()

  

  

// Вернет управляемую форму на которой размещен элемент управления

//

// Параметры:

//  Элемент - ПолеФормы - Элемент управления

//  Отказ - Булево - будет содержать признак отказа выполнения метода

//

// Возвращаемое значение:

//  - УправляемаяФорма -

Функция ПолучитьФормуЧерезЭлементУправления(Элемент, Отказ = Ложь)

     

    Перем Родитель;

     

    Родитель = Элемент.Родитель;

    Пока ТипЗнч(Родитель) <> Тип("УправляемаяФорма") Цикл

        Родитель = Родитель.Родитель;

    КонецЦикла;

    Возврат Родитель;

     

КонецФункции // ПолучитьФормуЧерезЭлементУправления()
Показать


Для обычных форм:

Процедура ТабличнаяЧасть1ПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)

   ОформлениеСтроки.Ячейки["Колонка1"].Текст = ЭлементыФормы.ТабличнаяЧасть1.Колонки.Колонка1.ЭлементУправления.СписокВыбора.НайтиПоЗначению(ДанныеСтроки.Колонка1).Представление;

КонецПроцедуры
naumkin.s; SagittariusA; AZel84; user1245789; YoungHero; coollerinc; Maito; raystlin; SunSun1979; Andreyyy; wowik; Merkalov; ya1c; +13 Ответить
8. Merkalov 8 28.02.20 07:11 Сейчас в теме
(6) И правда - сработало. Выходит что все механизмы по раскраске/подмене значений в ячейках табличных полей из ПриВыводеСтроки/ПриПолученииДанных переехали в УсловноеОформление (ОФ->УФ)

ps: из всего кода воспользовался только процедурой "ДобавитьУсловноеОформлениеТекстаДляСпискаВыбора()"
user1245789; +1 Ответить
12. khnatik 07.05.21 16:19 Сейчас в теме
(10) Подскажите, Вы этот код выполняете в серверной процедуре, или в клиентской?
Очевидно, нужно в серверной, программа сообщает, что "Условное оформление не работает на клиенте"

Но когда этот код помещаю в серверной процедуре, то ругается на "Элементы."

А когда условное оформление выношу в серверную процедуру и передаю в нее ПолеФормы, чтобы его оформить, как в

(6)

Тогда программа ругается, что

Ошибка отображения типов:
Отсутствует отображение для типа 'ПолеФормы'
{Дополнение Справочник.СхемыКомплексныхПроцессов.Форма.НастройкаУсловия.Форма(65)}: ДобавитьУсловноеОформлениеТекстаДляСпискаВыбора(Элементы.ДействияРезультатВыполненияСтрокой);

по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'param':
форма: Элемент
имя: {http://v8.1c.ru/8.2/managed-application/modules}param
по причине:
Ошибка отображения типов:
Отсутствует отображение для типа 'ПолеФормы'
Показать
7. jura_b 29.01.20 18:40 Сейчас в теме
Для управляемых форм можно сделать следующим образом.
В свойствах формы установить условное оформление для данного поля табличной части.
Т.е. для списка значений табличного поля "Поле1" таблицы "Таблица1" вида (0, "Ноль"); (1, "Один") и тд. Сделать следующее оформление:
В колонке оформление заполняем поле "Текст" необходимым нам текстом ("Ноль"). В условии указываем наше табличное поле и выбираем, чтобы оно равнялось 0. И в оформляемые поля добавляем наше поле.

И вуаля текст отображается корректно.
Прикрепленные файлы:
levante90; dakork; SeerRM; gmi200; mai_k; +5 Ответить
9. serioga911 18.11.20 11:32 Сейчас в теме
Спасибо, ломал голову как сделать, в качестве решения помогло использование кода из процедуры "ДобавитьУсловноеОформлениеТекстаДляСпискаВыбора()"
10. Vyacheslav_Kochnev 140 22.01.21 17:37 Сейчас в теме
Данная задача решается применением условного оформления
	Элемент_Полетаблицы = Элементы.ПолеТаблицы;
	ПутьКДаннымОбъекта = "Объект.таблица.Колонкатаблицы";
	
	Для каждого ЗначениеСписка Из Элемент_Полетаблицы.СписокВыбора Цикл
		
		Элемент = УсловноеОформление.Элементы.Добавить();
		ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
		ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элемент_Полетаблицы.Имя);
		
		ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
		ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ПутьКДаннымОбъекта);
		ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
		ОтборЭлемента.ПравоеЗначение = ЗначениеСписка.Значение;
		
		Элемент.Оформление.УстановитьЗначениеПараметра("Текст", ЗначениеСписка.Представление);
		// Если надо прижать влево
		// Элемент.Оформление.УстановитьЗначениеПараметра("ГоризонтальноеПоложение", "Прижать влево");
		
	КонецЦикла;
Показать
sergey279; bprogs; solidsun; bearman; naumkin.s; BarsukM; mikeA; +7 Ответить
11. improg 573 18.02.21 13:52 Сейчас в теме
(6) Спасибо помогло, в моем случае был реквизит шапки работает если у него тип строка, например если произвольный то не взлетает.
13. SkAt91 20.07.23 15:51 Сейчас в теме
Доброго времени суток! Прикладываю свой вариант решения - может пригодится кому.
У элемента "Колонка1" обращаем внимания на свойства:
РасширенноеРедактирование = Ложь;
КнопкаВыпадающегоСписка = Истина;
РежимВыбораИзСписка = Истина;

Единственный минус: то, что в СпискеВыбора помещаем как "Значение" должно быть уникальным среди всего списка. Иначе выбирает первое попавшееся в списке. Но и этот момент можно обыграть, думаю.
Прикрепленные файлы:
ВнешняяОбработка.epf
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот