gifts2017

ТаблицаЗначений.ТаблицаЗначений - удобство обработки данных.

Опубликовал Роман Катунин (Rom_Kat) в раздел Программирование - Практика программирования

Вложенные ТаблицыЗначений очень удобны для группирования данных при всяческих расчетах. Например расчет вложенных нормативов затрат сырья.
Технология проста и тривиальна. Приведу пример кода, из которого все будет понятно.
ТЗВозврат= СоздатьОбъект("ТаблицаЗначений"); 
ТЗВозврат.НоваяКолонка("Документ");
ТЗВозврат.НоваяКолонка("Подраздел","Справочник.Подразделения"); 
ТЗВозврат.НоваяКолонка("ПервПарам","Число",1,0); 
ТЗВозврат.НоваяКолонка("СуммаПервПарам","Число",15,2); 
ТЗВозврат.НоваяКолонка("МинСуммаПервПарам","Число",15,2);
ТЗВозврат.НоваяКолонка("КолЮрЛицПодраздел","Число",1,0); 
ТЗВозврат.НоваяКолонка("СуммаКолЮрЛиц","Число",15,2);
ТЗВозврат.НоваяКолонка("ОстПарам","Число",1,0);
ТЗВозврат.НоваяКолонка("ПарамАЙТи","Число",1,0); 
ТЗВозврат.НоваяКолонка("ДатЛог","Дата");
ТЗВозврат.НоваяКолонка("ДатСклад","Дата"); 
ТЗВозврат.НоваяКолонка("ГруппаОфис","Справочник.ОфисныеПомещения");  
ТЗВозврат.НоваяКолонка("КоэфОбъем","Число",5,2); 
ТЗВозврат.НоваяКолонка("ТЗРаспредел","ТаблицаЗначений");
	
Док = СоздатьОбъект("Документ.РезРаспределИздержек");
Док.ВыбратьДокументы(ДатаУсловий,ДатаУсловий);
Пока Док.ПолучитьДокумент()=1 Цикл 
	ТЗВозврат.НоваяСтрока(); 
	ТЗВозврат.Документ = Док.ТекущийДокумент();
	ТЗВозврат.Подраздел = Док.Подраздел;
	ТЗВозврат.ПервПарам = Док.ПервПарам;
	ТЗВозврат.СуммаПервПарам = Док.СуммаПервПарам;
	ТЗВозврат.МинСуммаПервПарам = Док.МинСуммаПервПарам;
	ТЗВозврат.КолЮрЛицПодраздел = Док.КолЮрЛицПодраздел;
	ТЗВозврат.СуммаКолЮрЛиц = Док.СуммаКолЮрЛиц;
	ТЗВозврат.ОстПарам = Док.ОстПарам;
	ТЗВозврат.ПарамАЙТи = Док.ПарамАЙТи;
	ТЗВозврат.ДатЛог = Док.ДатЛог;
	ТЗВозврат.ДатСклад = Док.ДатСклад;
	ТЗВозврат.ГруппаОфис = Док.ГруппаОфис;
	ТЗВозврат.КоэфОбъем = Док.КоэфОбъем;
	ТЗВозврат.ТЗРаспредел = СоздатьОбъект("ТаблицаЗначений");
	ТЗВозврат.ТЗРаспредел.НоваяКолонка("Подраздел","Справочник.Подразделения",,,"Подразделение",7); 
	ТЗВозврат.ТЗРаспредел.НоваяКолонка("КолПерсонала","Строка",25,,"Колич. персонала",5);
	ТЗВозврат.ТЗРаспредел.НоваяКолонка("КолЮрЛицПодраздел","Строка",25,,"Колич. юр. лиц",5);
	ТЗВозврат.ТЗРаспредел.НоваяКолонка("КолРабМест","Строка",25,,"Колич. рабочих мест",5); 
	ТЗВозврат.ТЗРаспредел.НоваяКолонка("КолВыпДоставок","Строка",25,,"Колич. доставок",5); 
	ТЗВозврат.ТЗРаспредел.НоваяКолонка("КолВыпЗаявок","Строка",25,,"Колич. заявок",5);
	ТЗВозврат.ТЗРаспредел.НоваяКолонка("КолНормЧас","Строка",25,,"Колич. нормочас",5);
	ТЗВозврат.ТЗРаспредел.НоваяКолонка("ПроцНачисления","Число",3,0,"% начисления",5); 
	ТЗВозврат.ТЗРаспредел.НоваяКолонка("КолПродаж","Строка",25,,"Колич. продаж",5); 
	ТЗВозврат.ТЗРаспредел.НоваяКолонка("КолСкладПлощ","Строка",25,,"Колич. склад. площ.",5);
	ТЗВозврат.ТЗРаспредел.НоваяКолонка("РаспредСумма","Число",10,2,"Сумма распределенная",5);
	Док.ВыбратьСтроки();
        Пока Док.ПолучитьСтроку()=1 Цикл
	        ТЗВозврат.ТЗРаспредел.НоваяСтрока();
		ТЗВозврат.ТЗРаспредел.Подраздел = Док.ПодразделРаспред; 
		ТЗВозврат.ТЗРаспредел.КолПерсонала = Док.КолПерсонала;
		ТЗВозврат.ТЗРаспредел.КолЮрЛицПодраздел = Док.КолЮрЛицПодразд;
		ТЗВозврат.ТЗРаспредел.КолРабМест = Док.КолРабМест;      
		ТЗВозврат.ТЗРаспредел.КолВыпДоставок = Док.КолВыпДоставок; 
		ТЗВозврат.ТЗРаспредел.КолВыпЗаявок = Док.КолВыпЗаявок;
		ТЗВозврат.ТЗРаспредел.КолНормЧас = Док.КолНормЧас;
		ТЗВозврат.ТЗРаспредел.ПроцНачисления = Док.ПроцНачисления; 
		ТЗВозврат.ТЗРаспредел.КолПродаж = Док.КолПродаж; 
		ТЗВозврат.ТЗРаспредел.КолСкладПлощ = Док.КолСкладПлощ;
		ТЗВозврат.ТЗРаспредел.РаспредСумма = Док.РаспредСумма;
	КонецЦикла;
КонецЦикла;


Далее используем данные вложенной таблицы стандартно.
Процедура СохранитьУсловияРаспред(ТЗСохран) 
	Док = СоздатьОбъект("Документ.РезРаспределИздержек");
	ТЗСохран.ВыбратьСтроки();
	Пока ТЗСохран.ПолучитьСтроку()=1 Цикл
		Если ПустоеЗначение(ТЗСохран.Документ)=0 Тогда
			Док.НайтиДокумент(ТЗСохран.Документ); 
			Док.УдалитьСтроки();
		Иначе
			Док.Новый();	
		КонецЕсли;
		
		Док.ДатаДок = КонДата;  
		Док.Подраздел = ТЗСохран.Подраздел;
		Док.ПервПарам = ТЗСохран.ПервПарам;
		Док.СуммаПервПарам = ТЗСохран.СуммаПервПарам;
		Док.МинСуммаПервПарам = ТЗСохран.МинСуммаПервПарам;
		Док.КолЮрЛицПодраздел = ТЗСохран.КолЮрЛицПодраздел;
		Док.СуммаКолЮрЛиц = ТЗСохран.СуммаКолЮрЛиц;
		Док.ОстПарам = ТЗСохран.ОстПарам;
		Док.ПарамАЙТи = ТЗСохран.ПарамАЙТи;
		Док.ДатЛог = ТЗСохран.ДатЛог;
		Док.ДатСклад = ТЗСохран.ДатСклад;
		Док.ГруппаОфис = ТЗСохран.ГруппаОфис;
		Док.КоэфОбъем = ТЗСохран.КоэфОбъем; 
		
		ТЗСохран.ТЗРаспредел.ВыбратьСтроки();
		Пока ТЗСохран.ТЗРаспредел.ПолучитьСтроку()=1 Цикл
			Док.НоваяСтрока();
			Док.ПодразделРаспред = ТЗСохран.ТЗРаспредел.Подраздел;
			Док.КолПерсонала = ТЗСохран.ТЗРаспредел.КолПерсонала;
			Док.КолЮрЛицПодразд = ТЗСохран.ТЗРаспредел.КолЮрЛицПодраздел;
			Док.КолРабМест = ТЗСохран.ТЗРаспредел.КолРабМест;
			Док.КолВыпДоставок = ТЗСохран.ТЗРаспредел.КолВыпДоставок;
			Док.КолВыпЗаявок = ТЗСохран.ТЗРаспредел.КолВыпЗаявок;
			Док.КолНормЧас = ТЗСохран.ТЗРаспредел.КолНормЧас;
			Док.ПроцНачисления = ТЗСохран.ТЗРаспредел.ПроцНачисления;
			Док.КолПродаж = ТЗСохран.ТЗРаспредел.КолПродаж;
			Док.КолСкладПлощ = ТЗСохран.ТЗРаспредел.КолСкладПлощ;
			Док.РаспредСумма = ТЗСохран.ТЗРаспредел.РаспредСумма;
		КонецЦикла;
			
		Док.Записать();
	КонецЦикла;
КонецПроцедуры	// СохранитьУсловияРаспред



См. также

Подписаться Добавить вознаграждение

Комментарии

1. Михаил Семенов (Shaman100M) 24.12.07 13:33
А можно по-подробнее? Из примера кода понятно только, что в ТЗ можно сохранять и шапку, и табличную часть документа.
2. Роман Катунин (Rom_Kat) 24.12.07 13:41
дело вовсе не в документе.
Можно создать объект типа ТЗВозврат.ТЗРаспредел = СоздатьОбъект("ТаблицаЗначений");
и потом его читать ТЗВозврат.ТЗРаспредел.ВыбратьСтроки()

Ща статью обновлю ))
А то действительно не сильно понятно нафиг оно надо )))
3. Роман Катунин (Rom_Kat) 24.12.07 13:44
Вот и вся статья. Не судите строго )))
4. Михаил Семенов (Shaman100M) 24.12.07 14:15
(2) Да, есть такое.
http://infostart.ru/profile/8196/projects/1354/
В ТЗ и СЗ можно создавать и использовать много других объектов, не только "ТаблицаЗначений", например, хранить и обращаться ко всем групповым контекстам открытых форм.
5. Роман Катунин (Rom_Kat) 24.12.07 14:34
(4) отлично. Можешь мне минус поставить. ;-)
6. Роман Катунин (Rom_Kat) 24.12.07 14:43
(5+) Клевая демонстрашка. А у меня только на прикладные вещи времени и хватает (((( Их к сожалению не выложишь так как слишком к предметной области привязаны.
7. Михаил Семенов (Shaman100M) 24.12.07 14:59
(5) Ну, я не настолько подвержен влиянию чужой самокритики. :)
(6) Спасибо. От прикладных особенностей реализации идею можно отвязать и обобщить, но, как замечено, для этого нужно время. Если времени не хватает, значит, оно тратится на что-то другое (на работу, например), что тоже неплохо.
8. Сhe Burashka (CheBurator) 24.12.07 17:18
А к этому еще почитать статью отчетов с вертикальными/горизонтальными группировками на основе ТЗ...
9. Роман Катунин (Rom_Kat) 24.12.07 17:28
10. Евгений Мартыненков (JohnyDeath) 24.12.07 17:43
Ну раз пошла такая пьянка, то смотрим все на Индексированную таблицу http://www.1cpp.ru/docum/html/IndexedTable.html Особенно на методы Группировать http://www.1cpp.ru/docum/html/IndexedTable.html#group и Загрузить http://www.1cpp.ru/docum/html/IndexedTable.html#load
11. Роман Катунин (Rom_Kat) 24.12.07 17:51
12. Евгений Мартыненков (JohnyDeath) 24.12.07 18:28
(11) ну если используешь, зачем тогда тебе:
Код
 ТЗВозврат.ТЗРаспредел = СоздатьОбъект("ТаблицаЗначений");
   ТЗВозврат.ТЗРаспредел.НоваяКолонка("Подраздел","Справочник.Подразделения",,,"Подразделение",7); 
   ТЗВозврат.ТЗРаспредел.НоваяКолонка("КолПерсонала","Строка",25,,"Колич. персонала",5);
   ТЗВозврат.ТЗРаспредел.НоваяКолонка("КолЮрЛицПодраздел","Строка",25,,"Колич. юр. лиц",5);
   ТЗВозврат.ТЗРаспредел.НоваяКолонка("КолРабМест","Строка",25,,"Колич. рабочих мест",5); 
   ТЗВозврат.ТЗРаспредел.НоваяКолонка("КолВыпДоставок","Строка",25,,"Колич. доставок",5); 
   ТЗВозврат.ТЗРаспредел.НоваяКолонка("КолВыпЗаявок","Строка",25,,"Колич. заявок",5);
   ТЗВозврат.ТЗРаспредел.НоваяКолонка("КолНормЧас","Строка",25,,"Колич. нормочас",5);
   ТЗВозврат.ТЗРаспредел.НоваяКолонка("ПроцНачисления","Число",3,0,"% начисления",5); 
   ТЗВозврат.ТЗРаспредел.НоваяКолонка("КолПродаж","Строка",25,,"Колич. продаж",5); 
   ТЗВозврат.ТЗРаспредел.НоваяКолонка("КолСкладПлощ","Строка",25,,"Колич. склад. площ.",5);
   ТЗВозврат.ТЗРаспредел.НоваяКолонка("РаспредСумма","Число",10,2,"Сумма распределенная",5);
Док.ВыбратьСтроки();
        Пока Док.ПолучитьСтроку()=1 Цикл
           ТЗВозврат.ТЗРаспредел.НоваяСтрока();
      ТЗВозврат.ТЗРаспредел.Подраздел = Док.ПодразделРаспред; 
      ТЗВозврат.ТЗРаспредел.КолПерсонала = Док.КолПерсонала;
      ТЗВозврат.ТЗРаспредел.КолЮрЛицПодраздел = Док.КолЮрЛицПодразд;
      ТЗВозврат.ТЗРаспредел.КолРабМест = Док.КолРабМест;      
      ТЗВозврат.ТЗРаспредел.КолВыпДоставок = Док.КолВыпДоставок; 
      ТЗВозврат.ТЗРаспредел.КолВыпЗаявок = Док.КолВыпЗаявок;
      ТЗВозврат.ТЗРаспредел.КолНормЧас = Док.КолНормЧас;
      ТЗВозврат.ТЗРаспредел.ПроцНачисления = Док.ПроцНачисления; 
      ТЗВозврат.ТЗРаспредел.КолПродаж = Док.КолПродаж; 
      ТЗВозврат.ТЗРаспредел.КолСкладПлощ = Док.КолСкладПлощ;
      ТЗВозврат.ТЗРаспредел.РаспредСумма = Док.РаспредСумма;
   КонецЦикла; 
Показать полностью

Вместо всего этого можно написать всего 2 строчки:
Код
 ТЗВозврат.ТЗРаспредел = СоздатьОбъект("ИндексированнаяТаблица");
ТЗВозврат.ТЗРаспредел.Загрузить(Док); 
Показать полностью

!
13. Роман Катунин (Rom_Kat) 24.12.07 18:57
(12) можно было бы, но в обработке тогда переписывать много надо, а времени нет
15. Роман Катунин (Rom_Kat) 21.05.08 11:24
vacancy9

Да и у тебя я смотрю все также дела ;-)
16. Роман Катунин (Rom_Kat) 21.05.08 11:33
vacancy9
В асю выходи пообщаемся
19. Роман Катунин (Rom_Kat) 21.05.08 14:13
Да ты не понял меня. Я и писать ничего не собирался. И в этом блоге врядли кто еще увидит наш разговор )))
Твое мнение обо мне не объективно. А мое о тебе как о работодателе сложилось еще тогда и утвердилось после увиденных здесь вакансий. Если кто и спросит, что нигативного я вынес из сотрудничества с тобой, я конечно раскажу. А так сидеть писать в форум времени нет.
21. Михаил Ражиков (tango) 21.05.08 16:45
22. VasilyKushnir (vasilykushnir) 21.05.08 17:08
23. Роман Катунин (Rom_Kat) 21.05.08 19:38
ну задел человека мой комментарий и из-за этого он даже мой блог посетил ))))
25. Роман Катунин (Rom_Kat) 21.05.08 20:28
может я конечно и ламер. Звез с неба не хватаю. Но 1сом занимаюсь почти 5 лет и многое из того что сделал работает до сих пор. И люди которые работают с моими ламерскими программами не жалуются.
26. Роман Катунин (Rom_Kat) 21.05.08 20:31
Ну и профи они не от того профи, что существуют ламеры-программеры.
27. Роман Катунин (Rom_Kat) 21.05.08 21:21
"много ламеров-программеров, которые проснулись однажды утром, почесались, и их осенило, "а займуська я один эсиной!"."

Я как посмотрю ты довольно часто просыпался с подобной мыслью.Шутка ли сказать 16 языков программирования.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа