Имя: Пароль:
1C
1С v8
Com Запрос к РС как получить значения?
,
0 BaMBaM
 
05.12.13
12:09
Здравствуйте. Прошу навести на мысль что мне делать дальше. Запросом обращаюсь к РС через COM. Смотрю через отладчик и вижу что получаю NUll вместо значений. Как начитал тут на форуме не получаю значения потому что у меня не примитивный тип. Хочу чтобы вы намекнули какие действия я должен выполнить дальше. Цель моей задачи подключится к РС Границы запрета в каждой базе (их у нас много) и вытянуть данные почти в идентичный регистр сведений. Интересует как мне вытянуть значения чтобы потом я мог записать их себе в РС. (Я новичек в программировании за меня решать не надо прошу лишь подтолкнуть процесс застрял. Не пойму что после строк выгрузить писать, то ли выборку то ли еще что)      



        ОбъектПодключения = "V82.COMConnector" ;
    Соединение = Новый COMОбъект(ОбъектПодключения);    
    СтрокаПодключения = ПолучитьСтрокуСоединения(СтрокаТЧ.Серверная, СтрокаТЧ.СерверПредпр, СтрокаТЧ.ИмяИБвКластере, СтрокаТЧ.КаталогБазыДанных);        
    



    Коннектор = Соединение.Connect(СтрокаПодключения);    
    ТаблицаСпискаПустыхЗначений = Коннектор.NewObject("СписокЗначений");
    //Запрос для регистра ГраницаЗапрета через ком     
    
    Коннектор.NewObject("Запрос");
    Запрос = Коннектор.NewObject("Запрос");
    
    Запрос=новый Запрос;
    Запрос.Текст="
    |                                          ВЫБРАТЬ
    |    ГраницыЗапретаИзмененияДанных.Организация,
    |    ГраницыЗапретаИзмененияДанных.Пользователь,
    |    ГраницыЗапретаИзмененияДанных.ГраницаЗапретаИзменений
    |ИЗ
    |    РегистрСведений.ГраницыЗапретаИзмененияДанных КАК ГраницыЗапретаИзмененияДанных
    |";
    
    //Результат = Запрос.Выполнить().Выбрать();
    РезультатЗапроса = Запрос.Выполнить().Выгрузить();
1 Wobland
 
05.12.13
12:12
обойти результат уже попробовал?
2 BaMBaM
 
05.12.13
12:17
Нет. Просто дело в том что я и не понимаю что дальше писать. Спасибо сейчас буду курить как результат обходят.
3 Михаил Козлов
 
05.12.13
12:18
Обойти результат, по значениям полей выборки (Организация, Пользователь) искать соответствующие элементы справочников, добавлять с ними в набор записи. Граница - примитивный тип, поэтому можно просто присвоить.
4 BaMBaM
 
05.12.13
12:25
Спасибо Михаил теперь есть куда копать. Чтобы я без вас делал ребят)))
5 Wobland
 
05.12.13
12:34
(4) то же самое. но не сразу ;)
6 BaMBaM
 
05.12.13
12:54
Ребят пришел к такому коду. Получается мне потом надо искать  в справочнике по наименованию и сравнивать со значением в регистре? Правильный ход мыслей?


РезультатЗапроса = Запрос.Выполнить();
    Выборка = Коннектор.Справочники.Организации.Выбрать();
    Пока Выборка.Следующий() Цикл
        Организация = Выборка.НаименованиеПолное;
        Если ПустаяСтрока(Организация) тогда
            Продолжить
        Иначе
                Организация = Выборка.Ссылка;
       КонецЕсли;        
    КонецЦикла;
7 Wobland
 
05.12.13
12:55
зачем тебе здесь перебирать организации из там?
8 BaMBaM
 
05.12.13
13:00
Хм мне не надо). Ладно спасибо буду разбираться. Ща отладчиком пошаманить вникнуть надо зеленый я еще)
9 Wobland
 
05.12.13
13:15
Выборка=ТвойЗапрос.Выбрать()
и пока следующий смотри на неё. будут ком-объекты и дата
10 BaMBaM
 
05.12.13
13:55
Если свой запрос туда вписываю мне почему то выдает.
Выборка -    Ошибка получения представления значения    в отладчике.


РезультатЗапроса = Запрос.Выполнить();
    Выборка = РезультатЗапроса.Выбрать();
    Пока Выборка.Следующий() Цикл
                        
    КонецЦикла;
11 BaMBaM
 
05.12.13
14:20
По моему проблема в том что я использую 8.3 в конфе. С 8.2 захожу в свою обработку и отладчик уже выдает выборку и ее свойства, а вот в значении "Ошибка чтения значения". У нас везде там 8.2 стоит может надо один и тот же релиз поставить чтобы все корректно было.
12 olegves
 
05.12.13
14:25
Запрос=новый Запрос;
это в (0) лишнее - запрос обходи, а чтобы выгрузить, надо создавать таблицу значений в подключенной базе
13 BaMBaM
 
05.12.13
14:30
(12)
Не совсем понял, но куда копать понял - буду копать спасибо.
14 olegves
 
05.12.13
14:34
1)    Запрос = Коннектор.NewObject("Запрос");
    
2)    Запрос=новый Запрос;

1 - правильное объявление запроса в подключенной базе
2 - затираешь его объявлением запроса в исходной базе и далее выполняется запрос в исходной базе, а не в подключенной

теперь ясно?
15 BaMBaM
 
05.12.13
14:35
(14) Очень доступно. Благодарю)
16 George Wheels
 
05.12.13
14:36
(14) Наверное это для удобства написания кода. Только потом не забыть заремить Запрос=новый Запрос;
17 BaMBaM
 
05.12.13
14:48
Действительно затирался. Теперь я вижу все данные есть с чем работать, когда закончу помещу конечный код. Мб кому еще поможет в будущем.
18 wowik
 
05.12.13
15:12
19 BaMBaM
 
05.12.13
17:41
А как лучше поступить с выборкой. Выгрузить в Табличную часть а потом записать это все в регистр? или есть проще варианты?
20 salvator
 
05.12.13
17:49
(19) Загрузить не получится. У тебя организация и пользователь сом-объекты.
Придется дополнительно еще искать к примеру по ИНН и наименованию.
21 BaMBaM
 
05.12.13
17:56
(20) наверно я еще не до конца разобрался. Я думал что раз корректные значения выборкой получил значит все ок. Вот мой код выборки

ОбъектПодключения = "V82.COMConnector" ;
    Соединение = Новый COMОбъект(ОбъектПодключения);    
    СтрокаПодключения = ПолучитьСтрокуСоединения(СтрокаТЧ.Серверная, СтрокаТЧ.СерверПредпр, СтрокаТЧ.ИмяИБвКластере, СтрокаТЧ.КаталогБазыДанных);    
    
    
    Коннектор = Соединение.Connect(СтрокаПодключения);    
    ТаблицаСпискаПустыхЗначений = Коннектор.NewObject("СписокЗначений");
    //Запрос для регистра ГраницаЗапрета через ком     
    
    Коннектор.NewObject("Запрос");
    Запрос = Коннектор.NewObject("Запрос");
    
    //Запрос=новый Запрос;
    Запрос.Текст="
    | ВЫБРАТЬ
    |    ГраницыЗапретаИзмененияДанных.Организация,
    |    ГраницыЗапретаИзмененияДанных.Пользователь,
    |    ГраницыЗапретаИзмененияДанных.ГраницаЗапретаИзменений
    |ИЗ
    |    РегистрСведений.ГраницыЗапретаИзмененияДанных КАК ГраницыЗапретаИзмененияДанных
    |";
    
    
    РезультатЗапроса = Запрос.Выполнить();
    //ТЗ = РезультатЗапроса.Выгрузить();
    Выборка = РезультатЗапроса.Выбрать();
    Пока Выборка.Следующий() Цикл
        ГраницаВЗапросе         = Выборка.ГраницаЗапретаИзменений;
        ОрганизацияВЗапросе     = Выборка.Организация.Наименование;
        Если выборка.Пользователь = неопределено тогда
            ПользовательВЗапросе = выборка.Пользователь иначе
                ПользовательВЗапросе = выборка.Пользователь.Наименование;
          КонецЕсли;
                
        
        
    КонецЦикла;    
    
Я думал мне только осталось куда нибудь выгрузить эти данные и записать в РС. Наверно доп поиск для случая задвоений в справочниках?
22 Михаил Козлов
 
05.12.13
18:02
(21) Вам сначала нужно по Организации и Пользователю в выборке (COM объекты) найти (Организацию можно по ИНН, пользователя - по наименованию) или создать соответствующие элементы в БД-приемнике.
Создать набор записей регистра, в который будете писать. Добавить записи с найденными Организацией и Пользователем в этот набор. В конце набор записать.
23 BaMBaM
 
05.12.13
18:05
Понял буду работать над этим.
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn