Имя: Пароль:
1C
1С v8
Как программно перегрузить документ из одной базы в другую?
,
0 _stay true_
 
20.01.14
11:39
Здравствуйте. Нужно написать обработку, которая перегружала бы счета - фактуры из ТКПТ(конфа от раруса по управлению магазином) в БП 2.0.

Ситуация такая: соответствия объектов баз хранятся в отдельной SQL-базе не сервере, есть база БП 2.0, нужно чтобы обработка выполнялась в ней, следовательно:

1. Нужно программно подключиться к базе ТКПТ(работает) и запросом вытянуть нужные счета-фактуры с отбором по периоду.
2. Проверить соответствие GUID объектов по базе SQL. Если есть соответствие - просто грузить, если нет - грузить и создать новое соответствие в базе SQL.
3. Загрузить документы из ТКПТ в БП.

Процедура получилась такая:

Процедура СчетФактураВыданный()
    
    Подключение =  ПолучитьПодключениеКТКПТ();
    Если Подключение = Неопределено Тогда
        Возврат
    КонецЕсли;
        
        //получить СФ в базе ТКПТ запросом
        Попытка
        ЗапросКТКПТ = Подключение.NewObject("Query");
        ЗапросКТКПТ.Текст =
        "ВЫБРАТЬ
        |    СчетФактураВыданный.Ссылка,
        |    СчетФактураВыданный.ВерсияДанных,
        |    СчетФактураВыданный.ПометкаУдаления,
        |    СчетФактураВыданный.Номер,
        |    СчетФактураВыданный.Дата,
        |    СчетФактураВыданный.Проведен,
        |    СчетФактураВыданный.Автор,
        |    СчетФактураВыданный.Организация,
        |    СчетФактураВыданный.ПодразделениеКомпании,
        |    СчетФактураВыданный.РегламентированныйУчет,
        |    СчетФактураВыданный.Комментарий,
        |    СчетФактураВыданный.ДокументОснование,
        |    СчетФактураВыданный.Контрагент,
        |    СчетФактураВыданный.ДоговорВзаиморасчетов,
        |    СчетФактураВыданный.ВалютаДокумента,
        |    СчетФактураВыданный.КурсДокумента,
        |    СчетФактураВыданный.СуммаДокумента,
        |    СчетФактураВыданный.СтавкаНДС,
        |    СчетФактураВыданный.СуммаНДС,
        |    СчетФактураВыданный.Грузополучатель,
        |    СчетФактураВыданный.ХозОперация,
        |    СчетФактураВыданный.ИБСоздания,
        |    СчетФактураВыданный.СчетФактураНаАванс,
        |    СчетФактураВыданный.Товары.(
        |        Ссылка,
        |        НомерСтроки,
        |        Номенклатура,
        |        Количество,
        |        ЕдиницаИзмерения,
        |        Коэффициент,
        |        Цена,
        |        Сумма,
        |        СтавкаНДС,
        |        СуммаНДС,
        |        СуммаВсего,
        |        ГТД,
        |        Партия
        |    ),
        |    СчетФактураВыданный.МаршрутОбмена.(
        |        Ссылка,
        |        НомерСтроки,
        |        ИнформационнаяБаза
        |    )
        |ИЗ
        |    Документ.СчетФактураВыданный КАК СчетФактураВыданный
        |ГДЕ
        |    СчетФактураВыданный.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания";
        
        ЗапросКТКПТ.УстановитьПараметр("ДатаНачала", ЭтотОбъект.ДатаНачала);
        ЗапросКТКПТ.УстановитьПараметр("ДатаОкончания", ЭтотОбъект.ДатаОкончания);
        
        РезультатТКПТ = ЗапросКТКПТ.Выполнить();
        
        Если НЕ РезультатТКПТ.Пустой() Тогда
            
            ВыборкаТКПТ = РезультатТКПТ.Выбрать();
            
            ЭлементыФормы.ИндикаторПрогресса.МаксимальноеЗначение = ВыборкаТКПТ.Count();
            ЭлементыФормы.ИндикаторПрогресса.МинимальноеЗначение  = 0;
            
            ИндикаторПрогресса = 0;
            
            Пока ВыборкаТКПТ.Следующий() Цикл
                //Получим GUID счета-фактуры в ТКПТ
                GUIDTKPT = Подключение.String(ВыборкаТКПТ.Ref.УникальныйИдентификатор());
                //Проверим соответствие по с базой SQL
                GUIDобъектаТКВБазеСоответствий = ПолучитьСоответствиеВБАзеSQL(GUIDTKPT);

                Если GUIDTKPT = GUIDобъектаТКВБазеСоответствий  Тогда
                    //Загрузим объекты
                    
                    Попытка
                        
                        ОбъектСФДляЗагрузки = ВыборкаТКПТ.Ref.ПолучитьОбъект();
                        ОбъектСФДляЗагрузки.ОбменДанными.Загрузка = Истина;
                        ОбъектСФДляЗагрузки.Записать(РежимЗаписиДокумента.Запись);  
                    Исключение
                        Сообщить(ОписаниеОшибки());
                        Возврат;
                    КонецПопытки;
                    
                Иначе
                    
                    Попытка
                        
                        //Создадим новые объекты

                        //ДОБАВИТЬ СООТВЕТСТВИЕ В БАЗУ СКЛ
                        ОбъектСФДляЗагрузки = ВыборкаТКПТ.Ref.ПолучитьОбъект();
                        ОбъектСФДляЗагрузки.ОбменДанными.Загрузка = Истина;
                        ОбъектСФДляЗагрузки.Записать();  

                        GUIDBP = Документы.СчетФактураВыданный.НайтиПоНомеру(СокрЛП(ОбъектСФДляЗагрузки.Номер)).УникальныйИдентификатор();
                        ДобавитьСоответствиеВБазуSQL(GUIDTKPT,GUIDBP);
                        
                    Исключение
                        Сообщить(ОписаниеОшибки());
                        Возврат;
                    КонецПопытки;
                    
                    
                КонецЕсли;
                ИндикаторПрогресса = ИндикаторПрогресса+1;
            КонецЦикла;
            
        КонецЕсли;            
    Сообщить("Загрузка завершена", СтатусСообщения.ОченьВажное);
    Исключение
        Сообщить(ОписаниеОшибки());
    КонецПопытки;
    
КонецПроцедуры

Результат такой: к SQL подключается, если соответствие находит - просто грузит объект, если не находит - грузит объект и добавляет соответствие в базу SQL.

Запарка начинается на этапе загрузки документов и записи:

ОбъектСФДляЗагрузки = ВыборкаТКПТ.Ref.ПолучитьОбъект();

В отладчике ОбъектСФДляЗагрузки определяется как COM-объект, и, следовательно, в базу не записывается как документ.

На строку ОбъектСФДляЗагрузки.Записать(РежимЗаписиДокумента.Проведение) выдаёт ошибку: Ошибка при вызове метода контекста (Записать): Произошла исключительная ситуация (1C:Enterprise 8.2.19.80): Несоответствие типов (параметр номер '1')

Если кто сталкивался с подобным - подскажите, пожалуйста, как вы решали подобную проблему? Заранее спасибо.
1 andreymongol82
 
20.01.14
11:46
Если ОбъектСФДляЗагрузки - это com-объект, то в записать Записать(РежимЗаписиДокумента.Проведение) - нужно как-то так
Подключение.DocumentWriteMode.Posting
2 _stay true_
 
20.01.14
11:53
Попробовал так:


ОбъектСФДляЗагрузки.Записать(Подключение.DocumentWriteMode.Posting)


Выдал ошибку такую:
{Форма.Форма.Форма(210)}: Ошибка при вызове метода контекста (Заполнить): Произошла исключительная ситуация (1C:Enterprise 8.2.17.169): Ошибка при выполнении обработчика - 'ОбработкаЗаполнения'
{ОбщийМодуль.обПроцедурыОбщегоНазначения.Модуль(390)}: Конструктор не обнаружен (ВыборкаИзРезультатаЗапроса)
3 _stay true_
 
20.01.14
12:00
Неужели придется пореквизитно...
4 _stay true_
 
20.01.14
12:06
Неужели единственный выход это программно создавать новый документ и заполнять каждый реквизит отдельно?
5 Maxus43
 
20.01.14
12:08
сериализуй документ в xml, на той стороне загрузи. Если делаешь через ком - то создавай док и заполняй
6 ptiz
 
20.01.14
12:12
(4) Представь себе!
Искуственный интеллект, тягающий разнородные объекты между разными базами, еще не изобрели.
То, что они называются одинаково: "СчетФактура", не значит, что это одно и то же (молчу про соответствие контрагентов, товаров и т.п.).
7 _stay true_
 
20.01.14
12:41
(6) Спасибо за объяснения. Пойду пыхтеть))
8 _stay true_
 
22.01.14
14:54
Вопрос такой: как программно создать счет-фактуру с указанием ручной корректировки движений? Нужно, чтобы она дополнительно двинула регистр НДС Продажи.
9 _stay true_
 
22.01.14
15:13
Достаточно ли будет установить признак "ручная корректровка = истина" и создать и записать набор записей?
10 ptiz
 
22.01.14
15:25
(9) Да
11 _stay true_
 
22.01.14
16:47
(10) Спасибо. Пойду попробую.