Имя: Пароль:
1C
1С v8
через СОМ, передать ГУИД для нового документа
0 lirt82
 
13.12.17
07:07
Необходимо подключиться к базе через СОМ, и проверить существует ли документ Перемещения по гуиду, если не находит в подключенной базе тогда в ней же создает и присваивает гуид из базы источника и затем тянет данные в него. Проблема в присваивании гуида из базы источника для нового созданного документа.
    ЗапросCom = ПодключеннаяБаза.NewObject("Запрос");
    ЗапросCom.Текст = "ВЫБРАТЬ
    |    ПеремещениеТоваров.Ссылка КАК ДокМаркет
    |ИЗ
    |    Документ.ПеремещениеТоваров КАК ПеремещениеТоваров
    |ГДЕ
    |    ПеремещениеТоваров.Дата МЕЖДУ &ДатаНач И &ДатаКон
    |    И ПеремещениеТоваров.Проведен = ИСТИНА";
    
    ЗапросCom.УстановитьПараметр("ДатаНач", ЭтотОбъект.ДатаНач);
    ЗапросCom.УстановитьПараметр("ДатаКон", КонецДня(ЭтотОбъект.ДатаКон));
    
    Рез = ЗапросCom.Выполнить().Выбрать();
    
    Пока Рез.Следующий() Цикл
        ГУИДМаркет = ПодключеннаяБаза.String(Рез.ДокМаркет.УникальныйИдентификатор());
        ИщемДокВУПП(ГУИДМаркет);
    КонецЦикла;
    
    ПодключеннаяБаза = Неопределено;
    Сообщить("Обработка завершена!");
КонецПроцедуры

Функция ИщемДокВУПП(ГУИДМаркет)
    
    Список = СписокЭкспорт.Выгрузить();
    
    Для каждого Стр Из Список Цикл
        ГуидДокЭкспорт = Стр.ДокЭкспорт.УникальныйИдентификатор();
        ГУИДУПП = Строка(Стр.ДокЭкспорт.УникальныйИдентификатор());
        Если ГУИДМаркет = ГУИДУПП Тогда
            Продолжить;
        Иначе
            НовыйДок = ПодключеннаяБаза.Документы.ПеремещениеТоваров.СоздатьДокумент();
            Ссылка = НовыйДок.ПолучитьСсылку(Новый УникальныйИдентификатор(ГуидДокЭкспорт));
            НовыйДок.УстановитьСсылкуНового(Ссылка);
            НовыйДок.ВидОперации = ПодключеннаяБаза.Перечисления.ВидыОперацийПеремещениеТоваров.ТоварыПродукция;
            НовыйДок.Дата = Стр.ДокЭкспорт.Дата;
            НовыйДок.ОтражатьВУправленческомУчете = Истина;
            НовыйДок.ОтражатьВБухгалтерскомУчете = Истина;
********
        Новыйдок.ОбменДанными.Загрузка = Истина;
            НовыйДок.Записать();

*******
Метод объекта не обнаружен (ПолучитьСсылку)
            Ссылка = НовыйДок.ПолучитьСсылку(Новый УникальныйИдентификатор(ГуидДокЭкспорт));
1 catena
 
13.12.17
07:11
Ссылка = НовыйДок.ПолучитьСсылку(ПодключеннаяБаза.NewObject("УникальныйИдентификатор",СокрЛП(ГуидДокЭкспорт)));
2 Antony8x
 
13.12.17
07:13
+1
3 lirt82
 
13.12.17
07:17
(1)  Метод объекта не обнаружен (ПолучитьСсылку)
            Ссылка = НовыйДок.ПолучитьСсылку(ПодключеннаяБаза.NewObject("УникальныйИдентификатор", СокрЛП(ГуидДокЭкспорт)));
4 lirt82
 
13.12.17
07:24
Если эту строку убрать
Для каждого Стр Из Список Цикл
        ГуидДокЭкспорт = Стр.ДокЭкспорт.УникальныйИдентификатор();
        ГУИДУПП = Строка(Стр.ДокЭкспорт.УникальныйИдентификатор());
        Если ГУИДМаркет = ГУИДУПП Тогда
            Продолжить;
        Иначе
            НовыйДок = ПодключеннаяБаза.Документы.ПеремещениеТоваров.СоздатьДокумент();
                НовыйДок.УстановитьСсылкуНового(ГуидДокЭкспорт);

то выдает следующее  Ошибка при вызове метода контекста (УстановитьСсылкуНового)
            НовыйДок.УстановитьСсылкуНового(ГуидДокЭкспорт);
по причине:
Несоответствие типов (параметр номер '1')
5 lirt82
 
13.12.17
07:30
...в синтаксисе у метода ПолучитьСсылку() Доступность:
внешнее соединение
6 catena
 
13.12.17
07:31
у меня работает:

ИД = СсылкаНаОбъект.УникальныйИдентификатор();
СсылкаОбъектаПриемника = Соединение.Документы[ИмяОбъекта].ПолучитьСсылку(Соединение.NewObject("УникальныйИдентификатор",СокрЛП(ИД)));
7 catena
 
13.12.17
07:32
(4)Конечно будет ошибка, ты ему вместо гуила ком-объект даешь.
9 lirt82
 
13.12.17
07:35
а может из за платформы? подключаюсь через 8.2.19.83 (7)
10 catena
 
13.12.17
07:35
ИД = СсылкаНаОбъект.УникальныйИдентификатор();
СсылкаОбъектаПриемника = Соединение.Документы[ИмяОбъекта].ПолучитьСсылку(Соединение.NewObject("УникальныйИдентификатор",СокрЛП(ИД)));
ОбъектПриемника = СсылкаОбъектаПриемника.ПолучитьОбъект();

Если ОбъектПриемника = Неопределено Тогда
    ОбъектПриемника = Соединение[ТипОбъекта][СокрЛП(ИмяОбъекта)].СоздатьДокумент();
  
  ОбъектПриемника.УстановитьСсылкуНового(СсылкаОбъектаПриемника);
КонецЕсли;
11 lirt82
 
13.12.17
07:35
всмысле в этой версии этот метод неизвестен
12 Сти
 
13.12.17
07:38
(11) потому что должно быть не
Ссылка = НовыйДок.ПолучитьСсылку(Новый УникальныйИдентификатор(ГуидДокЭкспорт));
а
Ссылка = ПодключеннаяБаза.Документы.ПеремещениеТоваров.ПолучитьСсылку((ПодключеннаяБаза.NewObject("УникальныйИдентификатор",СокрЛП(ГуидДокЭкспорт)));

это метод не объекта, а менеджера
13 lirt82
 
13.12.17
07:43
(12) при таком коде выдает следующее
Для каждого Стр Из Список Цикл
        ГуидДокЭкспорт = Стр.ДокЭкспорт.УникальныйИдентификатор();
        ГУИДУПП = Строка(Стр.ДокЭкспорт.УникальныйИдентификатор());
        Если ГУИДМаркет = ГУИДУПП Тогда
            Продолжить;
        Иначе
            НовыйДок = ПодключеннаяБаза.Документы.ПеремещениеТоваров.СоздатьДокумент();
            НовыйДокСсылка = ПодключеннаяБаза.Документы.ПеремещениеТоваров.ПолучитьСсылку(ПодключеннаяБаза.NewObject("УникальныйИдентификатор", СокрЛП(ГуидДокЭкспорт)));
            НовыйДок.УстановитьСсылкуНового(НовыйДокСсылка);
            НовыйДок.ВидОперации = ПодключеннаяБаза.Перечисления.ВидыОперацийПеремещениеТоваров.ТоварыПродукция;
            НовыйДок.Дата = Стр.ДокЭкспорт.Дата;
*************
НовыйДок.ОбменДанными.Загрузка = Истина;
            НовыйДок.Записать();
/////
Ошибка при вызове метода контекста (Записать)
            НовыйДок.Записать();
по причине:
Произошла исключительная ситуация (1C:Enterprise 8.2.19.83): Ошибка при попытке вставки записи с неуникальным значением ссылки.
таблица Document118.
14 Сти
 
13.12.17
07:50
(13) Погоди, так ГуидДокЭкспорт это ГУИД уже имеющегося документа в подключенной базе, как я понимаю (из кода мне неясно, что там в СписокЭкспорт) потому и ругается. Для нового объекта нужно новую уникальную ссылку типа ПодключеннаяБаза.NewObject("УникальныйИдентификатор") без второго параметра
15 Efir12
 
13.12.17
07:51
(13)не проще ли получить ссылку, потом получить объект, если его нет будет новый создан

НовыйДок  = НовыйДокСсылка.ПолучитьОбъект();
16 lirt82
 
13.12.17
07:57
(14) есть обработка выполняется в базе Источник, создает доки проводит их, следующий этап эти доки должны мигрировать в базу приемник, через сом создается подключение, далее запросом получаю существующие доки и проверяю их по гуиду из базы источника если гуид не совпал тогда в базе приемнике создаю новый док и присваиваю ему гиуд из источника, заполняю, записываю и провожу. Проблема только в присваивании гиуда из источника для созданного дока в базе приемнике.
17 Сти
 
13.12.17
08:11
(16) Ага, ясно. Такгуид из источника может просто не подойти к приемнику. Это же разные базы, в них одинаковые гуиды могут быть присвоены не соответствующим друг другу объектам. Это и есть тот случай - гуид из источника уже присвоен в приемнике какому-то другому объекту.
Коллизий с гуидами нет в базах, связанных планами обмена, где есть главный и подчиненные узлы, и подчиненные выгружены из главной, у них одна конфа, но это же не тот случай? Вот там уникальность поддерживается для каждой базы.
А так, у меня, например, отдельный регистр для ведения соответствия гуидов внешних баз объектам "центральной". И в типовых тоже бывает что-то вроде РС СоответствиеОбъектовДляОбмена - для случаев обмена между разными конфигурациями.
18 George Wheels
 
13.12.17
08:58
Вместо функции Строка() используй XMLСтрока()
19 lirt82
 
13.12.17
09:03
(17) (18) всем спасибо, буду делать в два этапа) двумя разными обработками)).
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.