7.7 Простой запрос

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 7.7"", создана пользователем Amber, 3 мар 2009.

  1. TopicStarter Overlay
    Amber
    Offline

    Amber Опытный в 1С

    Регистрация:
    16 ноя 2007
    Сообщения:
    98
    Симпатии:
    0
    Баллы:
    26
    Есть простой запрос:
    Код:
    Перем ТЗ;
    Функция Сформировать()
    КодКонтрагента="Болдырева Юлия";
    Нач= Дата("01.01.2008"); 
    Кон= Дата("03.03.2009"); 
    КонтрагентМенеджер = СоздатьОбъект("Справочник.Клиенты");
    Если КонтрагентМенеджер.НайтиПоНаименованию(СокрЛП(КодКонтрагента)) = 1 Тогда
    КонтрагентСсылка = КонтрагентМенеджер.ТекущийЭлемент();
    КонецЕсли;
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса ="  
    |Период с Нач по Кон;
    |ИтоговаяСумма = Документ.Заказ.ИтоговаяСумма;
    |Наименование = Документ.Заказ.Клиент.Наименование;
    |Условие(Наименование=КонтрагентСсылка.Наименование);
    |";
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
    Возврат 0;
    Иначе
    Запрос.Выгрузить(ТЗ,0,0); 
    Возврат(ТЗ);
    КонецЕсли;
    КонецФункции 
    
    
    Тз вовращается пустая(смотрю в отладчике-строк 0). Подскажите в чем проблема? Документы по этому клиенту в заданном интервале существуют.
  2. ASh
    Offline

    ASh Опытный в 1С

    Регистрация:
    10 сен 2008
    Сообщения:
    568
    Симпатии:
    0
    Баллы:
    26
    У Вас тут несколько ошибок.
    Код:
    Если КонтрагентМенеджер.НайтиПоНаименованию(СокрЛП(КодКонтрагента)) = 1 Тогда
    КонтрагентСсылка = КонтрагентМенеджер.ТекущийЭлемент();
    КонецЕсли;
    
    Если здесь контрагент не найден, зачем еще что-то делать?
    Пишем:
    Код:
    Если КонтрагентМенеджер.НайтиПоНаименованию(СокрЛП(КодКонтрагента)) = 1 Тогда
    КонтрагентСсылка = КонтрагентМенеджер.ТекущийЭлемент();
    Иначе
    Сообщить("Не найден контрагент "+КодКонтрагента);
    Возврат 0;
    КонецЕсли;
    
    Теперь про условие в запросе. Через наименование оно работать не будет. Вернее, оно сработает, но не так как нужно. В запросе 1с обращается к полю таблицы (фиксированной длины). Например, в конфигураторе задана длина наименования справочника "Клиенты" 25 символов. У нас есть элемент этого справочника "КонтрагентСсылка". В Вашем примере КонтрагентСсылка.Наименование = "Болдырева Юлия" (14 символов) и в запросе он будет сравниваться со строками длиной в 25 символов. Т.е. когда сравнение дойдет до нужного элемента, условие будет "Болдырева Юлия_________"="Болдырева Юлия" -ЛОЖЬ.
    Да все это и ненужно:) Раз уж мы нашли нужный элемент, то и условие должно быть таким:
    Код:
    |...
    |Клиент = Документ.Заказ.Клиент;
    |...
    |Условие(Клиент=КонтрагентСсылка);
    
    Далее вообще непонятно, что Вы хотите получить в результате. Хотя можно предположить, что либо сумму всех заказов выбранного контрагента за период (правда, в этом случае непонятно зачем нужна ТЗ), либо список сумм из этих документов (здесь будут нужны дополнительные переменные в запросе).
    В первом случае нужно использовать функцию:
    Код:
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса ="  
    |Период с Нач по Кон;
    |ИтоговаяСумма = Документ.Заказ.ИтоговаяСумма;
    |Клиент = Документ.Заказ.Клиент;
    |Функция ВсегоПоКлиенту = Сумма(ИтоговаяСумма);
    |Условие(Клиент=КонтрагентСсылка);
    |";
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
    Возврат 0;
    Иначе
    Возврат Запрос.ПолучитьАтрибут("ВсегоПоКлиенту");
    КонецЕсли;
    
    , во втором группировки:
    Код:
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса ="  
    |Период с Нач по Кон;
    |ИтоговаяСумма = Документ.Заказ.ИтоговаяСумма;
    |Клиент = Документ.Заказ.Клиент;
    |ДокДата = Документ.Заказ.ДатаДок;
    |ДокНомер = Документ.Заказ.НомерДок;
    |Условие(Клиент=КонтрагентСсылка);
    |Группировка ДокДата;
    |Группировка ДокНомер;
    |";
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
    Возврат 0;
    Иначе
    Запрос.Выгрузить(ТЗ,1,0); 
    Возврат  ТЗ;
    КонецЕсли;
    
    Обратите внимание на параметр Запрос.Выгрузить(ТЗ,1,0); Он позволяет выводить в таблицу значения дополнительных переменных (нужная нам "ИтоговаяСумма").

    P.S. А Ваш запрос, даже если бы условие выполнилось, вернул бы сумму и имя клиента последнего найденного документа. А в ТЗ ничего не выводится, потому что нет ни функций, ни групп и стоит параметр Запрос.Выгрузить(ТЗ,0,0);

Поделиться этой страницей