Вход | Регистрация
 

Обращение к "вложенным" полям запросов

Обращение к "вложенным" полям запросов
Я
   oduvanchikyan
 
10.08.21 - 13:40
Добрый день!
Хочу обращаться к полям запроса, проблема возникла в полях которые являются, так сказать, "вложенными".
Запрос.Текст = "ВЫБРАТЬ
                |    СчетНаОплатуПокупателю.Номер,
                |    СчетНаОплатуПокупателю.Дата,
                |    СчетНаОплатуПокупателю.Товары.(
                |        Номенклатура.Наименование КАК ТоварыНаименование,
                |        Цена,
                |        Сумма,
                |        Количество
                |    ),
                |    СчетНаОплатуПокупателю.Услуги.(
                |        Номенклатура.Наименование КАК УслугиНаименование,
                |        Количество,
                |        Цена,
                |        Сумма
                |    ),
                |    СчетНаОплатуПокупателю.Организация.НаименованиеПолное КАК ОрганизацияНаименование,
                |    СчетНаОплатуПокупателю.Организация.Код КАК ОрганизацияКод,
                |    СчетНаОплатуПокупателю.Контрагент.НаименованиеПолное КАК КонтрагентНаименование,
                |    СчетНаОплатуПокупателю.Контрагент.КодПоЕДРПОУ КАК КонтрагентКодПоЕДРПОУ,
                |    СчетНаОплатуПокупателю.Контрагент.ИНН КАК КонтрагентКодИНН
                |ИЗ
                |    Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю
                |
                |ГДЕ
                |    СчетНаОплатуПокупателю.Ссылка = &ТекущийДокумент";
Пожалуйста подскажите как обращаться к  полям по типу СчетНаОплатуПокупателю.Товары () или СчетНаОплатуПокупателю.Услуги!?
   1Сергей
 
1 - 10.08.21 - 13:42
Лучше не оперировать конструкцией со скобками. Соединяйте таблицы Документ.СчетНаОплатуПокупателю, Документ.СчетНаОплатуПокупателю.Товары и Документ.СчетНаОплатуПокупателю.Услуги
   oduvanchikyan
 
2 - 10.08.21 - 13:48
(1) А как их соединять ? Я пробовал указывать через создание отдельных таблиц для таких конструкций, но информация не подтягивается в таком случае, ведь информация берется  уже с двух таблиц или я уже путаю, что-то ?
|ИЗ
|    Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю
|    Документ.СчетНаОплатуПокупателю.Товары КАК СчетНаОплатуПокупателюТовары
Примерно так 
При этом это единственное, что я меняю ...
   Mankubus
 
3 - 10.08.21 - 13:50
ВЫБРАТЬ
    РеализацияТоваровУслуг.Ссылка КАК Ссылка
ИЗ
    Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
        ПО РеализацияТоваровУслуг.Ссылка = РеализацияТоваровУслугТовары.Ссылка

   ДенисЧ
 
4 - 10.08.21 - 13:51
Из Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю
левое соединение Документ.СчетНаОплатуПокупателю.Товары КАК СчетНаОплатуПокупателюТовары
по СчетНаОплатуПокупателю.ссылка = СчетНаОплатуПокупателюТовары.ссылка.


Это конструктор запрос же сам сделает...
   oduvanchikyan
 
5 - 10.08.21 - 14:09
(4) Спасибо, но результат пустой, то есть поля неопределенны, с чем может быть проблема? А так же жалуется на СчетНаОплатуПокупателюТовары.Номенклатура.Наименование КАК ТоварыНаименование --- "Поле объекта не обнаружено".
   1Сергей
 
6 - 10.08.21 - 14:33
(5) весь запрос покажите
   hhhh
 
7 - 10.08.21 - 14:55
(5) Наименование сразу выбросьте, его никогда не пишут. Пишите
Номенклатура КАК Номенклатура
   oduvanchikyan
 
8 - 10.08.21 - 15:53
(6) (7) (4)  Решил проблему, все работает. Хотел уточнить по поводу вопроса обхода по результату запроса. Почему первый товар не отображается, а берется 2 и 3 товары, да и 3 дублируется :
 Пока Результат.Следующий() Цикл 
    ОбластьМакетТаблица.Параметры.НомерСтроки = НомерСтроки; 
    ОбластьМакетТаблица.Параметры.Товар = Результат.ТоварыНаименование;
     ОбластьМакетТаблица.Параметры.Количество = Результат.Количество;
     ОбластьМакетТаблица.Параметры.Цена = Результат.Цена;
     ОбластьМакетТаблица.Параметры.Сумма = Результат.Сумма;
    НомерСтроки = НомерСтроки+1;
    Сообщить(НомерСтроки);
    ТабДокумент.Вывести(ОбластьМакетТаблица);
 КонецЦикла;
   1Сергей
 
9 - 10.08.21 - 17:39
(8) Что делается до цикла?
   oduvanchikyan
 
10 - 10.08.21 - 17:49
(9)  Запрос = Новый Запрос;
 Запрос.Текст = "ВЫБРАТЬ
                |    СчетНаОплатуПокупателю.Номер,
                |    СчетНаОплатуПокупателю.Дата,
                |    СчетНаОплатуПокупателю.Ссылка,
                |    СчетНаОплатуПокупателюТовары.Цена,
                |    СчетНаОплатуПокупателюТовары.Сумма,
                |    СчетНаОплатуПокупателюТовары.Количество,
                |    СчетНаОплатуПокупателюТовары.Номенклатура.Наименование КАК ТоварыНаименование,
                |    СчетНаОплатуПокупателю.Услуги.(
                |        Номенклатура.Наименование КАК УслугиНаименование,
                |        Количество,
                |        Цена,
                |        Сумма
                |    ),
                |    СчетНаОплатуПокупателю.Организация.НаименованиеПолное КАК ОрганизацияНаименование,
                |    СчетНаОплатуПокупателю.Организация.Код КАК ОрганизацияКод,
                |    СчетНаОплатуПокупателю.Контрагент.НаименованиеПолное КАК КонтрагентНаименование,
                |    СчетНаОплатуПокупателю.Контрагент.КодПоЕДРПОУ КАК КонтрагентКодПоЕДРПОУ,
                |    СчетНаОплатуПокупателю.Контрагент.ИНН КАК КонтрагентКодИНН
                |ИЗ
                |    Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю,
        |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.СчетНаОплатуПокупателю.Товары КАК СчетНаОплатуПокупателюТовары
        |        ПО СчетНаОплатуПокупателю.Ссылка = СчетНаОплатуПокупателюТовары.Ссылка
                |ГДЕ
                |    СчетНаОплатуПокупателю.Ссылка = &ТекущийДокумент";
                
 Запрос.УстановитьПараметр("ТекущийДокумент", СсылкаНаОбъект);//используем в качестве параметра реквизит обработки СсылкаНаОбъект

 
 Результат = Запрос.Выполнить().Выбрать();
//Результат.Следующий();

  
//Созданим и заполним табличный документ

 ТабДокумент = Новый ТабличныйДокумент;
 Макет = ПолучитьМакет("Макет");
 
//Область Заголовок

 ОбластьМакетаЗаголовок = Макет.ПолучитьОбласть("Заголовок");
 ОбластьМакетаЗаголовок.Параметры.ТекстЗаголовка = "Счет на оплату №" + Результат.Номер + " от " + Результат.Дата;
 ТабДокумент.Вывести(ОбластьМакетаЗаголовок);
 
 
//Область Реквизит

//Наименование Поставщика

 ОбластьМакетаРеквизит = Макет.ПолучитьОбласть("Реквизит");
 ОбластьМакетаРеквизит.Параметры.ПредставлениеПоставщика = Результат.ОрганизацияНаименование;
 
//Код Поставщика

 ОбластьМакетаРеквизит.Параметры.РеквизитПоставщика = Результат.ОрганизацияКод;

 
//Наименование Покупателя

 ОбластьМакетаРеквизит.Параметры.ПредставлениеПокупатель = Результат.КонтрагентНаименование;

 Если Результат.КонтрагентКодПоЕДРПОУ = Неопределено Тогда
    //Код покупателя ИНН

    ОбластьМакетаРеквизит.Параметры.РеквизитПокупателя = Результат.КонтрагентКодИНН;
 Иначе
     //Код Покупателя ЕГРПОУ

     ОбластьМакетаРеквизит.Параметры.РеквизитПокупателя = Результат.КонтрагентКодПоЕДРПОУ;
 КонецЕсли;

 ТабДокумент.Вывести(ОбластьМакетаРеквизит); 
 
//Область Шапка таблицы

 ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");
 ТабДокумент.Вывести(ОбластьШапкаТаблицы);
 
//Область Тело таблицы

 ОбластьМакетТаблица = Макет.ПолучитьОбласть("ТелоТаблицы");
 НомерСтроки = 0;
 Сообщить("Номер результата = "+Результат.Номер);
 Сообщить("Номер результата = "+Результат.Дата);
 Сообщить(Результат.Количество());
 Для Номерстроки = 2 По Результат.Количество() Цикл
    Результат.Следующий();
    ОбластьМакетТаблица.Параметры.НомерСтроки = НомерСтроки; 
    ОбластьМакетТаблица.Параметры.Товар = Результат.ТоварыНаименование;
     ОбластьМакетТаблица.Параметры.Количество = Результат.Количество;
     ОбластьМакетТаблица.Параметры.Цена = Результат.Цена;
     ОбластьМакетТаблица.Параметры.Сумма = Результат.Сумма;
    Сообщить("Номер = "+НомерСтроки);
    ТабДокумент.Вывести(ОбластьМакетТаблица);
КонецЦикла;
   1Сергей
 
11 - 10.08.21 - 17:54
(10)

Результат.Сбросить();
Пока Результат.Следующий() Цикл
    ...
   oduvanchikyan
 
12 - 10.08.21 - 17:59
(11) Большое человеческое спасибо!!

Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.