Имя: Пароль:
1C
 
Как из ОписаниеТипов получить переменную типа Менеджер?
0 DJ Anthon
 
06.02.11
11:01
К примеру, есть переменная, полученная функцией Тип("СправочникСсылка.Банки"), то есть типа ОписаниеТипов, со значением справочника Банки.
Как получить из нее переменную типа СправочникМенеджер.Банки со значением Справочники.Банки?

Для чего нужно? Вешаю событие на поле ввода, с ограничением типов. В событии есть только переменная Элемент.ОграничениеТипа, содержащая хоть какую-то информацию о том, какой тип может быть, но заранее набор реквизитов недоступен. При этом надо по определенным условиям отобрать список ссылок, для этого необходим соответствующий СправочникМенеджер или ДокументМенеджер. Строки "СправочникСсылка.Банки" тоже нет.
8.2.13
1 DJ Anthon
 
06.02.11
11:08
Вот так правильно?
Справочники[СокрЛП(Элемент.ОграничениеТипа)]
2 Либерал
 
06.02.11
11:11
попробуй вместо СокрЛП(Элемент.ОграничениеТипа) получить Метаданные.Имя (или как там правильный синтаксис)
3 Либерал
 
06.02.11
11:12
метаданные можно же через тип? а у них есть "имя", верно?
4 DJ Anthon
 
06.02.11
11:19
СокрЛП(Элемент.ОграничениеТипа) дает синоним. а мне имя надо получить из Типа
5 DJ Anthon
 
06.02.11
11:20
Чтобы объект метаданных по синониму найти, на всё перебирать? более быстрого способа нет? в принципе, скорость не особо критична, действие одноразовое при интерактивном способе, но хотелось бы найти правильный и универсальный способ.
6 DJ Anthon
 
06.02.11
11:20
а как через тип?
7 DJ Anthon
 
06.02.11
11:22
НайтиПоТипу(<Тип>)  ураааа!!!
8 DJ Anthon
 
06.02.11
11:37
вот такое решение получилось. кошмар)) сейчас немного подшлифую... а всего лишь хотел, чтобы вместо значения можно было ввести произвольную строку для нового элемента.

Процедура НачалоВыбора(Элемент, СтандартнаяОбработка)
   СтандартнаяОбработка = Ложь;
   Если Элемент.ОграничениеТипа.Типы().Количество() = 0 Тогда
       Возврат;
   КонецЕсли;
   Объект = Метаданные.НайтиПоТипу(Элемент.ОграничениеТипа.Типы()[0]);
   Если Объект = Неопределено Тогда
       Возврат;
   КонецЕсли;
   ПолноеИмя = СтрЗаменить(Метаданные.НайтиПоТипу(Элемент.ОграничениеТипа.Типы()[0]).ПолноеИмя(), ".", "Ссылка.");
   Если Найти(ПолноеИмя, "СправочникСсылка.") <> 0 Тогда
       Объект = Справочники[Объект.Имя];
   ИначеЕсли Найти(ПолноеИмя, "ДокументСсылка.") <> 0 Тогда
       Объект = Документы[Объект.Имя];
   Иначе
       Возврат;
   КонецЕсли;
   ФормаВвода = Объект.ПолучитьФормуВыбора(, Элемент.ОграничениеТипа);
   ФормаВвода.НачальноеЗначениеВыбора = НайтиСсылку(Отбор(Элемент.Значение,
       ?(Найти(ПолноеИмя, "СправочникСсылка.") = 0, "Номер", "Код")), ПолноеИмя, Объект);
   Рез = ФормаВвода.ОткрытьМодально();
   Если Рез <> Неопределено Тогда
       Элемент.Значение = Рез;
   КонецЕсли;
КонецПроцедуры
9 DJ Anthon
 
06.02.11
11:40
а вот используемые функции НайтиСсылку и Отбор:

Функция Отбор(Значение1 = Неопределено, Имя1 = Неопределено, Значение2 = Неопределено, Имя2 = Неопределено,
   Значение3 = Неопределено, Имя3 = Неопределено, Значение4 = Неопределено, Имя4 = Неопределено,
   Значение5 = Неопределено, Имя5 = Неопределено, Значение6 = Неопределено, Имя6 = Неопределено,
   Значение7 = Неопределено, Имя7 = Неопределено, Значение8 = Неопределено, Имя8 = Неопределено,
   Значение9 = Неопределено, Имя9 = Неопределено, Значение10 = Неопределено, Имя10 = Неопределено)
   Структура = Новый СписокЗначений;
   Если Имя1 <> Неопределено Тогда
       Структура.Добавить(Значение1, Имя1, Истина);
   КонецЕсли;
   Если Имя2 <> Неопределено Тогда
       Структура.Добавить(Значение2, Имя2, Истина);
   КонецЕсли;
   Если Имя3 <> Неопределено Тогда
       Структура.Добавить(Значение3, Имя3, Истина);
   КонецЕсли;
   Если Имя4 <> Неопределено Тогда
       Структура.Добавить(Значение4, Имя4, Истина);
   КонецЕсли;
   Если Имя5 <> Неопределено Тогда
       Структура.Добавить(Значение5, Имя5, Истина);
   КонецЕсли;
   Если Имя6 <> Неопределено Тогда
       Структура.Добавить(Значение6, Имя6, Истина);
   КонецЕсли;
   Если Имя7 <> Неопределено Тогда
       Структура.Добавить(Значение7, Имя7, Истина);
   КонецЕсли;
   Если Имя8 <> Неопределено Тогда
       Структура.Добавить(Значение8, Имя8, Истина);
   КонецЕсли;
   Если Имя9 <> Неопределено Тогда
       Структура.Добавить(Значение9, Имя9, Истина);
   КонецЕсли;
   Если Имя10 <> Неопределено Тогда
       Структура.Добавить(Значение10, Имя10, Истина);
   КонецЕсли;
   Возврат Структура;
КонецФункции


Функция НайтиСсылку(Отбор = Неопределено, ИмяТипа, Менеджер, Владелец = Неопределено, Создавать = Истина)
   Если ТипЗнч(Отбор) = Тип(ИмяТипа) Тогда
       Возврат Отбор.Ссылка;
   ИначеЕсли ТипЗнч(Отбор) = Тип("Число") Тогда
       Если Отбор = 0 Тогда
           Возврат Менеджер.ПустаяСсылка();
       Иначе
           Объект = Менеджер.Выбрать(, Владелец);
           Для Сч = 1 По Отбор Цикл
               Объект.Следующий();
           КонецЦикла;
           Возврат Объект.Ссылка;
       КонецЕсли;
   ИначеЕсли Отбор = "" Тогда
       Возврат Менеджер.ПустаяСсылка();
   ИначеЕсли Отбор = Неопределено Тогда
       Возврат Менеджер.ПустаяСсылка();
   ИначеЕсли ТипЗнч(Отбор) = Тип("СписокЗначений") Тогда
       Если Отбор.Количество() > 0 Тогда
           Если ТипЗнч(Отбор[0].Значение) = Тип(ИмяТипа) Тогда
               Возврат Отбор[0].Значение;
           ИначеЕсли Отбор[0].Значение = "" Тогда
               Возврат Менеджер.ПустаяСсылка();
           ИначеЕсли Отбор[0].Значение = Неопределено Тогда
               Возврат Менеджер.ПустаяСсылка();
           КонецЕсли;
       КонецЕсли;
   КонецЕсли;
   Объект = Менеджер.ПустаяСсылка();
   
   Запрос = Новый Запрос;
   Условие = "";
   Для Сч = 0 По Отбор.Количество() - 1 Цикл
       Запрос.УстановитьПараметр(Отбор[Сч].Представление, Отбор[Сч].Значение);
       Условие = Условие + СтрЗаменить("    Объект." + Отбор[Сч].Представление + " = &" + Отбор[Сч].Представление + ?(Сч = Отбор.Количество() - 1, "", " И"), """", """""");
   КонецЦикла;
   Запрос.Текст = "
   |ВЫБРАТЬ
   |    Объект.Ссылка
   |ИЗ
   |    " + СтрЗаменить(СтрЗаменить(ИмяТипа, "ДокументСсылка.", "Документ."), "СправочникСсылка.", "Справочник.") + " КАК Объект
   |ГДЕ
   |    " + Условие + "
   |";
   
   Результат = Запрос.Выполнить().Выбрать();
   
   Пока Результат.Следующий() Цикл
       Объект = Результат.Ссылка;
       Прервать;
   КонецЦикла;
   
   Если (Объект <> Менеджер.ПустаяСсылка()) ИЛИ Создавать = Ложь Тогда
       Возврат Объект;
   КонецЕсли;
   Объект = Менеджер.СоздатьЭлемент();
   Если Владелец <> Неопределено Тогда
       Объект.Владелец = Владелец;
   КонецЕсли;
   Если ТипЗнч(Создавать) = Тип("СписокЗначений") Тогда
       Для Сч = 0 По Создавать.Количество() - 1 Цикл
           Объект[Создавать[Сч].Представление] = Создавать[Сч].Значение;
       КонецЦикла;
   КонецЕсли;
   Объект.Записать();
   Возврат Объект.Ссылка;
КонецФункции
10 Mitriy
 
06.02.11
12:03
ПустаяСсылка = Новый (Элемент.ОграничениеТипа.Типы()[0]);
11 DJ Anthon
 
06.02.11
12:17
так. теперь мне надо получсить реквизит формы.
конструкция ФормаВвода["УчреждениеОтбор"] работает.
а как проверить, что такой реквизит у формы есть?
12 DJ Anthon
 
06.02.11
12:52
ура. все работает. только-только хватило "неиспользуемых" реквизитов, чтобы передать необходимые данные.

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






Для СчКол = 0 По ЭлементыФормы.Доки.Колонки.Количество() - 1 Цикл
   Колонка = ЭлементыФормы.Доки.Колонки[СчКол];
.....
       ИначеЕсли Найти("|Документ|Контрагент|Договор|Руководитель|Бухгалтер|НомерСчетаПлательщика|НомерСчетаПолучателя|Фирма|БИКполучателя|", "|" + Колонка.Имя + "|") <> 0 Тогда
           Колонка.УстановитьЭлементУправления(Тип("ПолеВвода"));
           Колонка.ЭлементУправления.КнопкаОткрытия = Истина;
           Колонка.ЭлементУправления.КнопкаОчистки = Истина;
           Колонка.ЭлементУправления.КнопкаВыбора = Истина;
           Колонка.ЭлементУправления.ОграничениеТипа = Новый ОписаниеТипов(Доки.Колонки[СчКол].ТипЗначения, , "Строка");
           Колонка.ЭлементУправления.УстановитьДействие("НачалоВыбора", Новый Действие("НачалоВыбора"));
           Колонка.ЭлементУправления.УстановитьДействие("Очистка", Новый Действие("Очистка"));
           Колонка.ЭлементУправления.УстановитьДействие("ОкончаниеВводаТекста", Новый Действие("ОкончаниеВводаТекста"));
           Если Колонка.Имя = "Договор" Тогда
               Колонка.ЭлементУправления.СписокВыбора = Отбор("Фирма", "УчреждениеОтбор", "Контрагент", "КонтрагентОтбор");
               Колонка.ЭлементУправления.СписокВыбора.ДоступныеЗначения = Отбор("Фирма", "Владелец", "Контрагент", "Контрагент");
           ИначеЕсли Колонка.Имя = "НомерСчетаПлательщика" Тогда
               Колонка.ЭлементУправления.СписокВыбора = Отбор("Контрагент", "ПараметрОтборПоВладельцу");
               Колонка.ЭлементУправления.СписокВыбора.ДоступныеЗначения = Отбор("Фирма", "Владелец");
           ИначеЕсли Колонка.Имя = "НомерСчетаПолучателя" Тогда
               Колонка.ЭлементУправления.СписокВыбора = Отбор("Фирма", "ПараметрОтборПоВладельцу");
               Колонка.ЭлементУправления.СписокВыбора.ДоступныеЗначения = Отбор("Фирма", "Владелец");
           КонецЕсли;
       КонецЕсли;
Независимо от того, куда вы едете — это в гору и против ветра!