Помогите с запросом

Тема в разделе "1C и всё что с ней связано", создана пользователем Irisha, 20 апр 2010.

  1. Irisha

    Irisha Гость

    Такая проблема: Имеется модуль обработки:
    Процедура Выполнить()
    Перем Запрос, ТекстЗапроса, Таб, ОбъемНО, ВесНО, Вес4к, Вес3к, Вес2к, СуммаНО, Сумма4к, Сумма3к, Сумма2к, Сумма, Счетчик;
    //Создание объекта типа Запрос
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |Период с дата1 по дата2;
    |ОбрабатыватьДокументы проведенные;
    |Обрабатывать НЕПомеченныеНаУдаление;
    |НачислениеЭН = Документ.НачисленияЭкологческогоНалога.ТекущийДокумент;
    |КО = Документ.НачисленияЭкологческогоНалога.КО;
    |Ном = Документ.НачисленияЭкологческогоНалога.НомерСтроки;
    |Клиент = Справочник.Контрагенты.Наименование;
    |Группировка Клиент Упорядочить По Клиент.Наименование;
    |Группировка НачислениеЭН;
    |"
    //}}ЗАПРОС
    ;
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
    Возврат;
    КонецЕсли;
    Счетчик=0;
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Таблица");
    Таб.ВывестиСекцию("шапка");
    Состояние("Заполнение выходной таблицы...");
    Сумма=0;СуммаНО=0; Сумма4к=0; Сумма3к=0; Сумма2к=0; ВесНО=0; ОбъемНО=0;
    Вес4к=0; Вес3к=0; Вес2к=0;

    Пока Запрос.Группировка(1) = 1 Цикл
    Счетчик=Счетчик+1;
    Пока Запрос.Группировка(2)=1 цикл
    Если (Запрос.Клиент=Запрос.НачислениеЭН.Контрагенты) тогда
    Если (Врег(Запрос.КО)="НО")тогда
    СуммаНО=СуммаНО+Запрос.НачислениеЭН("Сумма");
    ВесНО=ВесНО+Запрос.НачислениеЭН("Вес");
    ОбъемНО=ОбъемНо+Запрос.НачислениеЭН("Объем");
    КонецЕсли;
    Если (Врег(Запрос.КО)="4К")тогда
    Сумма4к=Сумма4к+Запрос.НачислениеЭН("Сумма");
    Вес4к=Вес4к+Запрос.НачислениеЭН("Вес");
    КонецЕсли;
    Если (Врег(Запрос.КО)="3К")тогда
    Сумма3к=Сумма3к+Запрос.НачислениеЭН("Сумма");
    Вес3к=Вес3к+Запрос.НачислениеЭН("Вес");
    КонецЕсли;
    Если (Врег(Запрос.КО)="2К")тогда
    Сумма2к=Сумма2к+Запрос.НачислениеЭН("Сумма");
    Вес2к=Вес2к+запрос.НачислениеЭН("Вес");
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    Таб.ВывестиСекцию("Строка");
    КонецЦикла;

    Таб.ВывестиСекцию("Подвал");
    Таб.ТолькоПросмотр(1);
    Таб.Показать("Таблица", "");
    КонецПроцедуры


    В печатную форму переношу <СуммаНО><Сумма4к><Сумма3к><Сумма2к> и <Запрос.Клиент>
    Клиентов переносит, а в колонках с суммами выводятся нули.
    В чем состоит задача: Имеется справочник контрагентов, в журнале документов имеются документы, где указано какому клиенту какая сумма начислена и за какой вид мусора (услуги вывоза мусора). Нужно просуммировать за период все начисленные суммы в соотвествующую колонку.
    Помогите решить проблему!
     
  2. vitfil

    vitfil IT-интегратор

    Регистрация:
    2 апр 2004
    Сообщения:
    2.070
    Симпатии:
    0
    Не увидел в запросе НИ ОДНОЙ функции. Бегом читать документацию или смотреть примеры запросов в любой типовой конфигурации!
     
  3. Irisha

    Irisha Гость

    Здравствуйте еще раз. Проблема решена... Но вот возникла еще одна: Имеется справочник Контрагенты, Имеется подчиненный ему справочник ВидыМусора, где указано за кем какие виды мусора числятся и лимит на каждый из них. В отчете необходимо увидеть кто из контрагентов превысил лимит (если превысил) и насколько. Объясните, что я не так делаю:

    Процедура Сформировать()
    Перем Запрос, ТекстЗапроса, Таб, Счетчик;
    //Создание объекта типа Запрос
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |Период с ВыбНачПериода по ВыбКонПериода;
    |Обрабатывать НеПомеченныеНаУдаление;
    |Утилизация = Документ.РаботыПоУтилизации.ТекущийДокумент;
    |Клиент = Документ.РаботыПоУтилизации.Клиент.ПолнНаименование;
    |УНН = Документ.РаботыПоУтилизации.Клиент.УНН;
    |КО = Документ.РаботыПоУтилизации.КлассОпасности;
    |Вес = Документ.РаботыПоУтилизации.Вес;
    |Функция ВесНО = Сумма(Вес) когда (КО=Перечисление.КлассОпасности.Неопасные);
    |Функция Вес4к = Сумма(Вес) когда (КО=Перечисление.КлассОпасности.Четвертый);
    |Функция Вес3к = Сумма(Вес) когда (КО=Перечисление.КлассОпасности.Третий);
    |Функция Вес2к = Сумма(Вес) когда (КО=Перечисление.КлассОпасности.Второй);
    |Группировка Клиент;
    |"//}}ЗАПРОС
    ;
    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
    Возврат;
    КонецЕсли;
    Счетчик = 0; Лим = 0;
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Сформировать");
    // Заполнение полей "Заголовок"
    Таб.ВывестиСекцию("Шапка");
    Состояние("Заполнение выходной таблицы...");
    Пока Запрос.Группировка(1) = 1 Цикл
    Счетчик=Счетчик+1;
    Лим = ПолучитьЛимит(Запрос.Клиент);
    Если Запрос.КО=Перечисление.КлассОпасности.Неопасные тогда
    Таб.ВывестиСекцию("СтрокаНО");
    КонецЕсли;
    Если Запрос.КО=Перечисление.КлассОпасности.Четвертый тогда
    Таб.ВывестиСекцию("Строка4к");
    КонецЕсли;
    Если Запрос.КО=Перечисление.КлассОпасности.Третий тогда
    Таб.ВывестиСекцию("Строка3к");
    КонецЕсли;
    Если Запрос.КО=Перечисление.КлассОпасности.Второй тогда
    Таб.ВывестиСекцию("Строка2к");
    КонецЕсли;
    КонецЦикла;
    Таб.ВывестиСекцию("Подвал");
    Таб.ТолькоПросмотр(1);
    Таб.Показать("Сформировать", "");
    КонецПроцедуры
     
  4. vbs

    vbs Well-Known Member

    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    А что не так получается ?

    Попробую вычислить.
    Если функция
    ПолучитьЛимит(Запрос.Клиент);
    пытается обработать подчиненный справочник, ничего не выйдет, ибо Запрос.Клиент - строка, а не элемент справочника
     
  5. Irisha

    Irisha Гость

    Спасибо за подсказку... Как можно справиться с задачей иным способом??? Имею в виду ПолучитьЛимит
     
  6. KiR

    KiR НЕ шибка опытный програмер)
    1C Team

    Регистрация:
    11 сен 2007
    Сообщения:
    1.581
    Симпатии:
    0
    попробую предположить. в строке
    стоит убрать .ПолнНаименование или заменить на .Ссылка
     
  7. vbs

    vbs Well-Known Member

    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    не прокатит

    Клиент = Документ.РаботыПоУтилизации.Клиент; - вот тогда и будет ссылка, это же 7.7 :wacko:
     
  8. Irisha

    Irisha Гость

    Решила поступить так: теперь у меня в самом документе есть реквизит РаботыПоУтилизации.Лимит
    Будет ли функционировать такой запрос:

    Процедура Сформировать()
    Перем Запрос, ТекстЗапроса, Таб, Счетчик;
    //Создание объекта типа Запрос
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |Период с ВыбНачПериода по ВыбКонПериода;
    |Обрабатывать НеПомеченныеНаУдаление;
    |Утилизация = Документ.РаботыПоУтилизации.ТекущийДокумент;
    |Клиент = Документ.РаботыПоУтилизации.Клиент.Наименование;
    |УНН = Документ.РаботыПоУтилизации.УНН;
    |КО = Документ.РаботыПоУтилизации.КлассОпасности;
    |Вес = Документ.РаботыПоУтилизации.Вес;
    |Лим = Документ.РаботыПоУтилизации.Лимит;
    |Функция ВесНО = Сумма(Вес) когда (КО=Перечисление.КлассОпасности.Неопасные);
    |Функция Вес4к = Сумма(Вес) когда (КО=Перечисление.КлассОпасности.Четвертый);
    |Функция Вес3к = Сумма(Вес) когда (КО=Перечисление.КлассОпасности.Третий);
    |Функция Вес2к = Сумма(Вес) когда (КО=Перечисление.КлассОпасности.Второй);
    |Условие(Запрос.ВесНО>Запрос.Лим);
    |Условие(Запрос.Вес4к>Запрос.Лим);
    |Условие (Запрос.Вес3к>Запрос.Лим);
    |"//}}ЗАПРОС
    ;
    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
    Возврат;
    КонецЕсли;
    Счетчик = 0; Лим = 0;
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Свод");
    // Заполнение полей "Заголовок"
    Таб.ВывестиСекцию("Шапка");
    Состояние("Заполнение выходной таблицы...");
    Пока Запрос.Группировка(1) = 1 Цикл
    Счетчик=Счетчик+1;
    Если Запрос.КО=Перечисление.КлассОпасности.Неопасные тогда
    Таб.ВывестиСекцию("СтрокаНО");
    КонецЕсли;
    Если Запрос.КО=Перечисление.КлассОпасности.Четвертый тогда
    Таб.ВывестиСекцию("Строка4к");
    КонецЕсли;
    Если Запрос.КО=Перечисление.КлассОпасности.Третий тогда
    Таб.ВывестиСекцию("Строка3к");
    КонецЕсли;
    КонецЦикла;
    Таб.ВывестиСекцию("Подвал");
    Таб.ТолькоПросмотр(1);
    Таб.Показать("Сформировать", "");
    КонецПроцедуры

    Меня интересует все Условия в запросе должны выполняться одновременно для того чтобы попасть в выборку?
    Мой отчет выдает только "Шапку" и "Подвал", хотя превышение лимита есть... :)
     
  9. puh14

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    и стаким кодом ЭТО работает???

    правильнее писать |Функция ВесНО = Сумма(Вес) когда ((КО=Перечисление.КлассОпасности.Неопасные) и (Вес>Лим));

    насчет пустоты
    Нет группировок - нет выходной таблицы
     
  10. vbs

    vbs Well-Known Member

    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    Irisha, вместо того, чтобы выкладывать значительные куски кода, осмелюсь порекомендовать следующее :
    так как запрос плохо дружит с отладчиком, попробуй выгрузить его в таблицу значений (Запрос.Выгрузить(ТЗ)),
    при просмотре последней будет ясно, как он отработал
     
  11. Irisha

    Irisha Гость

    По-моему эта функция отберет значения в том случае, если вес окажется больше лимита... а нужно, чтобы вес суммировался за весь период (месяц) и уже потом не должно превышать лимит.
     
  12. vbs

    vbs Well-Known Member

    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    Тогда и условие в запросе не нужно, а анализировать придется при его обработке
     
  13. puh14

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    Условие на результат выполнения функции в запросе поставить невозможно. Только при обработке результатов запроса.
     
  14. Irisha

    Irisha Гость

    Большое спасибо... Все учту!
     
  15. Irisha

    Irisha Гость

    Что-то у меня не совсем все гладко ни с запросом, ни с таблицей значений... хотя убрала условия сравниваю с лимитами в цикле по группировке. А в отчете все еще ничего не изменилось только "Шапка" да "Подвал".
     
  16. vbs

    vbs Well-Known Member

    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    А как выглядит ТЗ после выгрузки в нее запроса ?
     
  17. Irisha

    Irisha Гость

    Я так понимаю, что ТЗ после выгрузки имеет те же имена колонок, что и переменные запроса. Я обращаюсь к ТЗ из печатной формы. Но вот как раз здесь и ничего не выводится... Совсем пусто (ни нулей: вообще ничего). можно ли ТЗ просмотреть из модуля?
     
  18. puh14

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    Создай таблицу значений на форме с именем твой таблицы значений, а в модуле закомментируй строчку создания таблицы значений.
     
  19. Irisha

    Irisha Гость

    Спасибо! Теперь я вижу таблицу значений с нужными колонками, но ни одной заполненной строки :)
     
  20. vbs

    vbs Well-Known Member

    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    Значит, запрос не срабатывает

    Может, опять группировок нет ?
     
Загрузка...

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