Консультация № 141995
22.08.2008, 19:19
0.00 руб.
0 4 1
Здравствуйте, эксперты.
Вопрос по платформе 7.7, связан с запросом к регистру. Имеется регистр взаиморасчетов с поставщиками, измерения – поставщик и документ поступления, ресурс – сумма, а также реквизит вид движения (который по-моему является лишним).
Для получения информации о кредиторской задолженности формируется следующий запрос (см. в Приложении).

Проблема заключается в следующем: необходимо, чтобы по запросу из регистра отбиралась только та информация, по которой конечный остаток ресурса (суммы) больше нуля. В соответствии с приведенным запросом по регистру отбирается вся информация, по которой хотя бы одна из функций вернет ненулевое значение. Сначала решил использовать:

Условие(СуммаКонОст > 0)

но как оказалось (судя по сообщению ошибки) в условии запроса нельзя использовать имена функций.
Единственное решение, которое пока приходит в голову, после выполнения приведенного запроса выгружать результат в таблицу значений и, затем, перебором всех строк производить выборочное удаление по уже упомянутому условию. Но хотелось бы отобрать всю информацию через запрос. Подскажите, если есть идеи.


Приложение:
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|Период С ДатаНачалаПериода;

|Поставщик=Регистр.ВзаиморасчетыПоставщики.Поставщик;
|ДокументПоступления=Регистр.ВзаиморасчетыПоставщики.ДокументПоступления;
|Сумма=Регистр.ВзаиморасчетыПоставщики.Сумма;

|Функция СуммаПриход = Приход(Сумма);
|Функция СуммаРасход = Расход(Сумма);
|Функция СуммаКонОст = КонОст(Сумма);

|Группировка Поставщик;
|Группировка ДокументПоступления;

|Условие(Контрагент = Поставщик);
|"//}}ЗАПРОС
;

Обсуждение

Неизвестный
23.08.2008, 07:56
общий
это ответ
Здравствуйте, Stalwart! Судя по условию в запросе: "Контрагент = Поставщик" поставщик у вас один поэтому ваш вопрос о выборе в запросе данных где "...конечный остаток ресурса (суммы) больше нуля..." относится к выбираемым документам, хотя тот же принцип можно применить и к измерению "Поставщик" если захотите. Я столкнулся недавно с такой же поблемой сразу скажу что если данных достаточно много то перебирать данные в таблице значений то же можно часами как выяснилось.Поэтому пошел следующим путем , делаем поледовательно два запроса:
1. Сначала делаем запрос в котором только одна функция: СуммаКонОст = КонОст(Сумма) т.е. ваш же запрос в которм убрать лишние функции;
2. Потом результаты этого запроса в вашем случае по документам поступления с ненулевыми конечными остатками выгружаем в список значений:
Табл = СоздатьОбъект("ТаблицаЗначений");
СписДок = СоздатьОбъект("СписокЗначений");
ЗАПРОС.Выгрузить(Табл,0,0);
Табл.Выгрузить(,,,"ДокументПоступления");
3. Делаем ваш опять же запрос но уже полностью т.е. со всеми функциями какие вам нужны, а в условия добавляем:
Условие(ДокументПоступления в СписДок);
Таким образом основной запрос пройдет только по тем документам где точно есть конечные остатки.Удачи !!!

Неизвестный
23.08.2008, 07:58
общий
Поторопился чего то поправьте: Табл.Выгрузить(СписДок,,,"ДокументПоступления");
Неизвестный
23.08.2008, 21:59
общий
Что значит "тот же принцип можно применить и к измерению "Поставщик"?
У вас в запросе стоит условие: Условие(Контрагент = Поставщик) значит запрос будет по какому то конкретному поставщику, если бы вы формировали отчет по нескольким контаргентам то условие было бы: Условие(Контрагент в ВыбПоставщика) где ВыбПоставщик это список значений или папка, а если по всем контаргентам тогда это условие вообще отсутствовало бы.
Короче к чему это я, если нужно оптимизировать и по контрагентам то пишем:
Табл = СоздатьОбъект("ТаблицаЗначений");
СписДок = СоздатьОбъект("СписокЗначений");
СписПост = СоздатьОбъект("СписокЗначений");
ЗАПРОС.Выгрузить(Табл,0,0);
Табл.Выгрузить(СписДок,,,"Поставщик");
Табл.Выгрузить(СписПост,,,"ДокументПоступления");
В условия второго основного запроса добавляем уже два условия:
Условие(ДокументПоступления в СписДок);
Условие(Поставщик в СписПост);


На мой взгляд очень понятно написал. Удачи !!!
Неизвестный
23.08.2008, 22:12
общий
А, теперь понял, согласен!
Форма ответа