|
Поиск по коду справочника неизвестного заранее вида | ☑ | ||
---|---|---|---|---|
0
stmnf
02.04.15
✎
05:05
|
Пока еще вник до конца в работу с метаданными и типами данных. Написал вот такую функцию:
Функция СвязатьПоКоду (Тип, Код, Родитель="", Владелец="") Экспорт ИмяСпр = Метаданные.НайтиПоТипу(Тип).Имя; Спр = Справочники[ИмяСпр]; Элемент = Спр.НайтиПоКоду(Код,,Родитель,Владелец); Возврат (Элемент); КонецФункции Передается тип и код, возвращается ссылка на элемент. Не слишком ли коряво, может, можно проще? Смущает действие по поиску имени справочника. |
|||
1
Cube
02.04.15
✎
05:34
|
(0) Семерошник что-ли?
Функция СвязатьПоКоду (Тип, Код, Родитель = Неопределено, Владелец = Неопределено) Экспорт Запрос = Новый Запрос("ВЫБРАТЬ | ВыбранныйСправочник.Ссылка |ИЗ | Справочник." + Тип + " КАК ВыбранныйСправочник |ГДЕ | ВыбранныйСправочник.Код = &Код | И ВыбранныйСправочник.Родитель = &Родитель | И ВыбранныйСправочник.Владелец = &Владелец"); Если Родитель = Неопределено Тогда Запрос.Текст = СтрЗаменить(Запрос.Текст, "И ВыбранныйСправочник.Родитель = &Родитель", "Истина"); Иначе Запрос.УстановитьПараметр("Родитель", Родитель); КонецЕсли; Если Владелец = Неопределено Тогда Запрос.Текст = СтрЗаменить(Запрос.Текст, "И ВыбранныйСправочник.Владелец = &Владелец", "Истина"); Иначе Запрос.УстановитьПараметр("Владелец", Владелец); КонецЕсли; Запрос.УстановитьПараметр("Код", Код); Выборка = Запрос.Выполнить().Выбрать(); Возврат ?(Выборка.Следующий(), Выборка.Ссылка, ПредопределенноеЗначение("Справочник." + Тип + ".ПустаяСсылка")); КонецФункции |
|||
2
Cube
02.04.15
✎
05:36
|
А лучше так:
Функция СвязатьПоКоду (Тип, Код, Родитель = Неопределено, Владелец = Неопределено) Экспорт Запрос = Новый Запрос("ВЫБРАТЬ | ВыбранныйСправочник.Ссылка |ИЗ | Справочник." + Тип + " КАК ВыбранныйСправочник |ГДЕ | ВыбранныйСправочник.Код = &Код | И ВыбранныйСправочник.Ссылка В ИЕРАРХИИ (&Родитель) | И ВыбранныйСправочник.Владелец = &Владелец"); Если Родитель = Неопределено Тогда Запрос.Текст = СтрЗаменить(Запрос.Текст, "И ВыбранныйСправочник.Ссылка В ИЕРАРХИИ (&Родитель)", "Истина"); Иначе Запрос.УстановитьПараметр("Родитель", Родитель); КонецЕсли; Если Владелец = Неопределено Тогда Запрос.Текст = СтрЗаменить(Запрос.Текст, "И ВыбранныйСправочник.Владелец = &Владелец", "Истина"); Иначе Запрос.УстановитьПараметр("Владелец", Владелец); КонецЕсли; Запрос.УстановитьПараметр("Код", Код); Выборка = Запрос.Выполнить().Выбрать(); Возврат ?(Выборка.Следующий(), Выборка.Ссылка, ПредопределенноеЗначение("Справочник." + Тип + ".ПустаяСсылка")); КонецФункции |
|||
3
forforumandspam
02.04.15
✎
06:10
|
(1) По-моему, это ты - семёрочник. :)
|
|||
4
Cube
02.04.15
✎
09:06
|
(3) Обоснуешь?)
|
|||
5
D_E_S_131
02.04.15
✎
09:51
|
(0) А откуда ты берешь Тип для передачу в эту функцию? Просто интересна "природа" этой задачи...
|
|||
6
stmnf
02.04.15
✎
13:16
|
Тип беру из свойств метаданных реквизитов документов:
Для Каждого РеквДок из Метаданные.Документы[ИмяДока].Реквизиты Цикл ТипРеквизита = РеквДок.Тип; И передаю в функцию потом ТипРеквизита.Типы()[0] Что-то это мне уже напоминает всякие С-шные извраты. Указателей только не хватает :) Ну а задача связана с переносом данных |
|||
7
Ma3eIIa
02.04.15
✎
13:17
|
а не проще КД ?
|
|||
8
Ma3eIIa
02.04.15
✎
13:17
|
выгружаешь структуру базы источника и приемника. и делаешь свой обмен. и споконой через обработку обмен данных хмл. выгружаешь и загружаешь данные
|
|||
9
stmnf
02.04.15
✎
13:18
|
(1) Городить текста на полстраницы - не в моем стиле, когда можно обойтись 4 строчками. Или даже одной:
Возврат (Справочники[Метаданные.НайтиПоТипу(Тип).Имя].НайтиПоКоду(Код,,Родитель,Владелец)); |
|||
10
Ma3eIIa
02.04.15
✎
13:19
|
(9) а если ошибка будет ?
|
|||
11
stmnf
02.04.15
✎
13:23
|
(7) Да черт его знает. Перегружать надо из 7-ки, и не все подряд, а отдельные виды документов и справочников. Решил, что через ОЛЕ проще.
|
|||
12
hhhh
02.04.15
✎
13:24
|
(6) ну вот же есть Метаданные.Документы[ИмяДока]
ИмяДока - это имя. Зачем вы его разыскиваете, если изначально оно есть? |
|||
13
hhhh
02.04.15
✎
13:25
|
а, понял
|
|||
14
stmnf
02.04.15
✎
13:25
|
(12) Это имя дока, и мне нужно имя типа реквизита. Например, "Номенклатура".
|
|||
15
stmnf
02.04.15
✎
13:27
|
Хотя странно, неужели нет возможности получить менеджер справочника напрямую по типу?
|
|||
16
forforumandspam
02.04.15
✎
13:32
|
(6) А если перечисление, документ или ещё что-то?
|
|||
17
forforumandspam
02.04.15
✎
13:40
|
(4) В семёрке так текст запроса кромсают в зависимости от условий.
|
|||
18
stmnf
02.04.15
✎
13:45
|
(17) Так я же сам руками вызываю эту функцию когда нужно. Просто чуть упростил процесс, чтобы не писать каждый раз что-нибудь в духе
Владелец = Справочники.Номенклатура.НайтиПоКоду(стПривестиНомерКДлине(СправV7.Владелец.Код, 11)); Если Владелец <> Неопределено И Владелец.Пустая() = ЛОЖЬ Тогда НовыйСпрV8.Владелец = Владелец; Иначе Продолжить; КонецЕсли; |
|||
19
stmnf
02.04.15
✎
13:47
|
В перспективе - еще чуть автоматизировать, чтобы связь выбиралась из формы. Тогда функция точно понадобится.
|
|||
20
stmnf
02.04.15
✎
14:06
|
Вообще, это я допиливаю одну обработку-заготовку с инфостарта (http://infostart.ru/public/84269/). Она сама подключается к базе через ОЛЕ, выдает список всех реквизитов и делает заготовку для ручного кодирования переноса реквизитов. То есть всю "грязную" работу берет на себя.
Добавил уже выбор значений реквизитов по умолчанию, теперь вот хочу, чтобы поиск справочников по коду или другому реквизиту устанавливался парой щелчков мыши. |
|||
21
D_E_S_131
02.04.15
✎
14:21
|
(6) Ясно, значит скоро будет "новый нетленный велик"...
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |