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

как присвоить необходимый тип реквизиту

Автор fis.irina, 08 янв 2011, 17:14

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

fis.irina

Здравствуйте, возникла проблема...надеюсь на вашу помощь


Есть справочник, в нем две табличные части "ФормируемыеДокументы" и "" СодержаниеДокументов".

В табличной части "ФормируемыеДокументы" возможно выбрать любой вид документа конфигурации. Далее при изменение вида документа в тч "СодержаниеДокументов" доступен выбор наименования любого реквизита выбранного документа. Все это реализованно с помощью отбора. Теперь осталось присовить реквизиту "ЗначениеРеквизита" соответсвующий тип..Например, если реквизит Контрагент, то реквизиту "ЗначениеРеквизита" должен присвоиться тип Справочники.Контрагенты..


Пыталась воспользоваться функцией ТипЗнч. Неудачно..Предположу, что снова необходим отбор.

cska-fanat-kz

А можно какой нить пример?

Пример элемента справочника с двумя документами в ТЧ ФормируемыеДокументы
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

fis.irina

Например, выбрали вид документа "Поступление ТМЗ и услуг", далее выбрали один из его реквизитов. Допустим, "Контрагент".. вот проблема в том, как теперб присвоить значению реквизита соответсвующий тип.. вот скрин с примером...

cska-fanat-kz

Попробуйте что нить вроде...

ТекущиеДанные = ЭлементыФормы.<ИмяТабличнойЧастиСВкладкиСодержание...>.ТекущиеДанные;
ТекущиеДанные.ЗначениеРеквизита = ТекущиеДанные.РеквизитПредставление.ТипЗначения.ПривестиЗначение(ТекущиеДанные.ЗначениеРеквизита);

Вместо "ТекущиеДанные.РеквизитПредставление" возможно нужно что-то другое подставить - имя поля, тип которого вам надо получить...
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

fis.irina

Попробовала. Мне как раз надо получить тип поля РеквизитПредставления. Но, увы, ошибка "Значение не является значением объектного типа (ТипЗначения)"...
Хотя мне кажется, это хороший вариант, но что-то нетак

cska-fanat-kz

Цитата: fis.irina от 09 янв 2011, 18:53
Попробовала. Мне как раз надо получить тип поля РеквизитПредставления. Но, увы, ошибка "Значение не является значением объектного типа (ТипЗначения)"...
Хотя мне кажется, это хороший вариант, но что-то нетак

Напишите плиз типы колонок таблицы "Содержание...". Особенно колонки РеквизитПредставление.
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

fis.irina

тч "ФормируемыеДокументы" : ПредставлениеОбъекта, СсылкаОбъекта  ;
тч "СодержаниеДокумента" : РеквизитПредставление, ВидЗначения, ЗначениеРеквизита

в ПредставлениеОбъекта выпадает список всех видов документов, после этого в  РеквизитПредставление выпадает список всех реквизитов выбранного вида документа..Тип у всех реквизитов Строка. По скольку все эти виды документов и реквизиты я вытаскивала отбором...

могу вставить листинг кода этих отборов. но он немаленький)



fis.irina

вот я вот так вот еще пробовала, но не работает

//ТекРеквизит = ЭлементыФормы.СодержаниеДокументов.ТекущиеДанные;
//ТипЗначениеРеквизита=ТипЗнч(РезультатВыбора.Значение);
//з=ТипЗнч(ТекРеквизит.ЗначениеРеквизита);
//з=ТипЗначениеРеквизита;

cska-fanat-kz

Сделал я так думаю то что требовалось. :zebzdr:

Создал обработку. На форме 2 табличные части:
  ТабличноеПоле1 - список видов документов; 1 колонка - Документ (тип: Строка)
  ТабличноеПоле2 - 2 колонки: Реквизит (тип: Строка), ЗначениеРеквизита (тип: Составной - все типы, которые принимают реквизиты)

Процедура ТабличноеПоле1ДокументНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка)
   
//заполняем список выбора поля ТЧ "Документ"

   Элемент.СписокВыбора.Очистить();
   Для каждого Документ Из Метаданные.Документы Цикл
       Элемент.СписокВыбора.Добавить(Документ.Имя);    
   КонецЦикла;
КонецПроцедуры

//Возвращает описание типа Реквизита по именам документа и реквизита
Функция ПолучитьТипРеквизита(ИмяДокумента,ИмяРеквизита)
   Результат = Неопределено;
   
   Для каждого Документ Из Метаданные.Документы Цикл
       Если Документ.Имя = ИмяДокумента Тогда
           Для каждого Реквизит Из Документ.Реквизиты Цикл
               Если Реквизит.Имя = ИмяРеквизита Тогда
                   Результат = Реквизит.Тип;
                   Прервать;
               КонецЕсли;
           КонецЦикла;
       КонецЕсли;
   КонецЦикла;
   
   Возврат Результат;
КонецФункции

Процедура ТабличноеПоле2РеквизитНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка)
   //заполнение списка выбора поля ТЧ "Реквизит" именами реквизитов выбранного документа
   Элемент.СписокВыбора.Очистить();
   Для каждого Документ Из Метаданные.Документы Цикл
       Если Документ.Имя = ЭлементыФормы.ТабличноеПоле1.ТекущиеДанные.Документ Тогда
           Для каждого Реквизит Из Документ.Реквизиты Цикл
               Элемент.СписокВыбора.Добавить(Реквизит.Имя);    
           КонецЦикла;
       КонецЕсли;
   КонецЦикла;
КонецПроцедуры

Процедура ТабличноеПоле2РеквизитПриИзменении(Элемент)
   //а вот здесь приводим тип значения поля ТЧ "ЗначениеРеквизита"
   //к типу выбранного реквизита
   ТекущиеДанные = ЭлементыФормы.ТабличноеПоле2.ТекущиеДанные;
   
   ТекущиеДанные.ЗначениеРеквизита = ПолучитьТипРеквизита(ЭлементыФормы.ТабличноеПоле1.ТекущиеДанные.Документ,ТекущиеДанные.Реквизит).ПривестиЗначение(ТекущиеДанные.ЗначениеРеквизита);
КонецПроцедуры


Примечание:
1. Код написан на 8.1. У вас скриншоты на 8.2...
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

fis.irina

большое спасибо!!! но... :dfbsdfbsdf: ((

документы и реквизиты я вытаскиваю немного другим способом. но это думаю, нетак важно.
почему-то никак не работает функция типа

"  Результат = Реквизит.Тип;  " или " ПривестиЗначение ". каждый раз "значение не является значением объектного типа"...

вот я примерно так пытаюсь сделать:


//строю таблицу значений куда помещаю все виды документов и список значений куда помещаю все реквизиты...
Процедура ОпределитьСписокОбъектовЗаполнения()
   ТаблицаОбъектовДляЗаполнения = Новый ТаблицаЗначений;
   ТаблицаОбъектовДляЗаполнения.Колонки.Добавить("ОбъектЗаполнения");
   ТаблицаОбъектовДляЗаполнения.Колонки.Добавить("ИмяОбъектаЗаполнения");
   ТаблицаОбъектовДляЗаполнения.Колонки.Добавить("ПредставлениеОбъектаЗаполнения");
   ТаблицаОбъектовДляЗаполнения.Колонки.Добавить("СписокРеквизитов");
   
   СписокОбъектовДляЗаполнения = Новый СписокЗначений;
      Для каждого ТекДокумент Из Метаданные.Документы Цикл
      
      Если ТекДокумент.Реквизиты.Количество() = 0 Тогда
         Продолжить;
      КонецЕсли;
      НоваяСтрока = ТаблицаОбъектовДляЗаполнения.Добавить();
      НоваяСтрока.ОбъектЗаполнения             = Документы[ТекДокумент.Имя].ПустаяСсылка();
      НоваяСтрока.ИмяОбъектаЗаполнения          = ТекДокумент.Имя;
      НоваяСтрока.ПредставлениеОбъектаЗаполнения    = ТекДокумент.Синоним;
      
      СписокРеквизитов = Новый СписокЗначений;
      Для каждого ТекРеквизит Из ТекДокумент.Реквизиты
         Цикл
         СписокРеквизитов.Добавить(ТекРеквизит.Имя, ТекРеквизит.Синоним);
      КонецЦикла;
      НоваяСтрока.СписокРеквизитов = СписокРеквизитов;
      СписокОбъектовДляЗаполнения.Добавить(ТекДокумент.Имя, ТекДокумент.Синоним);
   КонецЦикла;
КонецПроцедуры



Процедура ПриОткрытии()
    ОпределитьСписокОбъектовЗаполнения();
КонецПроцедуры



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



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

//вот тут конечно ошибка!


//ТипРезультата = РезультатВыбора.Тип;
//ТекущиеДанные.ЗначениеРеквизита = ПолучитьТипРеквизита(ЭлементыФормы.ФормируемыеДокументы.ТекущиеДанные.ПредставлениеОбъекта,ТекущиеДанные.РеквизитПредставление).ПривестиЗначение(ТекущиеДанные.ЗначениеРеквизита);

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



Процедура СодержаниеДокументовПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
   ТС = ЭлементыФормы.ФормируемыеДокументы.ТекущаяСтрока;
   ПредставлениеОбъекта=ТС.ПредставлениеОбъекта;
   Элемент.ТекущаяСтрока.ПредставлениеОбъекта = ПредставлениеОбъекта;
КонецПроцедуры


Процедура ПанельПриСменеСтраницы(Элемент, ТекущаяСтраница)
   Если ЭлементыФормы.Панель.ТекущаяСтраница = ЭлементыФормы.Панель.Страницы.СодержаниеДокументов  Тогда
      ТекДанные = ЭлементыФормы.ФормируемыеДокументы.ТекущаяСтрока;
      Если НЕ ТекДанные = Неопределено Тогда
            ПредставлениеОбъекта = ТекДанные.ПредставлениеОбъекта;
            СсылкаОбъекта = ТекДанные.СсылкаОбъекта;

            ЭлементОтбор = ЭлементыФормы.СодержаниеДокументов.ОтборСтрок;
            Отбор = ЭлементОтбор.ПредставлениеОбъекта;
            Отбор.ВидСравнения  =  ВидСравнения.Равно;
            Отбор.Значение      =  ПредставлениеОбъекта;
            Отбор.Использование = Истина;   
         КонецЕсли;
      КонецЕсли;
КонецПроцедуры




Р.S. прошу прощения, что так некрасиво. не нашла, как вставить листинг кода как в конфигураторе(


Теги:

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

Рейтинг@Mail.ru

Поиск