Запрос. Как получить сумму по группе справочника

1. Hunta 06.01.09 11:55 Сейчас в теме
Здравствуйте уважаемые знатоки!
Помогите пожалуйста с написанием запроса.
Хочу получить позиции товара из отчета ККМ, его остатки по регистру ОстаткиТМЦ,
потом получаем закупочную цену из справочника цен.
Потом рассчитываем цену (кол-во умножаем на цену), но вот как получить сумму по группе, не могу добиться. Т.е. чтобы в отчет выводилась группа и сумма.
Пните пожалуйста в нужном направлении =)
Текст запроса:
Перем Запрос, ТекстЗапроса, Таб, ПечЦенаНач, ПечЦенаКон, ТовЦена;

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



По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
40. venger 2121 11.01.09 16:00 Сейчас в теме
Я вот пробую:

Регистр ОстаткиТоваров: измерения(Фирма, Товар, Склад), ресурсы(ОстатокТовара).

Вот пишу:

//*******************************************
Процедура Сформировать()
Перем Запрос, ТекстЗапроса, Таб;
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"
|Период с ВыбНачПериода по ВыбКонПериода;
|Фирма = Регистр.ОстаткиТоваров.Фирма;
|Товар = Регистр.ОстаткиТоваров.Товар;
|ОстатокТовара = Регистр.ОстаткиТоваров.ОстатокТовара;
|Функция КолОстатокНач = НачОст(ОстатокТовара);
|Функция КолОстатокКон = КонОст(ОстатокТовара);
|Функция СуммаКолОстатокНач = Сумма(Запрос.НачОст*глВернутьЦену(Товар,Константа.РозничнаяКатегорияЦен));
|Функция СуммаКолОстатокКон = Сумма(Запрос.КонОст*глВернутьЦену(Товар,Константа.РозничнаяКатегорияЦен));
|Группировка Товар;
|Условие (Товар в ВыбТовар);
|"
;

Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Сообщить("Не выполнен запрос.","!");
Возврат;
КонецЕсли;

Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Сформировать");
Таб.ВывестиСекцию("Заголовок");
Состояние("Заполнение выходной таблицы...");
Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
Пока Запрос.Группировка(1) = 1 Цикл
Таб.ВывестиСекцию("Товар");
КонецЦикла;
Таб.ВывестиСекцию("Итого");
Таб.ТолькоПросмотр(1);
Таб.Показать("Остатки", "");
КонецПроцедуры
//*******************************************

Результат:

Куча подобных окошок во время выполнения запроса:


Ну и сумму не считает.
42. Ёпрст 1063 11.01.09 16:26 Сейчас в теме
(40) Не вкурил, откуда вы группу берете? В измерение группу справочника пихаете при проведении документа что ли ? :)

(41) ну да, просто опечатка была...
:)

2. Altair777 644 06.01.09 15:35 Сейчас в теме
По порядочку... :-)
Это лишнее
Если ВыбТовар.Выбран() = 1 Тогда 
       // 
      Если ВыбТовар.ЭтоГруппа() = 1 Тогда 
          ТекстЗапроса = ТекстЗапроса+ " 
         |Условие (Товар в ВыбТовар);"; 
      Иначе 
         ТекстЗапроса = ТекстЗапроса+ " 
         |Условие (Товар = ВыбТовар);"; 
      КонецЕсли; 
      // 
КонецЕсли; 
Показать

оставь только
|Условие (Товар в ВыбТовар);
и то, прямо в тексте запроса
3. Altair777 644 06.01.09 15:37 Сейчас в теме
не понял этого
ПечЦенаНач = ТовЦена * ПечКолНач; 
ПечЦенаКон = ТовЦена * ПечКолКон;

Обычно так сумму получают :-)
4. Altair777 644 06.01.09 16:09 Сейчас в теме
Цикл замени на
ФлагНачало=1;
Пока Запрос.Группировка("Товар") = 1 Цикл
	Если Запрос.Товар.ЭтоГруппа()=1 Тогда
 		Если ФлагНачало=1 Тогда
			Таб.ВывестиСекцию("Группа"); 
			ФлагНачало=0;
		Иначе
			Таб.ВывестиСекцию("ГруппаИтог"); 
			Таб.ВывестиСекцию("Группа"); 
	 		СуммаНач = 0;
	 		СуммаКон = 0;
 		КонецЕсли;
 	Иначе
 		глВернутьЦену(Запрос.Товар, Константа.ЗакупочныйТипЦен, РабочаяДата(), ТовЦена);
 		Таб.ВывестиСекцию("Номенклатура");
 		СуммаНач = СуммаНач + ТовЦена*Запрос.КолОстатокНач;
 		СуммаКон = СуммаКон + ТовЦена*Запрос.КолОстатокКон;
	КонецЕсли;
КонецЦикла;
Таб.ВывестиСекцию("ГруппаИтог"); 
Показать


Примерно так, свои детали сам вставь. И совет: не давай переменным дурацкие имена :-)
19. Hunta 10.01.09 19:54 Сейчас в теме
(4)
Альтаир пишет:

ФлагНачало=1;

Пока Запрос.Группировка("Товар") = 1 Цикл

   Если Запрос.Товар.ЭтоГруппа()=1 Тогда

      Если ФлагНачало=1 Тогда

         Таб.ВывестиСекцию("Группа");

         ФлагНачало=0;

      Иначе ....
Показать


Можешь про ФлагНачало поподробней? Если можно на пальцах... =)
Мы ему до выборки присваиваем 1, потом в цикле присваиваем 0, мы же потом в рамках этой выборки и работаем, т.е. первый раз присвоив ФлагНачала = 0, он в течении всей выборки запроса и останется равным 0.
Пожалуйста, помогите...
Что интересно когда удаляешь все эти расчеты сумм, все отлично работает, т.е. показывает количество по позициям, и общее кол-во по группе.
5. Altair777 644 06.01.09 17:07 Сейчас в теме
кстати, Денис, а что ты 2,5 года на ИС делал? :-)
6. venger 2121 06.01.09 18:35 Сейчас в теме
(5) Почему 2,5? Но все-равно, соц. опрос просто...

Как попал сюда?
Род занятий?
Чем привлекает?

;-)
7. Hunta 06.01.09 20:20 Сейчас в теме
ПечЦенаНач = ТовЦена * ПечКолНач;
ПечЦенаКон = ТовЦена * ПечКолКон;

мы же из регистра получаем количество, а потом из справочника закупочную цену,
а таким образом расчитываем сумму =)

=) разводите нибось на соц опрос? =)))
Просто как то зашёл 2,5 года назад, скачал пару обработок, так и остался.
Я понимаю, что за 2,5 года можно эгегей сколько научиться, но вот не складывалось =(
до сих пор бывает, что упрешься и всё, вот тока на форуме и могу спросить, так что прошу не пинайте ;)
И совсем не дурацкие у меня имена переменных!
вот интересно, а код в тегах code теперь не подсвечивается? Жаль, мелочь, а приятно.
8. Altair777 644 06.01.09 20:24 Сейчас в теме
(7) Умножаем Цена на Количество и получаем ... Цену?
основы рефакторинга известны? :-)
про code.... видишь кнопочку над новым сообщением с надписью CODE?
Выдели часть текста и нажми ее.
9. venger 2121 07.01.09 13:10 Сейчас в теме
(8) Думаю, получаем сумму, может по ценам закупочным, разве что...
10. Altair777 644 07.01.09 13:36 Сейчас в теме
(9) Вот и я так думаю. Интересно, а что думает Денис? :-)
11. Hunta 07.01.09 15:26 Сейчас в теме
Хорошо-хорошо, сумму в закупочных ценах =) переименую переменные...
Завтра попробую переписать,с учетом Ваших подсказок, обязательно отпишу! Большое спасибо за помощь!!!! =))))
Всех с Рождеством!!!!!
12. Altair777 644 07.01.09 20:45 Сейчас в теме
Спасибо и тебя так же. Нема за що :-)
13. Hunta 08.01.09 11:45 Сейчас в теме
Что то не выходит каменный цветок =(
В секции Группа показывает какие то не понятный цифры, которы не сходятся с реальными,
а секция ГруппаИтог равна секции Группа.

Переписал Цикл:

ФлагНачало = 1;
	//
	Пока Запрос.Группировка("Товар") = 1 Цикл
		
		ПечНаименование = Запрос.Товар;
		ПечКолНач       = Запрос.КолОстатокНач;
		ПечКолКон       = Запрос.КолОстатокКон;
		
		//
		Если Запрос.Товар.ЭтоГруппа() = 1 Тогда
			//
			Если ФлагНачало = 1 Тогда
				Таб.ВывестиСекцию("Группа");
				ФлагНачало=0;
			Иначе
				Таб.ВывестиСекцию("ГруппаИтог");
				Таб.ВывестиСекцию("Группа");
				СуммаНач = 0;
				СуммаКон = 0;
			КонецЕсли;
			//
		Иначе
			глВернутьЦену(Запрос.Товар, Константа.ЗакупочныйТипЦен, РабочаяДата(), ТовЦена);
			ПечСумТМЦНач = ТовЦена * Запрос.КолОстатокНач;
			ПечСумТМЦКон = ТовЦена * Запрос.КолОстатокКон;
			Таб.ВывестиСекцию("Номенклатура");
			СуммаНач = СуммаНач + ПечСумТМЦНач;
			СуммаКон = СуммаКон + ПечСумТМЦКон;
		КонецЕсли;
		//
	КонецЦикла;
	//
	Таб.ВывестиСекцию("ГруппаИтог"); 
Показать


По позициям ТМЦ показывает правильно остатки и сумму в закупочных ценах, а вот по группам ... =(
Объясните пожалуйста, вот запрос выбрал нам ТМЦ, начинаем перебирать их в цикле, цикл их перебирает по группам??? Т.е. встречает первую группу, входит в неё и перебирает все товары принадлежащие только данной группе? А потом собирает итог по данной группе. Я правильно понимаю?
14. Altair777 644 08.01.09 12:12 Сейчас в теме
Встречает первую группу, выводит секцию "Группа", в которой только Название потом идет перебор элементов с накоплением Сумм.
Когда натыкаемся на следующую группу, выводим итог по предыдушей и название текущей.
И после цикла итог по последней группе. Я так вижу :-)
15. venger 2121 08.01.09 13:49 Сейчас в теме
А, кстати, не забыть про разные валюты и курсы при пересчете сумм групп...
И, если группа (Б) вложена в другую (А), то сумма по более верхней (А) будет включать ее (А) товары и сумму ее подгрупп (Б)?
16. Altair777 644 08.01.09 14:28 Сейчас в теме
(15) и вообще логично и цены расчитывать для остатков не на РабочуюДату(), а на начало и конец запроса :-)
17. Hunta 08.01.09 14:35 Сейчас в теме
вот хотелось бы сделать:

Группа А сумма по А и Б
Группа Б сумма
Группа Б сумма
Как такое реализовать?

Альтаир пишет:

и вообще логично и цены расчитывать для остатков не на РабочуюДату(), а на начало и конец запроса :-)

Ну по идее закупочные цены ведь не меняются
18. Altair777 644 08.01.09 14:39 Сейчас в теме
(17)
Hunta пишет:
Ну по идее закупочные цены ведь не меняются

Меняются :-) особенно во времена кризисов.
И неспроста же это периодический реквизит
20. Altair777 644 10.01.09 20:10 Сейчас в теме
ФлагНачало нужен толко для вывода наименования первой группы
21. Hunta 10.01.09 20:16 Сейчас в теме
А если существуют вложенные группы?

ГруппаА
  ГруппаВ
  ГруппаС
Как в таком случае накопить сумму по ГруппеВ - вывести её, по ГруппеС - вывести её.
22. Altair777 644 10.01.09 20:20 Сейчас в теме
(21) с этим сложнее. Я подумаю :-)
Как вариант накапливать в ТаблицеЗначений
23. Hunta 10.01.09 20:24 Сейчас в теме
=) О! я что то про таблицы и забыл =(
Я уже мозг сломал, но буду доламывать...
Заранее спасибо! Могу асю кинуть...
24. Altair777 644 10.01.09 20:26 Сейчас в теме
Hunta пишет:
Могу асю кинуть...

Лучше ВМЗ :-) (это шутка)
25. Hunta 10.01.09 20:41 Сейчас в теме
=) ну я же не просто копипастом разбирал отчет, хочу сам (ну почти ;) ) решить.
26. Ёпрст 1063 11.01.09 09:51 Сейчас в теме
(0) Делай всё в самом тексте запроса. Он сам всё и подсчитает, и сумму по группе в том числе.
27. venger 2121 11.01.09 14:04 Сейчас в теме
(26) Это как? Можно подробней? Можно пример в общих чертах?
29. Ёпрст 1063 11.01.09 14:20 Сейчас в теме
(27) функция Сумма в тексте запроса и привет .... для возвращения цены можешь ту же глПолучить(глВернуть)Цену использовать....
Итого - будешь иметь всю иеррархию на выходе с нужными циферками.
Не быстро, но работать будет.
32. venger 2121 11.01.09 14:33 Сейчас в теме
(29) Это про 1С-совский язык запросов идет речь?
34. Ёпрст 1063 11.01.09 14:41 Сейчас в теме
(32) естесственно

(33) причем тут группы ????
группы и суммы по ним запрос сам собирёт...

Ну так напиши, что ли:

28. Altair777 644 11.01.09 14:06 Сейчас в теме
(26) мне тоже интересно... Расчет периодической цены на дату прямо в запросе?
30. Altair777 644 11.01.09 14:23 Сейчас в теме
Типы встроенных функций:
Сумма (Sum) - сумма значений параметра;

Какой параметр нужно суммировать?
31. Ёпрст 1063 11.01.09 14:33 Сейчас в теме
(30) Известно какой - останки по количеству и цену... Всё тоже самое, что он при обходе получает.
33. Altair777 644 11.01.09 14:39 Сейчас в теме
Ёпрст пишет:
(30) Известно какой - останки по количеству и цену...

т.е. мы получаем сумму всех остатков по группе и умножаем на цену?
На какую именно из цен?
35. Ёпрст 1063 11.01.09 14:45 Сейчас в теме
   |Период с ВыбНачПериода по ВыбКонПериода;
   |Обрабатывать НеПомеченныеНаУдаление;
   |Товар                    = Регистр.ОстаткиТМЦ.Номенклатура;
   |ОстатокКол            = Регистр.ОстаткиТМЦ.Количество;
   |Функция КолОстатокНач = НачОст (ОстатокКол);
   |Функция КолОстатокКон = КонОст (ОстатокКол);

   |Функция СуммаНач = Сумма(Запрос.НачОст*глПолучитьЦену(Товар,Константа.ЗакупочныйТипЦен,ВыбКонПериода));
//аналогично еще сумма для КонОст
   |Группировка Товар ;
   |"//}}ЗАПРОС 
Показать
37. Altair777 644 11.01.09 14:47 Сейчас в теме
(35) хм... на вид вроде правильно :-)
38. Hunta 11.01.09 15:33 Сейчас в теме
(35) Ого! надо попробовать =)
39. venger 2121 11.01.09 15:43 Сейчас в теме
(35) Товар может быть группой, а цену для группы не возьмет...

З.Ы. Имеется ввиду переменная "Товар" в запросе и ее же использование в параметре функции "глПолучитьЦену" в том же запросе.
36. Ёпрст 1063 11.01.09 14:46 Сейчас в теме
И поимеешь останки + всю иерархию + суммы в пересчете на нужный тип цен
41. Hunta 11.01.09 16:05 Сейчас в теме
Блин, работает!!!!! =)))))
|Функция СуммаНач = Сумма(Запрос.НачОст*глПолучитьЦену(Товар,Константа.ЗакупочныйТипЦен,ВыбКонПериода));  


Поменять на

|Функция СуммаНач = Сумма(Запрос.КолОстатокНач *глВернутьЦену(Товар,Константа.РозничнаяКатегорияЦен)); 


Так же сделать и остатками на конец
СПАСИБО!!!!! Ёпрст!!! =))))
И всем принимающим участие, я ваш должник....
43. venger 2121 11.01.09 16:29 Сейчас в теме
Все вопрос снимается. Епрст прав. Только "Запрос.НачОст" сбил с тольку.
И че то я не думал, что он (1С) функции в запросах выполняет, во как запущено все, млин:-)
44. Ёпрст 1063 11.01.09 16:32 Сейчас в теме
(43) Не ... там просто обращение к итогам запроса в самом тексте запроса...А про "Запрос.НачОст попутал, ибо сам пишу так, обычно
|Функция НачОст = НачОст(чтото);


звиняйте.. :)
45. Altair777 644 11.01.09 19:56 Сейчас в теме
вот так! Век живи - век учись!
И переложил серебрянную зажигалку из кармана брюк в пиджак... :-)
46. Hunta 15.01.09 15:23 Сейчас в теме
Не пойму почему округляет
|Функция СуммаНач = Сумма (Число(Запрос.КолОстатокНач * глПолучитьЦену (Запрос. Товар, Константа.ЗакупочныйТипЦен, ВыбНачПериода)));


К примеру из отчета получаем
остаток 0,56кг.
цена 84.00р.
а вот эта Функция показывает сумму 47.00р., вместо положенных 47,04р.
Округляет копейки!
Если убрать явное преобразование в число ... = Сумма (Число (....
То вообще получаем сумму 84,00р.,при остатке 0,56, цене 84,00р.
А вот такая конструкция вываливается с ошибкой
... = Сумма (Число (Формат (Запрос.....), "Ч5.2")));
47. Ёпрст 1063 15.01.09 17:18 Сейчас в теме
(46) Это очевидно...
Функция Сумма берет точность из переменной запроса.. в данном случае, переменной нет, ибо используется арифм. выражение... Следовательно запрос не знает, какая точность должна быть, вот 0 и
лепит.

Решение проблемы - в Запросе умножать на 1000, в обработке итогов - делить на 1000...
Ну или на бооольшее/меньшее число, смотря какая точность нужна.
51. Altair777 644 15.01.09 17:27 Сейчас в теме
(47)
Ёпрст пишет:
Функция Сумма берет точность из переменной запроса

А если внутрь Сумма() вставить Окр(), поможет?
52. Ёпрст 1063 15.01.09 17:32 Сейчас в теме
(51) Конечно нет :)
Точность и так 0 всегда будет...Смысл еще округлять ?
54. Altair777 644 15.01.09 17:38 Сейчас в теме
(52) Всегда? Это такая фича?
Я имел в виду Окр(ЧегоТоТам,2,1)
57. Ёпрст 1063 15.01.09 17:51 Сейчас в теме
(54) конечно!...Это не фича, это нормальное и предсказуемое поведение...
(55) а сразу на 1000 не айда помножить ? :)) Чем 2 раза по 100 ...
56. Hunta 15.01.09 17:47 Сейчас в теме
Альтаир пишет:

(52) Всегда? Это такая фича?

Я имел в виду Окр(ЧегоТоТам,2,1)

Окр не работате =(
48. Ёпрст 1063 15.01.09 17:20 Сейчас в теме
А вот такая конструкция вываливается с ошибкой
... = Сумма (Число (Формат (Запрос.....), "Ч5.2")));

Еще бы ! Ты предлагаешь запросу СТРОКИ суммировать!
Естесственно , что он посылает тебя в пешее путешествие с эротическим уклоном.
:)
49. Altair777 644 15.01.09 17:25 Сейчас в теме
Hunta пишет:
То вообще получаем сумму 84,00р.,при остатке 0,56, цене 84,00р.

похоже, 0,56 округляется до 1
50. Hunta 15.01.09 17:25 Сейчас в теме
т.е. примерно так:
|Функция СуммаНач = Сумма (Запрос.КолОстатокНач * глПолучитьЦену (Запрос. Товар, Константа.ЗакупочныйТипЦен, ВыбНачПериода)*100);
...
ПечСумНач       = Запрос.СуммаНач/100;


т.е. если нам достаточно точность 0,00, то умножаем/делим на 100?

Альтаир пишет:
похоже, 0,56 округляется до 1

Ну да =)
53. Ёпрст 1063 15.01.09 17:34 Сейчас в теме
55. Hunta 15.01.09 17:46 Сейчас в теме
О! Вот это работает, не перестаю благодарить, спасибо! =)
|Функция СуммаНач      = Сумма (Число((Запрос.КолОстатокНач*100) * (глПолучитьЦену (Запрос.Товар,Константа.ЗакупочныйТипЦен,ВыбНачПериода)*100)));
...
ПечСумНач       = Запрос.СуммаНач/10000; 
59. Hunta 15.01.09 17:53 Сейчас в теме
Ёпрст пишет:

(55) а сразу на 1000 не айда помножить ? :)) Чем 2 раза по 100 ...

Да просто в первом случае, не беря в скобки выражение перед умножениеим на 100, оно не получалось =)
60. Ёпрст 1063 15.01.09 17:55 Сейчас в теме
(59) еще функцию Число оттуда выкинь.. лишнее.
58. Hunta 15.01.09 17:51 Сейчас в теме
Не вот это =)
|Функция СуммаНач      = Сумма (Число((Запрос.КолОстатокНач * (глПолучитьЦену (Запрос.Товар,Константа.ЗакупочныйТипЦен,ВыбНачПериода)))*100));
...
ПечСумНач       = Запрос.СуммаНач/100;
61. Hunta 15.01.09 18:00 Сейчас в теме
Неее без "Число" округляет копейки =(
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот