Имя: Пароль:
1C
1C 7.7
v7: Подскажите как получить запросом данные
0 URAL
 
12.01.19
12:25
Всем привет!
Не могу понять как получить из запроса данные
1с7 не знаю, 1с8 знаю

Процедура Сформировать()
    Перем Запрос, ТекстЗапроса, Таб;
    //Создание объекта типа Запрос
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |Период с '01.01.2017' по '31.12.2018';
    //|Без итогов;
    |ДокСправка = Документ.СправкаСчет.ТекущийДокумент;
    |Автомобиль = Документ.СправкаСчет.Автомобиль;
    |Группировка Автомобиль без упорядочивания;
    |Условие(Автомобиль=СпрАвто);
    |"//}}ЗАПРОС
    ;
    СпрАвто = СоздатьОбъект("Справочник.Автомобили");
    СпрАвто.НайтиПоКоду("XTT316300J1017380");
//    
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;

    // Подготовка к заполнению выходных форм данными запроса
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Сформировать");
    // Заполнение полей "Заголовок"
    Таб.ВывестиСекцию("Заголовок");
    Состояние("Заполнение выходной таблицы...");
    Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
    Пока Запрос.Группировка() = 1 Цикл
        // Заполнение полей Сформировать
        Таб.ВывестиСекцию("Сформировать");
    КонецЦикла;
    // Вывод заполненной формы
    Таб.ТолькоПросмотр(1);
    Таб.Показать("Сформировать", "");
КонецПроцедуры
1 URAL
 
12.01.19
12:26
в отладчике
Запрос.Группировка() = 0
2 ДенисЧ
 
12.01.19
12:27
.Группировка("Автомобиль")
3 URAL
 
12.01.19
12:27
без группировки можно ли как то получить запросом?

например в 1с8 можно так

Пока Результат.Следующий() Цикл
Документ = Выборка.Документ;
КонецЦикла;


а как в 1с7 не пойму
4 URAL
 
12.01.19
12:29
(2) Пока Запрос.Группировка("Автомобиль") = 1 Цикл   так?

не работает
5 ДенисЧ
 
12.01.19
12:38
Может, по коду не нашло?
тз = Запрос.Выгрузить();
тз.ВыбратьСтроку();

что-то показывает?
6 skafandr
 
12.01.19
12:40
Я бы написал
ТекСпрАвто=  СпрАвто.ТекущийЭлемент();
и соответственно
Условие(Автомобиль=ТекСпрАвто)
7 skafandr
 
12.01.19
12:41
в группировке будет ровно один автомобиль и нет группировки по документам ,так задумано?
8 Mihasya
 
12.01.19
12:42
Условие...
Условие(Автомобиль=СпрАвто.ТекущийЭлемент())
9 ДенисЧ
 
12.01.19
12:51
(8) Не надо так делать. Особенно, если у тебя база на SQL
10 URAL
 
12.01.19
13:42
Запрос.Выгрузить()= ошибка в выражении
11 Kigo_Kigo
 
12.01.19
13:49
Процедура Сформировать()
    Перем Запрос, ТекстЗапроса, Таб;
    //Создание объекта типа Запрос

СпрАвто = СоздатьОбъект("Справочник.Автомобили");
    Если СпрАвто.НайтиПоКоду("XTT316300J1017380") = 0 тогда
Сообщить("Авто не найден");
СтатусВозврата(0);
Возврат;
КонецЕсли

    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)

    |Период с '01.01.2017' по '31.12.2018';
    //|Без итогов;

    |ДокСправка = Документ.СправкаСчет.ТекущийДокумент;
    |Автомобиль = Документ.СправкаСчет.Автомобиль;
    |Группировка Автомобиль без упорядочивания;
    |Условие(Автомобиль в СпрАвто);
    |"//}}ЗАПРОС

    ;
12 Kigo_Kigo
 
12.01.19
13:51
Ты сначала выполняешь запрос с жестким условием, а потом только пытаешься найти авто для условия, вот и ноль на выходе, сначала переменную авто для запроса найти, потом запрос выполняй
13 URAL
 
12.01.19
15:29
Процедура Сформировать()
    Перем Запрос, ТекстЗапроса, Таб;
    
СпрАвто = СоздатьОбъект("Справочник.Автомобили");
    Если СпрАвто.НайтиПоКоду("XTT316300J1017380") = 0 тогда
Сообщить("Авто не найден");
СтатусВозврата(0);
Возврат;
КонецЕсли;
//Создание объекта типа Запрос
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |Период с '01.01.2017' по '31.12.2018';
    //|Без итогов;
    |ДокСправка = Документ.СправкаСчет.ТекущийДокумент;
    |Автомобиль = Документ.СправкаСчет.Автомобиль;
    |Группировка Автомобиль без упорядочивания;
    |Условие(Автомобиль в СпрАвто);
    |"//}}ЗАПРОС
    ;
//    
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;
    
    Пока Запрос.Группировка() = 1 Цикл

    Сообщить(Запрос.Автомобиль);
     Сообщить(Запрос.ДокСправка);
    КонецЦикла;
    
КонецПроцедуры

так работает, но не отбирает по данному автомобилю
14 URAL
 
12.01.19
15:29
выводит весь перечень документов за период
15 URAL
 
12.01.19
15:33
Вот так заработало


Процедура Сформировать()
    Перем Запрос, ТекстЗапроса, Таб;
    
СпрАвто = СоздатьОбъект("Справочник.Автомобили");
    Если СпрАвто.НайтиПоКоду("XTT316300J1017380") = 0 тогда
Сообщить("Авто не найден");
СтатусВозврата(0);
Возврат;
КонецЕсли;
ТекАвто = СпрАвто.текущийЭлемент();
//Создание объекта типа Запрос
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |Период с '01.01.2017' по '31.12.2018';
    //|Без итогов;
    |ДокСправка = Документ.СправкаСчет.ТекущийДокумент;
    |Автомобиль = Документ.СправкаСчет.Автомобиль;
    |Группировка Автомобиль без упорядочивания;
    |Условие(Автомобиль = ТекАвто);
    |"//}}ЗАПРОС
    ;
//    
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;
    
    Пока Запрос.Группировка() = 1 Цикл

    Сообщить(Запрос.Автомобиль);
     Сообщить(Запрос.ДокСправка);
    КонецЦикла;
    
КонецПроцедуры
16 URAL
 
12.01.19
15:33
но выводит два раза в сообщении

XTT316300J1017380
Справка-счет М370

Справка-счет М370
17 Kigo_Kigo
 
12.01.19
15:48
|Группировка Автомобиль;
или
|Группировка Автомобиль без групп; ?
18 Харлампий Дымба
 
12.01.19
15:48
(16) Хочешь получить список документов, а группировку ставишь по автомобилю. Да ещё и забываешь, что справочник "Автомобили" у тебя неодноуровневый. Вот и получаешь два взода в цикл, и оба раза с первым попавшимся документом. А что мешает сделать так:

ВыбАвтомобильVIN="XTT316300J1017380";
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|Период с '01.01.2017' по '31.12.2018';
|АвтомобильVIN = Документ.СправкаСчет.Автомобиль.Код;
|Группировка Документ;
|Условие(АвтомобильVIN = ВыбАвтомобильVIN);
|"//}}ЗАПРОС
;
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
    Возврат;
КонецЕсли;
Пока Запрос.Группировка("Документ") = 1 Цикл
    Сообщить(Запрос.Документ.Автомобиль);
    Сообщить(Запрос.Документ);
КонецЦикла;

Ну и надеюсь, ты помнишь, что если не указывать явно, то в запрос попадают только проведенные документы.
Ну и выбор периода ты странно придумал делать.
19 URAL
 
12.01.19
16:07
(16) Благодарю, все отлично и подробно

есть другой вопрос, взял я код и интегрировал в 1с8 и пробую получить документ подключаясь к 1с7


вот код в 1с 8
                    СпрАвто = Док7.Автомобиль;//База.СоздатьОбъект("Справочник.Автомобили");
                    //Если СпрАвто.НайтиПоКоду("XTT316300J1017380") = 0 тогда
                    //    Сообщить("Авто не найден");
                    //    СтатусВозврата(0);
                    //    Возврат;
                    //КонецЕсли;
                    ТекАвто = СпрАвто.текущийЭлемент();
                    //Создание объекта типа Запрос
                    Запрос1с7 = База.CreateObject("Запрос");
                    ТекстЗапроса =
                    "//{{ЗАПРОС(Сформировать)
                    |Период с '01.01.2017' по '31.12.2018';
                    //|Без итогов;
                    |ДокСправка = Документ.СправкаСчет.ТекущийДокумент;
                    |Автомобиль = Документ.СправкаСчет.Автомобиль;
                    |Группировка Автомобиль без упорядочивания;
                    |Условие(Автомобиль = ТекАвто);
                    |"//}}ЗАПРОС
                    ;
                    //    
                    Если Запрос1с7.Выполнить(ТекстЗапроса) = 0 Тогда
                        Возврат;
                    КонецЕсли;
                    
                    Пока Запрос1с7.Группировка() = 1 Цикл
                        Док7ПоступлениеАвто = Запрос1с7.ДокСправка;
                        //Сообщить(Запрос.Автомобиль);
                        // Сообщить(Запрос.ДокСправка);
                    КонецЦикла;
    


вот ошибка в 1с8

{ВнешняяОбработка.ПереносАвтомобилейИз1С7.Форма.Форма.Форма(75)}: Ошибка при вызове метода контекста (Выполнить)
                    Если Запрос1с7.Выполнить(ТекстЗапроса) = 0 Тогда
по причине:
Произошла исключительная ситуация (1С:Предприятие): Условие(Автомобиль = ТекАвто <<?>> );
Запрос[6] : Ошибка в выражении 'ТекАвто'
20 Харлампий Дымба
 
12.01.19
16:21
(19) Всё отлично и подробно, но я делаю по своему и опять бьюсь лбом?
Получаю ссылку на объект в 7.7, сохраняю его в переменной в 8, а потом ставлю условие в запросе в 7.7 по имени моей переменной в 8?
Зачем топтаться по граблям? Делай сразу условие по VINу, как в (18) и не мучайся.
21 Харлампий Дымба
 
12.01.19
16:23
Могу ещё сюда отправить:
Передача параметров в запрос к базе, подключенной через OLE
если хочется по-своему сделать.
22 URAL
 
12.01.19
19:56
(20) к сожалению не находит через вин
как правильно мне указать параметр автомобиля который я нашел в 1с77 через OLE из базы 1с8?
23 Харлампий Дымба
 
12.01.19
23:03
(23) Ну я не знаю. Почитай
Передача параметров в запрос к базе, подключенной через OLE
Или здесь
Передача параметров в запрос к базе, подключенной через OLE
или тут
Передача параметров в запрос к базе, подключенной через OLE
Если после 3 раз будет непонятно, как передать параметр в запросе в OLE  - то используй уже простой способ: передавай текстовое значение VIN.
И всё там работает.
На худой конец так:
|Условие(СокрЛП(АвтомобильVIN) = ВыбАвтомобильVIN);
24 Харлампий Дымба
 
12.01.19
23:08
Если в OLE из 8 в 7 то ВыбАвтомобильVIN известен в 8 то
|Условие(СокрЛП(АвтомобильVIN) = "+ВыбАвтомобильVIN+");
25 URAL
 
13.01.19
10:11
(24) не знал что конструкцию СокрЛП() можно использовать в теле запроса 1с7

Премного благодарен!!!, очень помогло понять где я ошибался
26 ДенисЧ
 
13.01.19
10:12
(25) Можно использовать, если у тебя слишком быстро работает отчёт...
27 URAL
 
13.01.19
10:40
(26) Благодарю!