• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

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

  • Автор темы Irisha
  • Дата начала
I

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к> и <Запрос.Клиент>
Клиентов переносит, а в колонках с суммами выводятся нули.
В чем состоит задача: Имеется справочник контрагентов, в журнале документов имеются документы, где указано какому клиенту какая сумма начислена и за какой вид мусора (услуги вывоза мусора). Нужно просуммировать за период все начисленные суммы в соотвествующую колонку.
Помогите решить проблему!
 
V

vitfil

Не увидел в запросе НИ ОДНОЙ функции. Бегом читать документацию или смотреть примеры запросов в любой типовой конфигурации!
 
I

Irisha

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

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

vbs

Объясните, что я не так делаю
А что не так получается ?

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

Irisha

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

Irisha

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

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

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

puh14

|Условие(Запрос.ВесНО>Запрос.Лим);
|Условие(Запрос.Вес4к>Запрос.Лим);
|Условие (Запрос.Вес3к>Запрос.Лим);

и стаким кодом ЭТО работает???

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

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

vbs

Мой отчет выдает только "Шапку" и "Подвал", хотя превышение лимита есть...
Irisha, вместо того, чтобы выкладывать значительные куски кода, осмелюсь порекомендовать следующее :
так как запрос плохо дружит с отладчиком, попробуй выгрузить его в таблицу значений (Запрос.Выгрузить(ТЗ)),
при просмотре последней будет ясно, как он отработал
 
I

Irisha

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

vbs

Тогда и условие в запросе не нужно, а анализировать придется при его обработке
 
P

puh14

Условие на результат выполнения функции в запросе поставить невозможно. Только при обработке результатов запроса.
 
I

Irisha

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

vbs

А как выглядит ТЗ после выгрузки в нее запроса ?
 
I

Irisha

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

puh14

Создай таблицу значений на форме с именем твой таблицы значений, а в модуле закомментируй строчку создания таблицы значений.
 
I

Irisha

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

vbs

Значит, запрос не срабатывает

Может, опять группировок нет ?
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!