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

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 568 18.02.21 13:52 Сейчас в теме
(6) Спасибо помогло, в моем случае был реквизит шапки работает если у него тип строка, например если произвольный то не взлетает.
13. SkAt91 20.07.23 15:51 Сейчас в теме
Доброго времени суток! Прикладываю свой вариант решения - может пригодится кому.
У элемента "Колонка1" обращаем внимания на свойства:
РасширенноеРедактирование = Ложь;
КнопкаВыпадающегоСписка = Истина;
РежимВыбораИзСписка = Истина;

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

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)