Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

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

через СОМ, передать ГУИД для нового документа
Я
   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 человек.
Рекламное место пустует