Как просуммировать данные в столбце?

1. Zabey 01.12.09 18:46 Сейчас в теме
Можете подсказать как можно просуммировать числа в столбце и вывести результат в ячейку под ним?
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
10. Zabey 04.12.09 09:38 Сейчас в теме
Процедура Сформировать()
	Перем НомСтр; 
	Перем Сумма;
	Дата1=Дата(2001,01,01);
	Граница1 =ПолучитьДокументТА();	
	Рег=СоздатьОбъект("Регистр.ОстаткиТоваров");
	Рег.ВременныйРасчет();
	РассчитатьРегистрыПо (Граница1);
	
	СпрНом= СоздатьОбъект ("Справочник.Номенклатура");	
//	ТабРасх= СоздатьОбъект ("ТаблицаЗначений");
	ТабРасх.НоваяКолонка("Товар",,,,"Товар",15);
	ТабРасх.НоваяКолонка("КолВо",,,,"КолВо",15);
	ТабРасх.НоваяКолонка("Цена",,,,"Цена",15);
	ТабРасх.НоваяКолонка("Документ",,,,"Документ",15);
	ТабРасх.НоваяКолонка("ЦенаБезСк",,,,"ЦенаБезСк",15);
	
СпЗнач= СоздатьОбъект ("СписокЗначений");
	
	//Продажи в учетный период
	Запрос = СоздатьОбъект("Запрос");
	ТекстЗапроса = 
	"//{{ЗАПРОС(Сформировать)
	|Период с Дата3 по Дата4;
	|Товар = Документ.РасходнаяНакладная.Товар, Документ.ЗаказНаряд.Товар, Документ.ЗаказНаРемонт.Товар;
	|КолВо = Документ.РасходнаяНакладная.Количество, Документ.ЗаказНаряд.Количество, Документ.ЗаказНаРемонт.Количество; 
	|ЦенаПоз = Документ.РасходнаяНакладная.Цена, Документ.ЗаказНаряд.Цена, Документ.ЗаказНаРемонт.Цена;
	|ЦенаБезСкидки = Документ.ЗаказНаряд.ИсходнаяЦена, Документ.РасходнаяНакладная.ЦенаБезСкидки;
	|Дата = Документ.РасходнаяНакладная.ДатаДок, Документ.ЗаказНаряд.ДатаДок, Документ.ЗаказНаРемонт.ДатаДок;
	|Менеджер=Документ.РасходнаяНакладная.Продавец, Документ.ЗаказНаряд.Продавец; 
	|ТекущийДокумент = Документ.РасходнаяНакладная.ТекущийДокумент, Документ.ЗаказНаряд.ТекущийДокумент, Документ.ЗаказНаРемонт.ТекущийДокумент;
	|Группировка Товар Упорядочить по Товар.Код, Товар.Наименование;
	|Группировка Дата;
	|Группировка ТекущийДокумент;
	|Группировка СтрокаДокумента;
	|Группировка Менеджер;
	|Группировка КолВо;
	|Группировка ЦенаПоз;
	|Группировка ЦенаБезСкидки;
	|Условие (Менеджер в ВыбМенеджер);
	|"//}}ЗАПРОС
	; 	                                                            
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
	Возврат;                                            
КонецЕсли;
	
Пока Запрос.Группировка(1)=1 Цикл	
	Код=Запрос.ЗначениеУпорядочивания(1,1);
	Количество=0;
	Наименование=Запрос.ЗначениеУпорядочивания(1,2);
	Пока Запрос.Группировка(2)=1 Цикл			
		Пока Запрос.Группировка(3)=1 Цикл
			Документ=Запрос.ТекущийДокумент;
			Пока Запрос.Группировка(4)=1 Цикл
				Пока Запрос.Группировка(5)=1 Цикл 
					Пока Запрос.Группировка(6)=1 Цикл
						Пока Запрос.Группировка(7)=1 Цикл
							Кол=Запрос.КолВо;
							//Количество=Количество+Кол;
							ЦенаПозиции=Запрос.ЦенаПоз;
								Если Документ.Вид()="ЗаказНаряд" Тогда
										Пока Запрос.Группировка(8)=1 Цикл	
							   				ЦенаБезСкидки=Запрос.ЦенаБезСкидки;
										КонецЦикла;
							   	ИначеЕсли Документ.Вид()="РасходнаяНакладная" Тогда 
										Пока Запрос.Группировка(8)=1 Цикл
							 				ЦенаБезСкидки=Запрос.ЦенаБезСкидки;
										КонецЦикла;
							 		Иначе ЦенаБезСкидки=0; 	
								КонецЕсли;
							
						КонецЦикла;
					КонецЦикла;
				КонецЦикла;
			КонецЦикла;
			Если СокрЛП(Наименование)="Работа" Тогда
			Иначе
			ТабРасх.НоваяСтрока();
			ТабРасх.Товар=СокрЛП(Строка(Код));
			ТабРасх.КолВо=Кол;
			ТабРасх.Цена=ЦенаПозиции;
			ТабРасх.Документ=Документ;
			ТабРасх.ЦенаБезСк=ЦенаБезСкидки;
			Тов=Запрос.Товар;
			СпЗнач.ДобавитьЗначение(Тов);
			КонецЕсли;
			//Сообщить (Наименование);
		КонецЦикла;
	КонецЦикла;	
КонецЦикла;	
ТабРасх.Свернуть("1,3,4,5","2");

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

Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Таблица");
Таб.ВывестиСекцию("Заголовок");
	
Пока Запрос.Группировка(1)=1 Цикл 
	//НомСтр=0;
	Товар=Запрос.Товар;
	Код=Запрос.ЗначениеУпорядочивания(1,1); 
	СпрНом.НайтиПоКоду(Код);
	Примечание=СпрНом.Примечание;
	Наименование=Запрос.ЗначениеУпорядочивания(1,2);
	ЕТК=Товар.КаталНомер;
	Производитель= Товар.Производитель;
	РекЦена=Товар.РекомендованнаяЦена;
	РознЦена=Товар.РозничнаяЦена;
	КолПродаж=0;
	МаксЦена=0;  
	Цена=0;
	Ост=СпрНом.ТекущийЭлемент();
	ТекОстаток= Рег.СводныйОстаток(Ост,,,"Количество");
	
	ТабРасх.НайтиЗначение(СокрЛП(Строка(Код)),НомСтр,1);
	//Сообщить ("Номер строки "+НомСтр);
	Если НомСтр>0 Тогда
		КолПродаж=ТабРасх.ПолучитьЗначение(НомСтр,2);
	КонецЕсли;
	НомСтр="";
	
					
	Цена3=0;						
	Цена2=0;						
	Цена1=0;
	
	Пока Запрос.Группировка(2)=1 Цикл
		Пока Запрос.Группировка(3)=1 Цикл
			Пока Запрос.Группировка(4)=1 Цикл
				Пока Запрос.Группировка(5)=1 Цикл
					Пока Запрос.Группировка(6)=1 Цикл
						ТипДокумента=Запрос.ТекущийДокумент;
						Цена=0;
						Если ТипДокумента.Вид()="ПриходнаяНакладная" Тогда
							Цена=Запрос.Цена;
							Если ПустоеЗначение(Цена)=0 Тогда
								Себестоимость=0;
							КонецЕсли;
						ИначеЕсли ТипДокумента.Вид()="ВводОстатковТоваров" Тогда
							Количество=Запрос.КолВо;
							Если ПустоеЗначение(Количество)=0 Тогда
								Цена=(Запрос.Цена)/Количество;
							Иначе Цена=Запрос.Цена;
							КонецЕсли;
							//Сообщить ("ВводОстатковТоваров");
						ИначеЕсли ТипДокумента.Вид()="ЗаказНаРемонт" Тогда	
							Сумма=Запрос.Цена;
							Цена=Цена+Сумма;						
						КонецЕсли; 
						Если Цена>0 Тогда
							Цена3=Цена2;
							Цена2=Цена1;
							Цена1=Цена;
						КонецЕсли;
					//	Цена=Запрос.Цена;
						//Сообщить (Цена);
						Если МаксЦена<Цена Тогда
							МаксЦена=Цена;
						КонецЕсли;
					КонецЦикла;					
				КонецЦикла;
			КонецЦикла;
		КонецЦикла;
	КонецЦикла;
	
	Кол=3;
	Если Цена3=0 Тогда
		Кол=Кол-1;
	КонецЕсли;
	Если Цена2=0 Тогда
		Кол=Кол-1;
	КонецЕсли;
	Если Цена1=0 Тогда
		Кол=Кол-1;
	КонецЕсли;
	Если Кол>0 Тогда
		СреднЦена=(Цена1+Цена2+Цена3)/Кол;
	Иначе СреднЦена=0;
	КонецЕсли;

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

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



	//Реквизит1 = ТабличнаяЧасть.ИТОГ("НаименованиеСтолбца"); 

//ТЗ=СоздатьОбъект("ТаблицаЗначений");
//Номерстр=0;
//ТЗ.ВыбратьСтроки();
//Пока КолВо=ТЗ.Итог() Цикл
//	Номерстр=Номерстр+1;
//КонецЦикла;	

	Таб.ВывестиСекцию("Подвал");

КонецЦикла;
Таб.Показать();
КонецПроцедуры
Показать



Вот собственно код, выводить дополнительную строку для итога получилось, а вписывать сумму по столбцу уже не получается... пишет либо неверный идентивифкатор или Номер за пределами ....
12. Ёпрст 1064 04.12.09 17:36 Сейчас в теме
(10) Да ужж..
|Группировка СтрокаДокумента;
|Группировка КолВо;
|Группировка Цена;


Это вообще конечно сильно...
14. Altair777 645 04.12.09 17:40 Сейчас в теме
(12) Зато дешево :D
За счет других...
2. Tatitutu 3845 01.12.09 18:51 Сейчас в теме
1. Вручную с помощью калькулятора или счет , сверится с бумажкой и записать итог.
2. Скопировать чиселки в EXCEL и там сложить,результат записать - проверить с п.1
3. Написать ПОНЯТНО и ДОСТУПНО всем - в каком столбце нужно проссумировать числа и в КАКОЙ ячейке это нужно вывести.

ОТВЕТ : ПРОГРАММНО (но почему то я думаю, что легче Вам не стало от моего ответа)
3. Zabey 01.12.09 19:00 Сейчас в теме
Столбцы : КолВо, Сумма, Цена, ЦенаБезСкидки, СуммаБезСкидки, Себестоимость, Прибыль...
под каждым столбцом нужно вывести свою сумму.

Таб.ВывестиСекцию("Подвал");
В этой строке должны выводится суммы
4. Tatitutu 3845 01.12.09 22:05 Сейчас в теме
ну так и напиши в секции подвал
типа Итог("Колво")
у реквизита док-та "Колво" должна стоять галка "Итог по колонке"
только вот зачем тебе итог Цена ?
5. Zabey 02.12.09 11:25 Сейчас в теме
Необходимо для отчетности.
Вообще количество обрабатываемой информации очень большое, а перенос данных в эксель для получения результата порой занимает много времени, вот и пришли к тому чтоб выводить итог программно, быстро и удобно)

Собственно в обработке нужно прописать суммирование по каждому столбцу, что пока у меня не получается...
6. GSoft 2237 02.12.09 21:01 Сейчас в теме
(0) для начала опишите что, где и как, а то я так и не понял где надо суммировать {в табл. части документа, в печатной форме аль еще где}
7. vasilykushnir 63 03.12.09 10:59 Сейчас в теме
Я так думаю, что в отчете у тебя есть цикл вывода строк отчета - вот там и накапливай суммы по нужным столбцам. Если в отчет выводятся данные из ТЗ - сразу коммандой суммы по колонке ТЗ.
А вообще-то доступ к ЖКК еще никому не забанили...
8. Zabey 03.12.09 18:55 Сейчас в теме
Я пишу внешнюю обработку, не документ,
вывел строку "подвал", все хорошо, дальше нужно под каждый столбцом вывести его сумму, у меня вываливаются ошибки либо о "Номер за пределами значения!", либо неверный идентификатор колонки...

Мне необходим сам алгоритм написания каким образом произвести это суммирование
9. GSoft 2237 04.12.09 01:08 Сейчас в теме
надо смотреть какой там алгоритм - если это просто ТЗ без итогов то можно воспользоваться методом Итог("idКолонки"), это если автоматически, а если чтото более сложное то надо простым обычным накоплением, с различными условиями суммирования в зависимости уровней вложенности и пр.

а еще лучше попробовать все таки собрать все запросом и использовать его функционал для суммирования (помощь при построении запросов)

выложите код, а лучше опишите структуру выборки
11. Zabey 04.12.09 17:19 Сейчас в теме
13. Ёпрст 1064 04.12.09 17:38 Сейчас в теме
Ну и весь код.. смело в топку..
ИМХО.
15. Zabey 11.01.10 17:06 Сейчас в теме
Оставьте свое сообщение

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