Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
29 сен 2021, 05:21

Установка типа значения для поля табличной части

Автор Tasselhof, 25 мар 2019, 15:54

0 Пользователей и 1 гость просматривают эту тему.

Tasselhof

Есть таблица с двумя колонками.
Первая колонка - "Характеристика" - это ссылка на элемент справочника Характеристик, в нем указан тип значения, например "Число"
Вторая колонка - "Значение характеристики" имеет составной тип данных.
На управляемой форме надо, чтобы поле "Значение характеристики" становилось доступным для редактирования, только если выбрано значение Характеристики и автоматически проставлялся тип этого значения, чтобы у пользователю не было возможности самостоятельно выбирать тип значения.
Пробовал делать при изменении характеристики через:
ТекСтрока = Элементы.Характеристики.ТекущиеДанные;
ТекСтрока.ЗначениеХарактеристики.Тип - недоступно.
ОграничениеТипа - для данных тоже недоступно.

Подскажите, как подступиться, пожалуйста! Застрял на ерунде =(

LexaK

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


&НаКлиенте
Процедура ПоляПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)

лкТекСтр = Элементы.Поля.ТекущиеДанные;
лкЗначение = лкТекСтр.Значение;
Если ЗначениеЗаполнено(лкЗначение) Тогда

Элементы.ПоляЗначение.ВыбиратьТип = Ложь;
Попытка
лкМета = лкЗначение.Метаданные();
лкИмяОбъекта = лкМета.ПолноеИмя();
ИмяЭлемента = "Значение";
ВыбратьОбъектНаКлиенте(лкЗначение, "Элемент", лкИмяОбъекта);
Исключение
//не мета, выбираем как есть
ИмяЭлемента = "";
Элементы.ПоляЗначение.КнопкаВыбора = Истина;
КонецПопытки;

ИначеЕсли лкЗначение = Неопределено Тогда
Элементы.ПоляЗначение.ВыбиратьТип = Истина;
Элементы.ПоляЗначение.КнопкаВыбора = Истина;

Иначе
Элементы.ПоляЗначение.ВыбиратьТип = Ложь;
Элементы.ПоляЗначение.КнопкаВыбора = Истина;

КонецЕсли;
//Элемент.ТекущийЭлемент.ВыбиратьТип = Элемент.ТекущиеДанные.Значение = Неопределено;

КонецПроцедуры
ответ Понравился? (в смысле пригодился?)

Tasselhof

Цитата: LexaK от 25 мар 2019, 16:04
у себя, в форме администратора (УФ), делал так
если значение заполнено, то выбор как из текущего типа, если не определено то сначала выбор типа


&НаКлиенте
Процедура ПоляПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)

лкТекСтр = Элементы.Поля.ТекущиеДанные;
лкЗначение = лкТекСтр.Значение;
Если ЗначениеЗаполнено(лкЗначение) Тогда

Элементы.ПоляЗначение.ВыбиратьТип = Ложь;
Попытка
лкМета = лкЗначение.Метаданные();
лкИмяОбъекта = лкМета.ПолноеИмя();
ИмяЭлемента = "Значение";
ВыбратьОбъектНаКлиенте(лкЗначение, "Элемент", лкИмяОбъекта);
Исключение
//не мета, выбираем как есть
ИмяЭлемента = "";
Элементы.ПоляЗначение.КнопкаВыбора = Истина;
КонецПопытки;

ИначеЕсли лкЗначение = Неопределено Тогда
Элементы.ПоляЗначение.ВыбиратьТип = Истина;
Элементы.ПоляЗначение.КнопкаВыбора = Истина;

Иначе
Элементы.ПоляЗначение.ВыбиратьТип = Ложь;
Элементы.ПоляЗначение.КнопкаВыбора = Истина;

КонецЕсли;
//Элемент.ТекущийЭлемент.ВыбиратьТип = Элемент.ТекущиеДанные.Значение = Неопределено;

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

В данном случае идет процедура ПередНачаломРедактирования всей табличной части, а значение ячейки табличной части может поменяться в процессе редактирования, соответственно, надо выставлять тип или при изменении поля строки "Характеристика", или перед началом редактирования поля "Значение характеристики", последней процедуры не существует для поля.
Попробовал явно задавать значение при изменении поля "Характеристика", например, если это число - 0, если ссылка на справочник - пустую ссылку, но если это будево - все равно выдает запрос на выбор типа =(

LexaK

ПередНачаломРедактирования - возникает при начале редактирования одной строки а не всей ТЧ!
в вашей таблице, только одна колонка Значение должна быть доступна для редактирования
а дальше все правильно, присваиваете Значению - значение нужного типа, если это простой тип (число, строка, булево)
Элементы.ПоляЗначение.ВыбиратьТип     = Ложь;
Элементы.ПоляЗначение.КнопкаВыбора     = Ложь;

-если какой-то один Тип ссылка, то Значение = ПустаяСсылка()
Элементы.ПоляЗначение.ВыбиратьТип     = Ложь;
Элементы.ПоляЗначение.КнопкаВыбора     = Истина;

-если мултиТип
Элементы.ПоляЗначение.ВыбиратьТип     = Истина;
Элементы.ПоляЗначение.КнопкаВыбора     = Истина;
ответ Понравился? (в смысле пригодился?)

Tasselhof

В итоге получилось вот так. Как-то кривовато, но работает.

&НаКлиенте
Процедура ХарактеристикиПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
   УстановитьТипХарактеристики(Элемент.ПодчиненныеЭлементы.ХарактеристикиЗначениеХарактеристики,Элемент.ТекущиеДанные.Характеристика)
КонецПроцедуры

&НаКлиенте
Процедура ХарактеристикиХарактеристикаПриИзменении(Элемент)
   ТекСтрока = Элементы.Характеристики.ТекущиеДанные;
   ТекСтрока.ЗначениеХарактеристики = Неопределено;
   УстановитьТипХарактеристики(Элемент.Родитель.ПодчиненныеЭлементы.ХарактеристикиЗначениеХарактеристики,ТекСтрока.Характеристика);
КонецПроцедуры

&НаКлиенте
Процедура УстановитьТипХарактеристики(Элемент,Характеристика)
   Если ЗначениеЗаполнено(Характеристика) Тогда
      ТипХарактеристики = ПолучитьТипХарактеристики(Характеристика);
      Массив = Новый Массив;
      Массив.Добавить(ТипХарактеристики);
      ОписаниеТипов = Новый ОписаниеТипов(Массив);
      Элемент.ОграничениеТипа = ОписаниеТипов;
      Элемент.Доступность = Истина;
   Иначе
      Элемент.Доступность = Ложь;
   КонецЕсли;
КонецПроцедуры

Теги:

Похожие темы (5)

Рейтинг@Mail.ru Rambler's Top100

Поиск