Имя: Пароль:
1C
1С v8
Как по ОЛЕ в 8.3 создать новый объект?
0 megalira
 
28.02.14
18:58
Делаю так АБаза[типСтрокой][Сред(строкаТип, поз +1)].ПолучитьСсылку(АБаза.NewObject("УникальныйИдентиф икатор", Выборка.УИД))
не работает, смотрю в отлачике чему ранво
АБаза.NewObject("УникальныйИдентификатор", Выборка.УИД)
оно равно **(1)}: **(1)}: Метод объекта не обнаружен (NewObject)
подскажите пожалуйста, как лечить?
1 VitShvets
 
28.02.14
19:55
Проверяй чему равен "Выборка.УИД". Оно похожим образом ругается, когда не может преобразовать строку в идентификатор.
2 Torquader
 
01.03.14
00:47
Во-первых, Строка(Выборка.УИД), чтобы явно была строка, так как ГУИД для "той" базы - загадка.
Во-вторых, NewObject работает только во внешнем соединении.
3 Torquader
 
01.03.14
00:51
В режиме Automation не всегда "съедается" второй параметр.
Если не получится, то можно
ГуидТам=АБаза.Вычислить("Новый УникальныйИдентификатор("""+Строка(Выборка.Гуид)+""");");
4 megalira
 
02.03.14
22:15
(3) спасибо, попробую
5 wowik
 
03.03.14
09:14
6 megalira
 
04.03.14
09:20
(3) Теперь говорит:
"{ВнешняяОбработка.ВыгрузкаДокументов.МодульОбъекта(148)}: Метод объекта не обнаружен (Вычислить)
        ГуидТам=АБаза.Вычислить("Новый УникальныйИдентификатор("""+Строка(Выборка.УИД)+""");");
"
(5)  спасибо, почитаю
7 Wobland
 
04.03.14
09:21
(6) странная АБаза, правда?
8 Мимохожий Однако
 
04.03.14
09:25
Может быть на хвостике надо
+""")");
9 Cube
 
04.03.14
09:27
(0) Как абазу-то свою получил покажи...
10 Wobland
 
04.03.14
09:30
(9) решил зарубить ветку в самом начале?
11 Cube
 
04.03.14
09:33
(10) Ты уже одного с табличным документом загнобил сегодня))) Хватит)
12 megalira
 
04.03.14
10:12
(9) Вот так АБазу получил:
"функция ПодключитьсяКИнформационнойБазе(АОрганизация) экспорт
    //сначала найдем базу
    Запрос=Новый Запрос;
    Запрос.Текст=
    "ВЫБРАТЬ
    |    шапВнешниеБазы.Сервер,
    |    шапВнешниеБазы.База,
    |    шапВнешниеБазы.Пользователь,
    |    шапВнешниеБазы.Пароль,
    |    шапВнешниеБазы.Файл,
    |    шапВнешниеБазы.Тип,
    |    шапВнешниеБазы.Наименование,
    |    шапВнешниеБазы.Ссылка
    |ИЗ
    |    Справочник.шапВнешниеБазы КАК шапВнешниеБазы
    |ГДЕ
    |    шапВнешниеБазы.Организация = &Организация"
    ;
    Запрос.УстановитьПараметр("Организация",АОрганизация);
    Выборка=Запрос.Выполнить().Выбрать();    
    
    если НЕ Выборка.Следующий() тогда
        Сообщить("Удаленная база не найдена для орагниазции "+Строка(АОрганизация),СтатусСообщения.ОченьВажное);        
        возврат Неопределено;
    конецесли;    
    
    //подключимся к базе
    лБаза = Новый COMОбъект("V83.Application");
    Попытка
        если Выборка.Тип=Перечисления.шапТипБаз1С.Серверная тогда
            Открытие=лБаза.Connect("Srvr="""+Выборка.Сервер+""";Ref="""+Выборка.База+""";Usr="""+
                Выборка.Пользователь+""";Pwd=""" +Выборка.Пароль + """;");
        иначе
            Открытие=лБаза.Connect("file="""+Сокрлп(Выборка.Файл)+""";Usr="""+
                Выборка.Пользователь+""";Pwd=""" +Выборка.Пароль + """;");
        конецесли;    
    Исключение
        сообщить("Ошибка открытия базы данных "+строка(Выборка.Наименование)+
            " "+ОписаниеОшибки(),СтатусСообщения.ОченьВажное);
        Возврат Неопределено;
    КонецПопытки;    
    возврат Новый Структура("База, ВнешняяБаза",лБаза,Выборка.Ссылка);
конецфункции
"
Поле "База" возвращенной структуры
13 Wobland
 
04.03.14
10:14
(12) не вижу слова "АБаза"
14 megalira
 
04.03.14
10:22
(13) Хорошо, привожу всю цепочку:
функция ВыгрузитьОбъект(АОбъект,АОрганизация)
    стр=мТЗ.Найти(АОрганизация,"Организация");
    если стр=Неопределено тогда
        стр=мТЗ.Добавить();
        стр.Организация=АОрганизация;
        лБаза=ПодключитьсяКИнформационнойБазе(АОрганизация);
        стр.База=лБаза.База;
        стр.ВнешняяБаза=лБаза.ВнешняяБаза;
        если стр.База=Неопределено тогда
            Предупреждение("Не смогли подключиться к базе организации "+строка(стр.Организация));
            возврат ложь;
        конецесли;
    конецесли;
    если ТипЗнч(АОбъект)=Тип("ДокументСсылка.ПоступлениеТоваровУслуг") тогда
        ВыгрузитьПоступление(АОбъект,стр.База,стр.ВнешняяБаза);    
    конецесли;
    возврат истина;
конецфункции

потом заходим в ВыгрузитьПоступление:
Процедура ВыгрузитьПоступление(АОбъект,АБаза,АВнешняяБаза) экспорт
    мудВалюта=АБаза.Константы.ВалютаРегламентированногоУчета.Получить();            
    удДокСсылка=НайтиСсылкуПоСоответствию(АБаза,АОбъект,АВнешняяБаза);
...

заходим в НайтиСсылкуПоСоответствию:
функция НайтиСсылкуПоСоответствию(АБаза, АОбъект, АВнешняяБаза)
    Запрос=Новый Запрос;
    Запрос.Текст=
    "ВЫБРАТЬ
    |    шапСоответствиеЗагружаемыхОбъектовИзУТ.УИД
    |ИЗ
    |    РегистрСведений.шапСоответствиеЗагружаемыхОбъектов КАК шапСоответствиеЗагружаемыхОбъектовИзУТ
    |ГДЕ
    |    шапСоответствиеЗагружаемыхОбъектовИзУТ.Объект = &Объект
    |    И шапСоответствиеЗагружаемыхОбъектовИзУТ.ИБ = &ИБ"
    ;
    Запрос.УстановитьПараметр("Объект",АОбъект);
    Запрос.УстановитьПараметр("ИБ",АВнешняяБаза);
    Выборка=Запрос.Выполнить().Выбрать();
    если Выборка.Следующий() тогда
        
          строкаТип = АОбъект.Метаданные().ПолноеИмя();
        поз = Найти(строкаТип, ".");
        типСтрокой = мСоответствияЕдЧМнЧ[Лев(строкаТип, поз - 1)];
        //АБаза[типСтрокой][Сред(строкаТип, поз +1)].ПолучитьСсылку(АБаза.NewObject("УникальныйИдентификатор", Строка(АОбъект.УникальныйИдентификатор())));
        //лЗнач=АБаза[типСтрокой][Сред(строкаТип, поз +1)].ПолучитьСсылку(АБаза.NewObject("УникальныйИдентификатор", Выборка.УИД));
        ГуидТам=АБаза.Вычислить("Новый УникальныйИдентификатор("""+Строка(Выборка.УИД)+""");");
        //ГуидТам=АБаза.EvalExpr("Новый УникальныйИдентификатор("""+Строка(Выборка.УИД)+""");");
        лЗнач=АБаза[типСтрокой][Сред(строкаТип, поз +1)].ПолучитьСсылку(ГуидТам);
        возврат лЗнач;
        
...
15 Wobland
 
04.03.14
10:24
нет, чтобы почувствовать себя мужиком и взять отладчик. теперь придётся ещё мТЗ разъяснять
16 Cube
 
04.03.14
10:25
(14) стр=мТЗ.Добавить();
...
стр.База=лБаза.База;

Ты что, хранишь подключение к базе в ТЗ? Ну и как, получается?
17 megalira
 
04.03.14
10:26
(16) А где его хранить, если у меня не одно, а несколько подключений, и при том заранее неизвестно, сколько?
18 megalira
 
04.03.14
10:27
(15) Дык в отладчике АБаза равно COM Объект
19 Wobland
 
04.03.14
10:29
(18) 67 минут. так себе результат
20 megalira
 
04.03.14
10:57
(19) в смысле 67 минут?
21 Cube
 
04.03.14
11:59
(17) Я бы через Соответствие делал...
А ещё не через Application, а через COMConnector (быстрее в 10 раз)

Может у тебя проблема в платформе 8.3?
22 hhhh
 
04.03.14
15:08
если ТипЗнч(АОбъект)=Тип("ДокументСсылка.ПоступлениеТоваровУслуг") тогда

а это что за странное сравнение? тип из этой базы, объект из той?
23 megalira
 
04.03.14
20:09
(22) АОбъект - это объект из этой базу. И он выгружается в ту.
24 megalira
 
04.03.14
20:51
(21) Сделал через соответствие:
функция ВыгрузитьОбъект(АОбъект,АОрганизация)
    стр=мТЗ.Найти(АОрганизация,"Организация");
    если стр=Неопределено тогда
        стр=мТЗ.Добавить();
        стр.Организация=АОрганизация;
        лБаза=ПодключитьсяКИнформационнойБазе(АОрганизация);        
        если лБаза.База=Неопределено тогда
            Предупреждение("Не смогли подключиться к базе организации "+строка(стр.Организация));
            возврат ложь;
        конецесли;
        мСоответствие.Вставить(АОрганизация, лБаза.База);
        стр.ВнешняяБаза=лБаза.ВнешняяБаза;
    конецесли;
    если ТипЗнч(АОбъект)=Тип("ДокументСсылка.ПоступлениеТоваровУслуг") тогда
        ВыгрузитьПоступление(АОбъект,мСоответствие.Получить(АОрганизация),стр.ВнешняяБаза);    
    конецесли;
    возврат истина;
конецфункции

попробую сделать через COMConnector.
Платформа куда грузить: 1С:Предприятие 8.3 (8.3.4.408)
откуда: 1С:Предприятие 8.2 (8.2.19.83)
25 megalira
 
04.03.14
20:52
(23) ЗЫ. Через соответствии не помогло
26 hhhh
 
04.03.14
23:04
наверно так

АБаза.Вычислить("ГуидТам = Новый УникальныйИдентификатор("""+Строка(Выборка.УИД)+""");");
27 megalira
 
04.03.14
23:21
(26) Дык так он ГуидТам  вычислит ТАМ, а мне то нужно ЗДЕСЬ.
28 Torquader
 
04.03.14
23:23
(27) Если нужно ГУИД здесь, то нужно ГУИД там преобразовать в строку, передать сюда и здесь уже из него сделать обратно ГУИД.
29 megalira
 
04.03.14
23:55
(28) А какая разница, если я просто передам строку ТУДА? Дело в том что ЗДЕСЬ у меня храниться строка ГУИДА, который ТАМ.
30 Torquader
 
05.03.14
00:45
(29) Строку можно передавать куда угодно, от этого она не перестанет быть строкой.
31 megalira
 
05.03.14
08:31
(30) Ну я по сути, так и делаю, беру ОТСЮДА строку ГУИДА, который ТАМ, передаю его ТУДА и получаю ТОТ ГУИД СЮДА, но почему то не работает.
32 megalira
 
05.03.14
09:41
(21) Через COMConnection это я так понимаю, то  что вернуло лБаза.Connect? Я правильно понял?
Дело в том, что это не работает вообще. Когда я сделал так

"...
    лБаза = Новый COMОбъект("V83.Application");
    Попытка
        если Выборка.Тип=Перечисления.шапТипБаз1С.Серверная тогда
            Открытие=лБаза.Connect("Srvr="""+Выборка.Сервер+""";Ref="""+Выборка.База+""";Usr="""+
                Выборка.Пользователь+""";Pwd=""" +Выборка.Пароль + """;");
        иначе
            Открытие=лБаза.Connect("file="""+Сокрлп(Выборка.Файл)+""";Usr="""+
                Выборка.Пользователь+""";Pwd=""" +Выборка.Пароль + """;");
        конецесли;    
    Исключение
        сообщить("Ошибка открытия базы данных "+строка(Выборка.Наименование)+
            " "+ОписаниеОшибки(),СтатусСообщения.ОченьВажное);
        Возврат Неопределено;
    КонецПопытки;    
//    возврат Новый Структура("База, ВнешняяБаза",лБаза,Выборка.Ссылка);
    возврат Новый Структура("База, ВнешняяБаза",Открытие,Выборка.Ссылка);
"
то теперь стало материться вот на эту строку:

мудВалюта=АБаза.Константы.ВалютаРегламентированногоУчета.Получить();

типа поле агрегатного объекта не обнаружено
33 hhhh
 
05.03.14
09:55
попробуйте

ГуидТам=АБаза.Вычислить("Новый УникальныйИдентификатор("""+XMLСтрока(Выборка.УИД)+""");");


потому что Строка() по-дурацки обычно работает.
34 megalira
 
05.03.14
10:50
Спасибо всем.
Оказалось, что этот объект просто удален был из базы. Победили проблему вот такие строки:
        если Найти(АБаза.String(лЗнач),"Объект не найден")>0 тогда
            возврат Неопределено;
        конецесли;
35 Torquader
 
05.03.14
14:31
(34) Ну, как видишь, собака зарыта в соседней будке, а телепаты здесь ещё не дошло до того, чтобы угадывать содержимое базы удалённо.
36 megalira
 
05.03.14
14:33
(35) Зато тема послужит другим уроком.