Имя: Пароль:
1C
1C 7.7
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("ТипЗначенияСтр(ЗначениеИзСтрокиВнутр("""+СтрЗаменить(Олег.ЗначениеВСтрокуВнутр(Зна),"""","""""")+"""))"));
КонецФункции // ОЛЕ_ТипЗначенияСтр