Имя: Пароль:
1C
1С v8
Данные колонки подчиненного реквизита (пользовательского)
0 АнализДанных
 
14.01.20
12:15
Есть таблица динамического списка, при двойном клике любой ячейки у меня открывается ее значение (Событие «Выбор»):

&НаКлиенте
Процедура МояТаблицаВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)

   ТекДанные = Элементы.МояТаблица.ТекущиеДанные;
   ИмяКолонки = СтрЗаменить(Поле.Имя, Элемент.Имя, "");
   ПоказатьЗначение(,ТекДанные[ИмяКолонки]);

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

Все работает, но! Если пользователь, через «Изменить форму» добавляет подчиненный реквизит, то становится непонятно, как открыть это значение.

Пример:
Есть колонка дин.списка «Номенклатура». Пользователь добавляет подчиненный реквизит «Поставщик», а потом для поставщика еще один подчиненный реквизит «Головной контрагент».
При двойном клике по полю «Головной контрагент» у него имя содержит «МояТаблицаНоменклатура_Поставщик_[Головной контрагент]»
Переменная ТекДанные содержит ТекДанные.Номенклатура.Поставщик.[Головной контрагент].

Как получить значение ячейки на которую кликнул пользователь, если это добавленный пользователем подчиненный реквизит?
1 hhhh
 
14.01.20
12:17
(0) ну так ТекДанные.Номенклатура.Поставщик.ГоловнойКонтрагент
2 АнализДанных
 
14.01.20
12:33
(1) Я не знаю на какую колонку кликнул пользователь, и если это подчиненный реквизит, то как мне понять, как он называется в метаданных?.
Теоретически можно заменить все символы "_" в имени поля на точку "." и тогда все отработает, но! в системе могут быть реквизиты с подчеркиваниями, тогда это не сработает. Еще "ТекДанные" могут содержать имя реквизита в квадратных скобках, если синоним с пробелом (т.е. там именно синоним, а не имя реквизита метаданных).
3 АнализДанных
 
14.01.20
13:57
Красивого решения не нашел, т.к. есть ограничения платформы, которые не позволяют получить путь к данным пользовательских реквизитов (или я чего-то не знаю). Следующий код отрабатывает, кроме случаев, когда в имени элемента есть символ "_", тогда значение просто не откроется.

ИмяКолонки = СтрЗаменить(Поле.Имя, Элемент.Имя, "");

Если ТекДанные.Свойство(ИмяКолонки) Тогда
   ПоказатьЗначение(,ТекДанные[ИмяКолонки]);
Иначе
   Если ТекДанные.Свойство(СтрЗаменить(ИмяКолонки, "_", ".")) Тогда
      ПоказатьЗначение(,ТекДанные[СтрЗаменить(ИмяКолонки, "_", ".")]);
   КонецЕсли;
КонецЕсли;