Имя: Пароль:
1C
1С v8
Запрос в другую базу
,
0 Borteg
 
28.09.12
01:19
Доброй ночи. Появилась необходимость из одной базы сделать запрос в другую для отчета. Как можно это сделать?

Тоесть у меня есть внешняя обработка которая считает необходимые мне данные в первой базе, во второй базе есть тоже необходимые мне данные. как можно сделать запрос во вторую базу из первой чтобы получить данные и загрузить их в табличную часть например.
1 zladenuw
 
28.09.12
02:48
создаешь СОМ, в нем запрос к бд источник. возврат тз. где поля строки. и выводишь. или же внешний источник данных и сразу в отчет в скд
2 Borteg
 
28.09.12
03:43
Спасибо за ответ, у меня все получилось, данные получил, но столкнулся с такой проблемой. Делаю запрос в регистр бухгалтерии 2 базы, запрос имеет параметр Датаконцапериода. он равен    
Дата=Дата(2012,6,30);
КонДня= КонецДня(Дата);
дата3 =Новый Граница (кондня,ВидГраницы.Включая)  ;

в первой базе все срабатывает я получаю обороты мне необходимые на 2012.06.30 включая конец, во вторую базу я могу передать токо дата(2012,06,30) но тогда не попадают туда все нужные мне значения. как передать границу?


Ошибка при вызове метода контекста (выполнить)
                   выборка = запрос.выполнить().выбрать();
по причине:
Произошла исключительная ситуация (1C:Enterprise 8.2.16.352): {(8, 2)}: Ошибка обработки представления "РегистрБухгалтерии.Хозрасчетный.Обороты:Несоответствие типов (Параметр номер ""2"")"
<<?>>РегистрБухгалтерии.Хозрасчетный.Обороты(,&Конпериода,,Счет=&Счет,,,,) КАК ХозрасчетныйОбороты
3 zladenuw
 
28.09.12
03:44
а создать там
4 Borteg
 
28.09.12
03:46
а как это можно сделать? я просто только связался с этим.
5 zladenuw
 
28.09.12
03:48
а чего ты только можешь передать дату ?  что при передачи границы ?
6 Borteg
 
28.09.12
03:48
выборка = запрос.выполнить().выбрать();
по причине:
Произошла исключительная ситуация (1C:Enterprise 8.2.16.352): {(8, 2)}: Ошибка обработки представления "РегистрБухгалтерии.Хозрасчетный.Обороты:Несоответствие типов (Параметр номер ""2"")"
<<?>>РегистрБухгалтерии.Хозрасчетный.Обороты(,&Конпериода,,Счет=&Счет,,,,) КАК ХозрасчетныйОбороты вот такая ошибка
7 zladenuw
 
28.09.12
03:51
весь текст
8 zladenuw
 
28.09.12
03:51
запроса
9 Borteg
 
28.09.12
03:52
олезапрос = "ВЫБРАТЬ
             |    ХозрасчетныйОбороты.Субконто1 как контрагент,
             |    ХозрасчетныйОбороты.Субконто2 как договор,
             |    ХозрасчетныйОбороты.Субконто3 как документрасчетов,
             |    ХозрасчетныйОбороты.СуммаОборотДт как оборотДТ,
             |    ХозрасчетныйОбороты.СуммаОборотКт как оборотКТ
             |ИЗ
             |    РегистрБухгалтерии.Хозрасчетный.Обороты(,&Конпериода,,Счет=&Счет,,,,) КАК ХозрасчетныйОбороты"  ;
                                     Запрос = УПП.NewObject("Запрос");
                   Запрос.Текст = олезапрос;
                       Дата=Дата(2012,6,30);
                   дата2= КонецДня(Дата);
                   дата3 =Новый Граница (Дата2,ВидГраницы.Включая)  ;
               
                       Запрос.УстановитьПараметр("Конпериода",дата2);
                       Счет5 = УПП.Планысчетов.Хозрасчетный.РасчетыСПоставщиками;
                                                         Запрос.УстановитьПараметр("Счет", Счет5);
                               //Планысчетов.Хозрасчетный.РасчетыСПоставщиками;
                   
                   выборка = запрос.выполнить().выбрать();
                   Пока выборка.следующий() цикл
                   СтрокаТЧ = ОбороткаПравильная.Добавить();
                   Контр = Справочники.Контрагенты.НайтиПоНаименованию(выборка.контрагент.наименование);
                   СтрокаТч.Контрагент=контр;
                   дог=Справочники.ДоговорыКонтрагентов.НайтиПоКоду(выборка.договор.код);
                   СтрокаТч.Договор =дог;
                   СтрокаТч.ДокументРасчетов = Выборка.документрасчетов;
                   СтрокаТЧ.ОборотДТ =Выборка.оборотДТ;
                   СтрокаТч.ОборотКт=Выборка.ОборотКт;

                   конеццикла;
10 Borteg
 
28.09.12
03:53
только там дата3
в запросе
11 zladenuw
 
28.09.12
03:54
Надо Соединение.NewObject("Граница")
12 Borteg
 
28.09.12
04:03
воо отлично получилось! спасибо большое) и последний вопрос) Я получаю в запросе ссылку на документ расчетов во второй базе, как мне в первой базе эту ссылку в табличную часть вставить. она имеет же составной тип данных
13 Borteg
 
28.09.12
04:04
я просто вот получал контрагента, и в справочники контрагента искал его по наименованию, а тут я не знаю к какому документу обратиться
14 zladenuw
 
28.09.12
04:07
вообще. какая задача
15 Borteg
 
28.09.12
04:09
ну я сделал запрос в 60.01 счет и должен вывести его в табл часть. субконто документ расчетов имеет составной тип данных.
у меня есть таблч часть со столбцом=составной тип данных. я получил запрос из второй базы данные и теперь ими заполняю табл часть другой базы
16 Borteg
 
28.09.12
04:10
тоесть я имею ссылку со второй базы, этот документ есть в первой базе. мне надо в табл часть первой базы вывести ссылку на этот док.
17 zladenuw
 
28.09.12
04:11
не. ссылка только так
 v8: Как узнать гуид элемента спр., если тип значения comОбъект
где я писал.

вообще какая задача
18 zladenuw
 
28.09.12
04:12
если отчет. то получаешь все оттуда. проще сделай там запрос. а потом через ком. и все
19 zladenuw
 
28.09.12
04:12
только строки. в коме нету ссылок
20 zladenuw
 
28.09.12
04:13
понял ?
21 Borteg
 
28.09.12
04:14
пока неочень) ну вот в запросе я получил ссылку со второй базе. теперь мне надо в первой базе найти этот док. я понял что ссылок нету. надо через чтото другое искать. базы идентичны. тоесть guid итд итп одинаковые. тоесть мне надо получить guid этого документа и найти в первой базе этот док по guidу?)
22 zladenuw
 
28.09.12
04:15
а номера ?. вообще да. если они иднтч то можно через гуи. но тогда можно пробывать скд и вызывать внешнию функцию и по гуиду соединение
23 Borteg
 
28.09.12
04:17
мля как сложно все . осталось последняя фишка и так и думал что заткнусь на ней)
номера тоже совпадают, но тип данных то составной. в каком документ искать этот номер?(
24 zladenuw
 
28.09.12
04:18
давай по порядку. где вообще искать. тип можно получить документа
25 zladenuw
 
28.09.12
04:23
(23) сложного нету. есть недопонимание
26 Borteg
 
28.09.12
04:24
База 1 = 2 по документам. Тоесть даты,guidы все одинаковое. На 60 счете по одним и тем же документам в  базах разные обороты.
Мне надо сейчас вывести в первой базе обороты второй базы наложенные документы расчетов первой базы. Тоесть я получил запросом обороты. Мне теперь надо проставить субконто документ расчетов. Когда вя в табличную часть первой базы пишу
СтрокаТч.ДокументРасчетов = Остатки.документрасчетов; где остатки запрос во вторую базу у меня просто там comobject стоит, а мне надо чтобы ссылка
27 zladenuw
 
28.09.12
04:29
номер и тип документа .не ссылку надо
28 Borteg
 
28.09.12
04:30
тоесть вопрос сводится к минимуму я нашел документ во второй базе как мне теперь его найти в первой
29 zladenuw
 
28.09.12
04:34
попробуй внешний источник данных и соединить твоя поля по типу и по номеру. должно проканать. если же не. то получаешь тз документов с источника в приемнике делаешь соединение. потом вывод в отчет. но это долго
30 Borteg
 
28.09.12
04:36
Тоесть если по порядка
получил запросом ссылку во второй базе.
выборка.номер - это мой номер

как определить тип?

в 1 базе. исходя их типа  задаю запрос в нужные документы

документы... найти по коду код

суть понял только
31 zladenuw
 
28.09.12
04:38
если есть гуид документа то лучше выборкой. тогда получишь приемник=источник. запрос походу не получится.
формируешь перебор, в тз. а потом тз в запрос.
32 zladenuw
 
28.09.12
04:39
(31) но могу и ошибатся
33 Web00001
 
28.09.12
04:39
Зачем городить огород, если гуиды совпадают? Ну и получай ссылку напрямую через гуид он ведь для этого и нужен?
34 zladenuw
 
28.09.12
04:40
(33) в запросе ? как сразу ?
35 Web00001
 
28.09.12
04:43
(34) СтрокаТч.ДокументРасчетов = Остатки.документрасчетов; где остатки запрос во вторую базу у меня просто там comobject стоит, а мне надо чтобы ссылка

Надо ссылку? переделай сом объект в ссылку через гуид да и все. Или чота не так?
36 Borteg
 
28.09.12
04:45
я бы с радостью передал но я с этим не встрречался и не сильно понимаю как. у меня есть ссылка на объект во второй базе.
1) как получить guid по этой ссылке
2) как найти по гуиду ссылку на документа в первой базе

это то что я не понимаю
37 zladenuw
 
28.09.12
04:49
(35) и как в запросе.
вот пример. но тут не ком. хотя это уже не запрос :)
 Запрос = Новый Запрос;
      Запрос.Текст = "ВЫБРАТЬ
                       |    Номенклатура.НаименованиеПолное,
                       |    Номенклатура.ЕдиницаИзмерения,
                       |    Номенклатура.СтавкаНДС,
                       |    Номенклатура.НоменклатурнаяГруппа,
                       |    Номенклатура.СчетУчетаЗапасов,
                       |    Номенклатура.СчетУчетаЗатрат,
                       |    Номенклатура.Ссылка,
                       |    Номенклатура.ЭтоГруппа
                       | ИЗ
                       |    Справочник.Номенклатура КАК Номенклатура";
      РезультатЗапроса = Запрос.Выполнить();
      СпрОбъект = РезультатЗапроса.Выбрать();    
      Пока СпрОбъект.Следующий()  Цикл
         СтрокаУИ = Объект.XMLСтрока(СпрОбъект.Ссылка);
         GUID = Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(СокрЛП(СтрокаУИ)));          
       КонецЦикла;
38 zladenuw
 
28.09.12
04:50
39 Borteg
 
28.09.12
04:55
щас с гуидом попробую вроде разобрался
40 zladenuw
 
28.09.12
04:57
(39) это уже не запросом все. хотя пробуй. на 100 не подскажу
41 Web00001
 
28.09.12
04:58
из (26) я понял что у него там в параметре запроса стоит ком а не ссылка, то есть надо что бы срабатывало условие
СтрокаТч.ДокументРасчетов = Остатки.документрасчетов;
то есть вместо Остатки.документрасчетов просто ДокументРасчетов который и будет тем самым документом восстановленным из гуида
42 zladenuw
 
28.09.12
05:00
(41) по кому и равно....если гуи то тогда катит. а если не гуи. то только по дате и по номеру ?
43 Borteg
 
28.09.12
05:00
с гуидом както все понятно единственное как узнать гуид в подключенной базе
ссылка1 = выборка.документрасчетов; -выборка во второй базе
гуид = Ссылка1.УникальныйИдентификатор();-это правильно будет?
44 Borteg
 
28.09.12
05:02
comobject  в табл части, чето опять не так делаю, как по гуиду найти обьект вроде понятно.
Вопрос как этот guid из второй базы передать в табличную часть первой базы например
45 zladenuw
 
28.09.12
05:02
смотри в (17) если ссылка создана как там. то получишь
46 Borteg
 
28.09.12
05:02
как его вообще найти и передать в первую базу, если это обьясните вроде все остальное я понял
47 zladenuw
 
28.09.12
05:03
ну ты блин
48 zladenuw
 
28.09.12
05:03
а по ссылке посмотреть
ОбъектПолучателяСпр = ТекCOMОбъект.Справочники["Номенклатура"].ПолучитьСсылку(ВернутьУИД(ОбъектОтправителя));
49 zladenuw
 
28.09.12
05:04
ВернутьУИД(ОбъектОтправителя)    
   Возврат ТекCOMОбъект.Newobject("УникальныйИдентификатор",СокрЛП(ОбъектОтправителя.UUID()));
// ВернутьУИД
50 zladenuw
 
28.09.12
05:05
51 zladenuw
 
28.09.12
05:06
надо стрелять. кто не гугл или яндя
52 Borteg
 
28.09.12
05:07
Ошибка при вызове метода контекста (NewObject)
                   гуид=УПП.Newobject("УникальныйИдентификатор",СокрЛП(ссылка1.UUID()));
по причине:
Произошла исключительная ситуация (1C:Enterprise 8.2.16.352): Недопустимое значение параметра (параметр номер '1')
53 zladenuw
 
28.09.12
05:11
обжект
54 zladenuw
 
28.09.12
05:12
Например:
МенДокументов = БазаПолучатель.Документы[ЦелевойТипДокумента];
UIDПолучатель = БазаПолучатель.NewObject("УникальныйИдентификатор", СокрЛП(UIDИсточник));

ДругойДокумент = МенДокументов.ПолучитьСсылку(UIDПолучатель);
// проверим - удалось ли найти..
Если ДругойДокумент.ПолучитьОбъект() = НЕОПРЕДЕЛЕНО Тогда  // не нашли
...
КонецЕсли;
55 zladenuw
 
28.09.12
05:13
56 Borteg
 
28.09.12
05:34
ох вроде получилось, только у меня там около 50000  записей, а гуид я так понял надо искать перебором по метаданным документы. тоесть это ему на день работы?)
57 zladenuw
 
28.09.12
05:35
че? значит плохо написал. то 5 минут. и то это много
58 Borteg
 
28.09.12
05:39
ну как плохо написал чтобы найти по guidy ссылку надо перебрать все документы
Для каждого л_Менеджер из Метаданные.Документы Цикл
       л_Ссылка = Документы[л_Менеджер.Имя].ПолучитьСсылку(Новый УникальныйИдентификатор(рф_ЖУИД));
       //Состояние(""+ТипЗнч(л_Ссылка));
       ЭлементыФормы.НадписьТипЗначения.Заголовок = ТипЗнч(л_Ссылка);
       Если л_Ссылка.ПолучитьОбъект() <> Неопределено Тогда
           рф_Ссылка = л_Ссылка;
           
       КонецЕсли;;
написанно перебором надо делать. вот у меня там куча записей и он щас я так понимаю для каждой записи сидит перебирает...
59 Borteg
 
28.09.12
05:41
оу е перебрало)
60 Borteg
 
28.09.12
05:42
боже мой вроде даже правильно!)
61 Borteg
 
28.09.12
05:46
Блин мужики огромное Вам спасибо что провозились со мной столько времени. Все сработало как надо. Спасибо что объяснили как собладать с этой задачей, а то сам бы я надолго застрял.
62 zladenuw
 
28.09.12
05:51
надо веб кошелек создать. да взамен спасибо 50 копечек. так бы и миллиардером стал бы.
63 Ranger_83
 
28.09.12
06:13
"Ну, вы блин даете"(С)
64 zladenuw
 
28.09.12
06:20
а чЁ
65 Web00001
 
28.09.12
07:55
(64) Тебе за полчаса отвлеченной болтовни в стиле " хотя пробуй. на 100 не подскажу" еще и денег надо???
Независимо от того, куда вы едете — это в гору и против ветра!