Вход | Регистрация

1С:Предприятие ::

Метки: 

через СОМ, передать ГУИД для нового документа

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

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

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

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

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

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

а
 Ссылка = ПодключеннаяБаза.Документы.ПеремещениеТоваров.ПолучитьСсылку((ПодключеннаяБаза.NewObject("УникальныйИдентификатор",СокрЛП(ГуидДокЭкспорт)));


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

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

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


Список тем форума
Рекламное место пустует Рекламное место пустует
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки - вот настоящая работа.
Фредерик Брукс-младший
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует