HELP: Ищу красивое решение по формированию запроса

1. GSoft 2235 05.12.16 15:30 Сейчас в теме
Есть два регистра: ОстаткиНоменклатуры и ЗаказыПокупателей в каждом из которых есть реквизит Количество

Суть задачи достаточно простая - получить запросом текущий остаток с учетом резерва.

соответственно задача решается следующим куском кода


				ТекстЗапроса = 
			"//{{ЗАПРОС(Сформировать)
			//|с ДатаНач по ДатаКон;
			|Количество					= Регистр.ОстаткиНоменклатуры.Количество;  
			|";
			
			Если ТабНастрОстДоговоры.ОстБезРезерва = 0 Тогда
				//считаем только остатки на складе
				ТекстЗапроса = ТекстЗапроса + "	
				|Номенклатура			= Регистр.ОстаткиНоменклатуры.Номенклатура;
				|ШтрихКод				= Регистр.ОстаткиНоменклатуры.ПозицияНоменклатуры.ШтрихКод;
				|Артикул				= Регистр.ОстаткиНоменклатуры.Номенклатура.Артикул;  
				|Склад					= Регистр.ОстаткиНоменклатуры.МестоХранения;
				|Статус					= Регистр.ОстаткиНоменклатуры.Номенклатура.Статус;
				|Функция Остаток		= КонОст(Количество); 
				|Условие (Количество > 0);
				|";
			Иначе
				//при подсчете остатков считаем сколько забронировано
				ТекстЗапроса = ТекстЗапроса + "
				|Номенклатура			= Регистр.ОстаткиНоменклатуры.Номенклатура, Регистр.ЗаказыПокупателей.Номенклатура;
				|ШтрихКод				= Регистр.ОстаткиНоменклатуры.ПозицияНоменклатуры.ШтрихКод, Регистр.ЗаказыПокупателей.ПозицияНоменклатуры.ШтрихКод;
				|Артикул				= Регистр.ОстаткиНоменклатуры.Номенклатура.Артикул, Регистр.ЗаказыПокупателей.Номенклатура.Артикул;
				|Склад					= Регистр.ОстаткиНоменклатуры.МестоХранения, Регистр.ЗаказыПокупателей.МестоХранения;
				|Статус					= Регистр.ОстаткиНоменклатуры.Номенклатура.Статус,  Регистр.ЗаказыПокупателей.Номенклатура.Статус;
				|Резерв					= Регистр.ЗаказыПокупателей.Количество;	
				|Функция фКоличество	= КонОст(Количество); 
				|Функция фРезерв		= КонОст(Резерв); 
				|Функция Остаток		= Сумма(Запрос.фКоличество - Запрос.фРезерв);
   				|Условие ((Количество > 0) или (Резерв > 0));
				|";
			КонецЕсли;
			
			ТекстЗапроса = ТекстЗапроса + "	
			|Функция Ошибка				= Сумма(ПроверкаШтрихкода(Штрихкод)); 
			|Группировка Артикул;
			|Группировка Номенклатура упорядочить по Номенклатура.Артикул без групп;
			|Группировка ШтрихКод;
			|Условие(Статус в сзЗапроса);
			|"//}}ЗАПРОС
			;           
Показать


Все бы ничего, однако в тоже время в запросе введена допфункция Ошибка которая проверяет правильность формирования запроса и на выходе выдает значение для номера иконки в ТЗ.

И вот в этом то как раз загвоздка - когда имеем кол-во из остатков и кол-во из брони то итоговый остаток считается однако значение функции ошибка суммируется применительно к значению каждого регистра. Например - "правильное значение иконки" - 8, а результат по функции может быть - 24. Это для комбинации 3 шт в остатках и 2 штуки в брони.


К тому же вариант
				|Функция фКоличество	= КонОст(Количество); 
				|Функция фРезерв		= КонОст(Резерв); 
				|Функция Остаток		= Сумма(Запрос.фКоличество - Запрос.фРезерв);

приводит к тому что на выходе в результате работы запроса выводятся строки с "нулевым остатком", т.е. по которым текущий остаток = забронированному количеству.

Не могу найти красивого решения чтобы обойти этот косяк сразу в тексте запроса.


Единственное что приходит в голову это переписать конфу так чтобы изначально "сменить знак с + на -" в реквизите Количество регистра ЗаказыПокупателей . То есть когда мы туда заносим бронь - количество пишется с -, а не с + как сейчас. Правда это геморно. Зато позволит написать конструкцию
|Количество = Регистр.ОстаткиНоменклатуры.Количество, Регистр.ЗаказыПокупателей.Количество;


и использовать сразу одну функцию для остатка, что позволит в том числе уйти от строк с "нулевыми остатками".


Может кто подскажет более красивое решение, а?
повторюсь - хочу сделать все внутри запроса, перебор в ТЗ не предлагать.
По теме из базы знаний
Ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. Shreki2015 2 06.12.16 17:28 Сейчас в теме
(1) попробуй:
|Условие (Количество - Резерв <> 0);



прокатит ли? скорее всего выдаст ошибку, подобное не проверял.
6. GSoft 2235 06.12.16 19:52 Сейчас в теме
(2) так не прокатит из-за синтаксиса

Условие (Количество  <<?>> Резерв <> 0);
Запрос[13] : Ожидается ')' перед 'Резерв'


(4) когда в семерке есть и работает)) но не всегда понятно))

(3)
|Функция Остаток = Сумма(Запрос.фКоличество - Запрос.фРезерв) КОГДА (Запрос.фКоличество <> Запрос.фРезерв);


так тоже не вариант не все будет счиать, даже ради интереса попробовал))
поучилось что по позициям где есть бронь "задваивает" остатки (на остатках - 3 шт, в брони - 1 шт, на выходе дает 5)))

даже не могу понять почему так

вариант
|Функция Остаток = Сумма(Запрос.фКоличество - Запрос.фРезерв) КОГДА ((Запрос.фКоличество - Запрос.фРезерв) > 0);


даже тот же "эффект"



вдогонку - до этого попробовал такой вариант

|Функция Остаток		= Сумма(Запрос.фКоличество - Запрос.фРезерв) КОГДА ((Количество - Резерв) > 0);
//|Условие ((Количество > 0) или (Резерв > 0));


в остатке не учитывается резерв

Частично можно решить путем
|Функция Ошибка				= Сумма(ПроверкаШтрихкода(Штрихкод)) КОГДА ((Количество - Резерв) > 0); 


при этом по "нулевым" позиция (остаток-бронь = 0) проверка правильности штрихкода считаться не будет
однако это никак не решает проблему с наличия "нулевых" строк в результирующей таблице
3. alxarz 31 06.12.16 17:43 Сейчас в теме
а так?
|Функция Остаток        = Сумма(Запрос.фКоличество - Запрос.фРезерв) КОГДА (Запрос.фКоличество <> Запрос.фРезерв);
4. S.V.Y 17 06.12.16 18:02 Сейчас в теме
5. alxarz 31 06.12.16 18:05 Сейчас в теме
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)