|
v7: как определить ТипЗначения OLE | ☑ | ||
---|---|---|---|---|
0
oliver
06.01.14
✎
14:18
|
Привет всем! как определить ТипЗначения OLE-объекта? ТипЗначения(Объект) возвращает 100 ес-но.
|
|||
1
Рэйв
06.01.14
✎
14:19
|
оле или СОМ?
|
|||
2
oliver
06.01.14
✎
14:19
|
Извиняюсь. Вопрос по 7-ке
|
|||
3
oliver
06.01.14
✎
14:23
|
Просто порало в тему по 8-ке. Таки как?
|
|||
4
Torquader
06.01.14
✎
14:24
|
Можно попробовать через valueToStringInternal - какие-то объекты получится поймать, а остальное - только через функцию, которую нужно в глобальный модуль положить.
|
|||
5
oliver
06.01.14
✎
14:27
|
Надо определить справочник, перечисление или документ.
|
|||
6
Torquader
06.01.14
✎
14:28
|
(5) Тогда ValueToStringInternal в первой букве (после скобочки и кавычки) напишет то, что вам нужно.
|
|||
7
oliver
06.01.14
✎
14:35
|
Спасибо. Попробую
|
|||
8
Torquader
06.01.14
✎
14:38
|
А кстати, База1С.ValueType() не работает, что-ли ?
|
|||
9
oliver
06.01.14
✎
15:14
|
что-то не хочет.
ValueType(Объект)=100 ввв=Объект.ValueType(); {D:\1.ERT(417)}: Поле агрегатного объекта не обнаружено (ValueType) |
|||
10
2S
06.01.14
✎
15:16
|
ТипЗначенияСтр
|
|||
11
Torquader
06.01.14
✎
15:16
|
(8) Неа - не ест. Не все функции по OLE доступны.
|
|||
12
Torquader
06.01.14
✎
15:17
|
(10) Я ему в (6) уже предложил - и работает.
Только таблицу значений так не определишь. |
|||
13
2S
06.01.14
✎
15:18
|
(12) чего, чего?
|
|||
14
oliver
06.01.14
✎
15:18
|
Для справочника ValueToStringInternal вертает
"{"X","0","0","0","0","0",""}" . Так что можно |
|||
15
2S
06.01.14
✎
15:19
|
Нда, вы методы путаете, читайте ЖКК
|
|||
16
Torquader
06.01.14
✎
15:19
|
(14) Х - это неизвестный объект, если что.
Нужно вызывать в контексте той базы, в которой объект создан. |
|||
17
Torquader
06.01.14
✎
15:20
|
(15) ТипЗначенияСтр чужие объекты не понимает (а если мы лезем по OLE вообще из другого приложения, то у нас нет такого метода).
|
|||
18
Torquader
06.01.14
✎
15:22
|
Простенький пример показывает, что (10) Не работает, а (6) работает.
Set OneS=CreateObject("V77.Application") If OneS.Initialize(OneS.RmTrade,"/dC:\WORK\1С-ТИИ\","")<>True Then MsgBox "Error",0,"Error" WScript.Quit() End If Set OneSRef=OneS.CreateObject("Справочник.Проверка") MsgBox CStr(OneS.[ТипЗначенияСтр](OneSRef)),0,"Debug" |
|||
19
2S
06.01.14
✎
15:22
|
не мое
Функция ОЛЕОбъектТипЗначенияСтр(ОЛЕОбъект, Предприятие7) Экспорт Типы = Новый Соответствие; Типы["B"] = "Справочник"; Типы["O"] = "Документ"; Типы["T"] = "Счет"; Типы["P"] = "ПланСчетов"; Типы["K"] = "ВидСубконто"; Типы["C"] = "Календарь"; Типы["A"] = "ВидРасчета"; Типы["E"] = "Перечисление"; ТипСтрока = Типы[Прав(Лев(Предприятие7.ЗначениеВСтрокуВнутр(ОЛЕОбъект), 3), 1)]; Если ТипСтрока = Неопределено Тогда ТипСтрока = "Неопределенный"; КонецЕсли; Возврат ТипСтрока; КонецФункции |
|||
20
2S
06.01.14
✎
15:23
|
Если ТипСтрока = Неопределено Тогда
ТипСтрока = "Неопределенный"; КонецЕсли; выкидываем ) |
|||
21
Torquader
06.01.14
✎
15:27
|
(19) Это если из восьмёрки в семёрку.
|
|||
22
2S
06.01.14
✎
15:28
|
а ему что надо?
|
|||
23
Torquader
06.01.14
✎
15:32
|
(22) Так он разве из восьмёрки лезет ?
|
|||
24
oliver
06.01.14
✎
15:37
|
Надо определить,что таеое Объект - справочник, перечисление или документ. И все. Очень просто. Из 7-ки в 7-ку.
|
|||
25
oliver
06.01.14
✎
15:37
|
такое
|
|||
26
Torquader
06.01.14
✎
15:44
|
лстрТип=БазаОЛЕ.ЗначениеВСтрокуВнутр(ПроверяемыйТип);
лстрТип=Сред(лстрТип,3,1); Если лстрТип="B" Тогда Сообщить("Это справочник"); ИначеЕсли лстрТип="O" Тогда Сообщить("Это документ"); ИначеЕсли лстрТип="E" Тогда Сообщить("Это Перечисление"); Иначе Сообщить("А это мы не знаем"); КонецЕсли; |
|||
27
1Сергей
06.01.14
✎
15:45
|
(8) должно взлететь. Что-то oliver делает не так
|
|||
28
Torquader
06.01.14
✎
15:51
|
(27) Чужие объекты ТипЗначения не очень-то и видит, а в контексте базы - не работает см. (18).
|
|||
29
Злопчинский
06.01.14
✎
17:55
|
БазаОле.глРасшифровка = КакойТоОбъектУказывающийНаОлеБазуВлокальнойбазе;
Типатип = EvalExpr("глРасшифровка"); . не покатит? |
|||
30
Злопчинский
06.01.14
✎
17:55
|
Типатип = EvalExpr("ТипЗначенияСтр(глРасшифровка)");
|
|||
31
DJ Anthon
06.01.14
✎
20:05
|
возьми у меня отсюда, там я это даже в отдельную функцию вынес.
http://infostart.ru/public/96745/ п.с. это, кстати, нетривиальная задача... |
|||
32
DJ Anthon
06.01.14
✎
20:18
|
функция ВосстановитьАтрибут.
код привести не могу, ибо он специфический, но основная идея как в (19) и (26), только у меня она для расшифровки неопределенного типа, так что лучше будет объединить мое и (19) |
|||
33
Torquader
06.01.14
✎
20:35
|
(32) Если есть возможность вносить изменения в глобальный модуль, который доступен через EvalExpr, то проблем с получением типа нету.
А если в базу вносить изменения нельзя (или в данный момент нельзя), то приходится использовать танцы с бубном. |
|||
34
GreyK
06.01.14
✎
20:48
|
(33) Восьмёрошник?
|
|||
35
Torquader
06.01.14
✎
21:01
|
(34) Неа.
В восьмёрке всё просто и ясно - там выполнение кода можно штатно использовать, а также делать вызов с параметрами. |
|||
36
GreyK
06.01.14
✎
21:10
|
(35) И что там в восьмерке передается по Оле? Наверное справочники вы научились копипостировать :)
Вот в семерке всё просто, передаются по Оле только базовые типы, в том числе и "строка" и есть в СП описание функций ЗначениеВСтрокуВнутр и ЗначениеИзСтрокиВнутр, и этого хватает. |
|||
37
Torquader
06.01.14
✎
21:12
|
(36) Таки и там тоже передаются только простые типы - строки, числа и даты (ну ещё булево добавилось), а так, всё точно также.
Просто в восьмёрке у каждого объекта можно запросить метаданные (через Метаданные()), что позволяет работат с типами без проблем. |
|||
38
GreyK
06.01.14
✎
21:25
|
(37) В 7ке то-же можно. Примерно так:
ВК=ВнешнийИсточник.ЗначениеВСтрокуВнутр(ОбъектВИ); Тип=ВнешнийИсточник.EvalExpr("ТипЗначенияСтр(ЗначениеИзСтрокиВнутр("""+СтрЗаменить(ВК,"""","""""")+"""))"); Всё просто. |
|||
39
Torquader
06.01.14
✎
21:32
|
(38) Если ОбъектВИ - это таблица или текст, то метод не прокатит.
|
|||
40
GreyK
06.01.14
✎
21:41
|
(39) Ну я про определение объекта типа "Оле". А текст он и в Африке текст. А табличку по Оле определять незачем, если-уж сам создал, то зачем её тип определять?!
|
|||
41
Torquader
06.01.14
✎
21:51
|
(40) Для хранимых объектов строка ЗначениеВСтрокуВнутр возвращает строку, по которой однозначно можно определить тип объекта. Для тех, для кого возвращается пустая ссылка с первой буквой X ничего определить нельзя.
|
|||
42
Злопчинский
06.01.14
✎
21:53
|
Чего-то я не втыкаю.. в чем принципиальная трудность..? поясните...
Да, если в Оле-базе в ГМ нет ни одной "служебной" экспортной переменной - наверное есть трудности.. . в противном случае все решается вроде на раз...? . вот запили у себя в рабочем обмене своем: . ВыбКлиент = ОлеК.ТекущийЭлемент(); Сообщить("проверка 1: "+ТипЗначенияСтр(ВыбКлиент)); Оле.глРасшифровка = ВыбКлиент; Сообщить("проверка 2: "+Оле.EvalExpr("ТипЗначенияСтр(глРасшифровка)")); Сообщить("проверка 3: "+Оле.EvalExpr("глРасшифровка.Вид()")); Сообщить("проверка 4: "+Оле.глРасшифровка.Вид()); . проверка 1: OLE проверка 2: Справочник проверка 3: Номенклатура проверка 4: Номенклатура |
|||
43
GreyK
06.01.14
✎
21:57
|
(41) Как можно получить "Х" объект в 7шной базе открытой по Оле!?
|
|||
44
GreyK
06.01.14
✎
22:03
|
(42) Пить уже не хочется, всё-таки уже седьмой день "каникул" пошел :)
|
|||
45
Torquader
06.01.14
✎
22:08
|
(42) Если переменная есть и её имя известно, то, конечно, можно делать всё, что душе угодно.
А если нет, то получится не очень хорошо, особенно, если создать в удалённой базе таблицу и пытаться потом узнать, что в переменной живёт. Но это - гипотетическая ситуация. |
|||
46
Злопчинский
07.01.14
✎
04:01
|
(45) с трудом представляю себе ситуацию продуктивной работы по Лье в условиях незнания конфиги олешной базы...
|
|||
47
Pahomich
07.01.14
✎
08:31
|
Что за программист, который не знает, что передает?
|
|||
48
Torquader
07.01.14
✎
13:56
|
(46) Предположим, что есть обмен по OLE, в котором пользователь указывает базу А и базу Б, между которыми будут передаваться данные. Как система узнает, что за база А и какие переменные в ней есть (не разбирая Compound и код глобального модуля).
(47) Это гипотетическая ситуация, когда в переменной хрен знает что - а в остальных случаях в переменной будут только хранимые в базе значения, которые ЗначениеВСтрокуВнутр прекрасно преобразует в строку и обратно. Просто иногда из обработки, которая что-то делает, возвращается таблица значений, заполненная чем-то априори неизвестным. |
|||
49
GreyK
07.01.14
✎
14:18
|
(48) Так пойдет? Или обязательно по Оле показать?
ТЗ =СоздатьОбъект("ТаблицаЗначений"); ТЗ.НоваяКолонка("Документ",,,,,,,); Доки = СоздатьОбъект("Документ.РасходнаяНакладная"); Хватит = 10; Доки.ВыбратьДокументы(,); Пока Доки.ПолучитьДокумент() = 1 Цикл ТЗ.НоваяСтрока(); ТЗ.Документ = Доки.ТекущийДокумент(); Если ТЗ.КоличествоСтрок() = Хватит Тогда Прервать; КонецЕсли; КонецЦикла; ТЗВСтроку = ЗначениеВСтрокуВнутр(ТЗ); Сообщить(""+Лев(ТЗВСтроку,220)); ТЗИзСтроки = ЗначениеИзСтрокиВнутр(ТЗВСтроку); Сообщить(""+ТипЗначенияСтр(ТЗИзСтроки)); {"VT","1",{"0",{{"","0","0","0","","2"}, {"Документ","Документ","1","0","0",{"U","0","0","0","0","0"},"","0", { {"O","0","0","294","0","0"," 54 "}, {"O","0","0","294","0","0"," 55 "}, {"O","0","0","294" ТаблицаЗначений |
|||
50
Бертыш
07.01.14
✎
14:26
|
На всякий случай http://1cniku.ru/Articles/V8OLE.html
|
|||
51
Torquader
07.01.14
✎
14:48
|
(49) И что, ТаблицаЗначений как и СписокЗначений через ЗначениеВСтрокуВнутр прекрасно сохраняются и восстанавливаются, проблема бывает, если внутри ячейки лежит объект, который 1С не умеет сериализовать (то, что потом назвали "мутабельным значением").
Кстати, просто таблица так не складывается. |
|||
52
Torquader
07.01.14
✎
14:49
|
Кстати, ещё спор был, что быстрее - создавать новую таблицу значений или загрузить из строки.
|
|||
53
GreyK
07.01.14
✎
15:06
|
(51) "проблема бывает, если внутри ячейки лежит объект, который 1С не умеет сериализовать" !?
Чем-то напоминает детскую задачку: Как вытащить яблоко из бутылки? |
|||
54
Torquader
07.01.14
✎
15:31
|
(53) У меня вообще обмен чаще через текстовые файлы, так как OLE - "очень быстрая" вещь. Поэтому, проблем бывает меньше.
Просто, кто-то в 1С, кто писал OLE-сервер, посчитал, что функция ТипЗначенияСтр не должна быть доступна, тогда как ЗначениеВСтрокуВнутр - доступно. Могло бы быть иначе. |
|||
55
GreyK
07.01.14
✎
15:38
|
(54) Так функция ТипЗначенияСтр доступна, но нет способа задать её парраметр по Оле...
|
|||
56
Torquader
07.01.14
✎
15:54
|
(55) Функция недоступна, так как вызвать БазаОле.ТипЗначенияСтр нельзя, а то, что её можно вызвать через EvalExpr - неудивительно, так как это просто вычисление выражения на языке 1С, где доступны вообще все функции.
|
|||
57
dedmoroz777
07.01.14
✎
16:22
|
(0) через Попытку\Исключение
|
|||
58
Злопчинский
07.01.14
✎
16:30
|
вот блин капец... занем что в оле базе есть справочник.клиенты и больше ничего??? в огромном количестве случаев прокатит вариант (42). там где это не катит - скорее всего обмен будет не по оле а всякими мудотными иксемелями и прочея тряхомудией
|
|||
59
Torquader
07.01.14
✎
22:24
|
(58) глРасшифровка есть почти всех типовых, так что можно попробовать через попытку узнать, есть ли переменная.
P.S. у меня есть базы на семёрке вообще с пустым глобальным модулем, так как работают как движок для выполнения кода. |
|||
60
KishMish
08.01.14
✎
08:35
|
(0)Функция ОЛЕ_ТипЗначенияСтр(Зна)
Возврат(Олег.EvalExpr("ТипЗначенияСтр(ЗначениеИзСтрокиВнутр("""+СтрЗаменить(Олег.ЗначениеВСтрокуВнутр(Зна),"""","""""")+"""))")); КонецФункции // ОЛЕ_ТипЗначенияСтр |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |