Имя: Пароль:
1C
1С v8
V82.COMConnector Как получить данные запроса?
,
0 dva1c
 
10.07.12
16:27
Пишу обработку, которая вытягивает данные из другой базы.
Получилось следующее:

   Попытка
       Открыта = cntr.Connect(СтрокаПодключения);
       Сообщить(" Подключена!", СтатусСообщения.Информация);
   Исключение
       Предупреждение(ОписаниеОшибки()); //"Ошибка открытия информационной базы"
       Открыта = Ложь;
       Возврат;
   КонецПопытки;
   //Запрос = Новый База.Запрос;
   Запрос            = Открыта.NewObject("Запрос");
   Запрос.Текст = "
   |ВЫБРАТЬ
   |    СУММА(РеализацияТоваровУслуг.СуммаДокумента) КАК СуммаДокумента,
   |    РеализацияТоваровУслуг.Контрагент КАК СпрКонтрагент
   |ИЗ
   |    Справочник.Контрагенты КАК СпрКонтрагенты
   |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
   |        ПО СпрКонтрагенты.Ссылка = РеализацияТоваровУслуг.Контрагент
   |ГДЕ
   |    РеализацияТоваровУслуг.ПометкаУдаления = ЛОЖЬ
   |    И РеализацияТоваровУслуг.Дата <= &ДатаКонца
   |    И РеализацияТоваровУслуг.Дата >= &ДатаНачала
   |    И СпрКонтрагенты.Ссылка В ИЕРАРХИИ(&Группа)
   |
   |СГРУППИРОВАТЬ ПО
   |    РеализацияТоваровУслуг.Контрагент
   |";
   КлиентСтоловой = Открыта.Справочники.СотрудникиОрганизаций.НайтиПоНаименованию("Сотрудники");
   Запрос.УстановитьПараметр("Группа",КлиентСтоловой);//ПредставлениеПолучателя);
   Запрос.УстановитьПараметр("ДатаНачала", НачалоДня(НачПериода));
   Запрос.УстановитьПараметр("ДатаКонца", КонецДня(КонПериода));
   //Запрос.УстановитьПараметр("РеализацияГП", Ложь);
   //Результат = Запрос.Выполнить().Выгрузить();
   Selected = Запрос.Execute().Choose();
   //СтаршийИндекс = Результат.Количество() - 1;
   Selected.Next();

Нашел ссылку v8: 8.1 COM Соединение

Вопрос: как обойти результат запроса, полученной через OLE?
В отладчике пишет: COMОбъект и все... Попытки Get и т.п. не проходят.
ЧЯНТД?
1 Eugene_life
 
10.07.12
16:30
(1) не получай в результате ссылки. Получай Наименование, Код, порядок... все что угодно, но не ссылки.
2 Александр Б
 
10.07.12
16:31
(0) так ты получаешь ссылки на объекты в другой базе. Любой объект ссылочного типа в отладчике у тебя будет выглядеть как COMОбъект. А реквизиты примитивного типа (число, строка и проч) будут выглядеть обычным образом.
3 Eugene_life
 
10.07.12
16:31
+ (1) В данном случае:
|    РеализацияТоваровУслуг.Контрагент.Наименование КАК СпрКонтрагент
4 acsent
 
10.07.12
16:32
(1) через точку можно потом все остальные реквизиты получить
5 dva1c
 
10.07.12
16:34
Спасибо, коллеги!
Кидайте больше, все пригодится!
6 dva1c
 
10.07.12
16:34
(1) Про ссылки понял.
7 Coldboy
 
10.07.12
16:36
Результат запроса, полученный твоим запросом можно обойти примерно так:
Попытка
Selected.MoveFirst();
Исключение
Selected.Close();
КонецПопытки;
// установили указатель типа на первую строчку и далее циклом
Пока Selected.EOF()=0 Цикл
СуммаДокумента = Selected.Fields("СуммаДокумента").Value;
// далее все поля что нужно получаем в обычную ТЗ
Selected.MoveNext();
КонецЦикла;
8 Coldboy
 
10.07.12
16:36
ну как то так
9 acsent
 
10.07.12
16:37
(7) зачем ты по английски пишешь7
10 andrewks
 
10.07.12
16:38
(6) скажу по-другому:  через com-соединение считывай только данные примитивных типов (строка, число, дата).

агрегатный объект ты получить сможешь, но сделать с ним особо ничего не сможешь, окромя как только передавать опять в исходную базу через com
11 Coldboy
 
10.07.12
16:39
(9) ну с com-соединение я помню работал именно такими командами.
12 Defender aka LINN
 
10.07.12
16:39
(7) *молча протягивает пустой коробок*
13 Coldboy
 
10.07.12
16:40
а что это значит?
14 andrewks
 
10.07.12
16:42
перечитал ещё раз сабж. не понял, в чём проблема
15 dva1c
 
10.07.12
18:19
Завтра проверю все, что написали. )
16 Йохохо
 
10.07.12
19:07
(13) отсыпь ))))))))))
17 dva1c
 
11.07.12
09:48
Продолжаю "ваять" обработку.
Переписал запрос, чтобы не было ссылок.
   Попытка
       Connection = cntr.Connect(СтрокаПодключения);
       Сообщить(" Подключена!", СтатусСообщения.Информация);
   Исключение
       Предупреждение(ОписаниеОшибки()); //"Ошибка открытия информационной базы"
       Открыта = Ложь;
       Возврат;
   КонецПопытки;
   Query = Connection.NewObject("Query");

   Query.Text = "
   |ВЫБРАТЬ
   |    РеализацияТоваровУслуг.Контрагент.Наименование,
   |    СУММА(РеализацияТоваровУслуг.СуммаДокумента) КАК СуммаДокумента
   |ИЗ
   |    Справочник.Контрагенты КАК СпрКонтрагенты
   |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
   |        ПО СпрКонтрагенты.Наименование = РеализацияТоваровУслуг.Контрагент.Наименование
   |ГДЕ
   |    СпрКонтрагенты.Ссылка В ИЕРАРХИИ(&Группа)
   |    И РеализацияТоваровУслуг.Дата МЕЖДУ &ДатаНачала И &ДатаКонца
   |    И РеализацияТоваровУслуг.ПометкаУдаления = ЛОЖЬ
   |
   |СГРУППИРОВАТЬ ПО
   |    РеализацияТоваровУслуг.Контрагент.Наименование
   |";
   
   КлиентСтоловой = Connection.Справочники.Контрагенты.НайтиПоНаименованию("Сотрудники");
   Query.УстановитьПараметр("Группа",КлиентСтоловой);//ПредставлениеПолучателя);
   Query.УстановитьПараметр("ДатаНачала", НачалоДня(НачПериода));
   Query.УстановитьПараметр("ДатаКонца", КонецДня(КонПериода));
   Selected = Query.Execute().Choose();

Чтобы не работать с реальной базой - сделал копию на скуле.
Пробую подключить копию (меняю имя базы в строке подключения) и у меня не выходит.
Вопрос: что нужно сделать, чтобы подключалась копия базы?
Какие параметры установить при подключении?
18 dva1c
 
11.07.12
09:54
Обход из (7) не работает. Ругается на "EOF()"

Решение по обходу запроса, так и нет. (
19 dva1c
 
11.07.12
09:57
andrewks вопрос простой: как обойти результат выполненного запроса?
20 Coldboy
 
11.07.12
09:58
(18) вот мой код обработки смотри
рабочей.
21 Coldboy
 
11.07.12
09:59
Соединение = Новый COMОбъект("ADODB.Connection");
   //заполнение текущих настроек подключения
   ТекСервер = "MY-PK\SQLEXPRESS";
   ТекБаза = "store_temp";
   //заполнение строки запроса к серверу
   СтрокаКоннекта ="driver={SQL Server};server="+ТекСервер+";Database="+ТекБаза;
   Соединение.ConnectionTimeOut = 6000;
       //попытка соединения
   Попытка
       Соединение.Open(СтрокаКоннекта);
   Исключение
       Сообщить("Невозможно установить соединение с базой данных MS SQL! " + ОписаниеОшибки()+"!!!");
       ЗаписатьВФ("Невозможно установить соединение с базой данных MS SQL! "+ ОписаниеОшибки());
       Возврат;
   КонецПопытки;
   // запрос к объекту ADO
   //ЗапросАДО = Новый COMОбъект("ADODB.Command");
   //Попытка
   //    ЗапросАДО.ActiveConnection = Соединение;
   //Исключение
   //    Сообщить("Ошибка при инициализации соединения! " + ОписаниеОшибки());
   //    ЗаписатьВФ("Ошибка при инициализации соединения! " + ОписаниеОшибки());
   //    Возврат;
   //КонецПопытки;
   //запрос на вывод необходимых данных из таблицы    
   //т.к. АДО не понимает тип данных decimal то на стороне сервера преобразуем данные
   //с помощью CAST(имя_поля AS новый_тип_данных) AS новое_имя_поля
   СтрокаЗапроса=
   "select
   |GUID,
   |To1C,
   |filial,  
   |data,
   |CAST(Pr_Kom_Sr AS varchar(20)) AS Pr_Kom_Sr,  
   |N_Pr_Kom_Sr,  
   |CAST(Pr_Real AS varchar(20)) AS Pr_Real,
   |N_Pr_Real,
   |CAST(Pr_Real_Lombard AS varchar(20)) AS Pr_Real_Lombard,  
   |N_Pr_Real_Lombard,
   |CAST(Pr_Real_Lombard_Percent AS varchar(20)) AS Pr_Real_Lombard_Percent,
   |N_Pr_Real_Lombard_Percent,
   |CAST(Pr_hr_kom AS varchar(20)) AS Pr_hr_kom,
   |CAST(Pr_Cash AS varchar(20)) AS Pr_Cash,
   |N_Pr_Cash,
   |CAST(Pr_Credit AS varchar(20)) AS Pr_Credit,
   |N_Pr_Credit,
   |CAST(R_Zad_Kom AS varchar(20)) AS R_Zad_Kom,
   |CAST(R_Skupka AS varchar(20)) AS R_Skupka,
   |N_R_Skupka,
   |CAST(R_Cash AS varchar(20)) AS R_Cash,
   |N_R_Cash,
   |CAST(R_Credit AS varchar(20)) AS R_Credit,
   |N_R_Credit,
   |CAST(R_Credit_Percent AS varchar(20)) AS R_Credit_Percent,
   |N_R_Credit_Percent,
   |CAST(R_Lombard AS varchar(20)) AS R_Lombard,
   |N_R_Lombard,
   |CAST(BeginCashRegister AS varchar(20)) AS BeginCashRegister,
   |CAST(EndCashRegister AS varchar(20)) AS EndCashRegister,    
   |CAST(Pr_Total AS varchar(20)) AS Pr_Total
   |from dbo.CASH_REPORT
   |where To1C = 1
   |order by data asc";    
   Попытка
       Выборка=Соединение.Execute(СтрокаЗапроса);
   Исключение                                                          
       Сообщить ("Ошибка выполнения запроса к БД: "+ОписаниеОшибки()+"!!!");
       ЗаписатьВФ("Ошибка выполнения запроса к БД: "+ОписаниеОшибки());
       Возврат;
   КонецПопытки;
       СчетчикКол = 0;
   //выборка из результата запроса
   Если Выборка.EOF()=-1 Тогда
   Иначе
       //установка указателя на первую строку
       Попытка
           Выборка.MoveFirst();
       Исключение
           Выборка.Close();
           Сообщить ("Ошибка установки указателя на первую строку или записей в базе данных до сегодняшнего дня нет или выгружены "+ОписаниеОшибки());
           ЗаписатьВФ("Ошибка установки указателя на первую строку или записей в базе данных до сегодняшнего дня нет или выгружены "+ОписаниеОшибки());
           Возврат;
       КонецПопытки;
// Заполненяем данными нашу ТЗ из Выборки с SQL Сервера
   Пока Выборка.EOF()=0 Цикл    
           Поле = Выборка.Fields;
           
           Если НайтиТорговуюТочку(Выборка.Fields("filial").Value) = -1 Тогда
               //установка указателя на следующую строку    
               Попытка
                   Выборка.MoveNext();
           Исключение
                   Выборка.Close();
                   Сообщить ("Ошибка установки указателя на следующее поле: "+ОписаниеОшибки(),"!!!");
                   ЗаписатьВФ("Ошибка установки указателя на следующее поле: "+ОписаниеОшибки());
                   Возврат;
               КонецПопытки;
               Продолжить;
           КонецЕсли;
           стрТЗ = ТЗ.Добавить();    
           стрТЗ.НомерИзВне = Выборка.Fields("GUID").Value;
           стрТЗ.КодФилиала = Выборка.Fields("filial").Value;
           стрТЗ.НазваниеФилиала = НайтиТорговуюТочку(стрТЗ.КодФилиала).Наименование;
           стрТЗ.ДатаДанных = Выборка.Fields("data").Value;  
                                                                                                     
           стрТЗ.РеализацияКомиссия = Число(Выборка.Fields("Pr_Kom_Sr").Value);
           стрТЗ.РеализацияКомиссияНомер = Число(Выборка.Fields("N_Pr_Kom_Sr").Value);
           
           стрТЗ.РеализацияСкупка = Число(Выборка.Fields("Pr_Real").Value);
           стрТЗ.РеализацияСкупкаНомер = Число(Выборка.Fields("N_Pr_Real").Value);
           
           стрТЗ.ВозвратСсудыЛомбарду = Число(Выборка.Fields("Pr_Real_Lombard").Value);
           стрТЗ.ВозвратСсудыЛомбардуНомер =  Число(Выборка.Fields("N_Pr_Real_Lombard").Value);
           
           стрТЗ.ПроцентыПоЛомбарду = Число(Выборка.Fields("Pr_Real_Lombard_Percent").Value);
           стрТЗ.ПроцентыПоЛомбардуНомер = Число(Выборка.Fields("N_Pr_Real_Lombard_Percent").Value);
           
           стрТЗ.ХранениеКомиссионногоТовара = Число(Выборка.Fields("Pr_hr_kom").Value);
           стрТЗ.ХранениеКомиссионногоТовараНомер = 0;
           
           стрТЗ.ПолученоИзКассыСобственник = Число(Выборка.Fields("Pr_Cash").Value);
           стрТЗ.ПолученоИзКассыСобственникНомер = Число(Выборка.Fields("N_Pr_Cash").Value);;
           
           стрТЗ.ПринятоЗаймов = Число(Выборка.Fields("Pr_Credit").Value);
           стрТЗ.ПринятоЗаймовНомер = Число(Выборка.Fields("N_Pr_Credit").Value);
           
           стрТЗ.ВыплатаЗадолженностиКомитентам = Число(Выборка.Fields("R_Zad_Kom").Value);
           стрТЗ.ВыплатаЗадолженностиКомитентамНомер = 0;
           
           стрТЗ.Скупка = Число(Выборка.Fields("R_Skupka").Value);
           стрТЗ.СкупкаНомер = Число(Выборка.Fields("N_R_Skupka").Value);
           
           стрТЗ.ПереданоВкассуСобственник = Число(Выборка.Fields("R_Cash").Value);
           стрТЗ.ПереданоВкассуСобственникНомер = Число(Выборка.Fields("N_R_Cash").Value);
           
           стрТЗ.ВыданоЗаймов = Число(Выборка.Fields("R_Credit").Value);
           стрТЗ.ВыданоЗаймовНомер = Число(Выборка.Fields("N_R_Credit").Value);
           
           стрТЗ.ВыданоПроцентовПоЗаймам = Число(Выборка.Fields("R_Credit_Percent").Value);
           стрТЗ.ВыданоПроцентовПоЗаймамНомер = Число(Выборка.Fields("N_R_Credit_Percent").Value);
           
           стрТЗ.ВыданоСсуд = Число(Выборка.Fields("R_Lombard").Value);
           стрТЗ.ВыданоСсудНомер = Число(Выборка.Fields("N_R_Lombard").Value);
           
           стрТЗ.ОстатокН = Число(Выборка.Fields("BeginCashRegister").Value);
           стрТЗ.ОстатокК = Число(Выборка.Fields("EndCashRegister").Value);
           
           стрТЗ.Возврат = стрТЗ.ОстатокК - стрТЗ.ОстатокН - Число(Выборка.Fields("Pr_Total").Value);  
           //запрос изменения в таблице cash_report параметра To1C на  1
           СтрокаЗапроса1="update dbo.CASH_REPORT set To1C = 0 where GUID = '" + стрТЗ.НомерИзВне+ "'";
           //выполнение запроса  
       Попытка
               Выборка1 = Соединение.Execute(СтрокаЗапроса1);
       Исключение                                                          
               Сообщить ("Ошибка обновления данных на сервере БД: "+ОписаниеОшибки(),"!!!");
               ЗаписатьВФ("Ошибка обновления данных на сервере БД: "+ОписаниеОшибки());
               Возврат;
       КонецПопытки;
       //установка указателя на следующую строку    
           Попытка
               Выборка.MoveNext();
           Исключение
               Выборка.Close();
               Сообщить ("Ошибка установки указателя на следующее поле: "+ОписаниеОшибки()+"!!!");
               ЗаписатьВФ("Ошибка установки указателя на следующее поле: "+ОписаниеОшибки());
               Возврат;
           КонецПопытки;
       КонецЦикла;
   КонецЕсли;
22 dva1c
 
11.07.12
09:59
(20) Дак, я и смотрю. Почему ругается на Пока Selected.EOF()=0 Цикл
23 dva1c
 
11.07.12
10:00
(21) Спасибо! Пробую.
24 dva1c
 
11.07.12
10:53
Работающий обход результата запроса, выглядит так:

   Selected = Query.Execute().Choose();    //.Choose()    
   Пока Selected.Next() Цикл
       СуммаДокумента = Selected.СуммаДокумента;
       Контрагент = Selected.КонтрагентDescription;
       Сообщить(Контрагент + " =" + СуммаДокумента);
       // далее все поля что нужно получаем в обычную ТЗ    
   КонецЦикла;    

Coldboy твоя помощь пригодилась, но пригодилась в плане обдумывания.
Смотри какой короткий обход получился.

Почему-то пришлось писать на английском? На русском на методы идет "ругань" )
Для меня, пока, осталось это загадкой. )
25 Галахад
 
гуру
11.07.12
10:58
(24) Наверное 8-ка старая.
26 Coldboy
 
11.07.12
11:03
(24) все очень просто com-соедениние, тока англ команды воспринимает, как HTML и тд. код короткий не спорю, тот я писал по статье. незачто.
27 Defender aka LINN
 
11.07.12
11:10
(26) "com-соедениние, тока англ команды воспринимает" - выкинь свою 1С на свалку. И больше не кури.
28 Галахад
 
гуру
11.07.12
11:10
(26) Неа. По COM и русскоязычные команды нормально работают.
29 dva1c
 
11.07.12
11:21
(25) Если 8.2.15.318 - старая, то я граф Калиостро ))
30 dva1c
 
11.07.12
11:22
(28) Я не вру. Пишу по русски - ошибка. Пишу на английском - все гуд!
31 Галахад
 
гуру
11.07.12
11:23
(30) Показывай код.
32 dva1c
 
11.07.12
11:24
(26) Спасибо, еще раз! Ты дал шанс все продумать, более основательно.
33 dva1c
 
11.07.12
11:25
(31) Да код переписан. Спорить не будем. Я мог ошибаться. )