Каталог решений - Печать таблицы значений в 1С 7.7 при отладке

Печать таблицы значений в 1С 7.7 при отладке

Печать таблицы значений в 1С 7.7 при отладке

В наличии

Функция выводит таблицу значений в табличный документ. (v7.7)
Особенно полезно при отладке. Не нужно вносить изменения в код, вызываем функцию как вычисляемое выражение при останове. Если таблица обрабатывается в несколько этапов, можно вывести её после каждого и визуально проследить эволюцию.

Категория:

Описание

В 1С 7.7  возможности языка запросов сильно ограничены, поэтому большой объем обработки данных и сложных вычислений производится на таблицах значений.

Довольно полезной оказывается возможность вывести таблицу значений в табличный документ.

Особенно при отладке. Без изменения основного кода. Если таблица обрабатывается в несколько этапов, ставим точки останова после каждого, выводим таблицу при каждом останове и визуально сравниваем её на разных этапах обработки.

Хотя, можно внести вызовы и в сам код, в виде отладочной печати, если хочется.

Предлагаю способ вывода таблиц значений без создания шаблона табличного документа.

Нужно лишь добавить в глобальный модуль функцию глВывестиТаблицуЗначений

Самое полезное применение этой  функции — возможность вызова прямо из отладчика.

Именно для этого код помещен в функцию а не в процедуру, а также рекомендую поместить её в глобальный модуль с ключевым словом "Экспорт".

Нужно в отладчике во время останова лишь набрать в окне выражение:

  глВывестиТаблицуЗначений(МояТаблица)

Можно сделать это несколько раз, после каждого этапа обработки таблицы. И завершив отладку, наблюдать открытые окна табличных документов.

Еще с помощью этой функции можно быстро создавать простейшие отчеты.

Никаких группировок, но есть общие итоги по колонкам. Перечень колонок для расчета итогов указывается в четвертом параметре.
Нужно только описать запрос, затем выполнить его, выгрузить в таблицу значений и вывести её на экран.

  Процедура Сформировать()
  	ТекстЗапроса="
  	|//..................................
  	|";
  	
  	Запрос=СоздатьОбъект("Запрос");
  	Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда
  		Возврат;
  	КонецЕсли;
  	РезТаблица=СоздатьОбъект("ТаблицаЗначений");
  	Запрос.Выгрузить(РезТаблица,1,0);
  	глВывестиТаблицуЗначений(РезТаблица,"Экспресс отчет","Экспресс отчет");
  КонецПроцедуры

Сама функция:

  //******************************************************************************
  // глВывестиТаблицуЗначений(Знач аТаблица,Знач аЗаголовокШапки="",Знач аЗаголовокТаб="ТаблицаЗначений",Знач СтрИтоги="")
  //
  // Параметры: 
  //  аТаблица - таблица значений для вывода на экран
  //  аЗаголовокШапки  - строка, выводимая в шапке печатной формы
  //  аЗаголовокТаб    - строка заголовка окна выводимой формы
  //  аСтрИтоги        - строка, содержащая, через запятую, перечень имен колонок по которым нужно 
  //    посчитать и вывести итоговую сумму (числовую) по всей таблице. 
  //    Может содержать также значения "_Все_" или "_Все_Числовые_"
  //
  // Возвращаемое значение:
  //  1
  //
  // Описание:
  //  Выводит на экране в табличной печатной форме содержимое таблицы значений
  //
  Функция глВывестиТаблицуЗначений(Знач аТаблица,Знач аЗаголовокШапки="",Знач аЗаголовокТаб="ТаблицаЗначений",Знач аСтрИтоги="") Экспорт
  	
  	ТипОснАргумента=ТипЗначенияСтр(аТаблица);
  	Если ТипОснАргумента<>"ТаблицаЗначений" Тогда
  		Сообщить("В процедуру вывода таблицы значений передан аргумент другого типа ("+ТипОснАргумента+")","!");
  		Возврат 0;
  	КонецЕсли;
  	
  	флВывестиИтогиПоКолонкам=0;
  	
  	СтрИтоги=СокрЛП(аСтрИтоги);
  	СпИтоги=СоздатьОбъект("СписокЗначений");                          
  	Если ПустоеЗначение(СтрИтоги)=0 Тогда
  		РасшСтрока="";
  		Пока ПустаяСтрока(СтрИтоги)=0 Цикл
  			Поз=Найти(СтрИтоги,",");
  			Если Поз<>0 Тогда
  				ИмяЭлемента=СокрЛП(Лев(СтрИтоги,Поз-1));
  				СтрИтоги=Сред(СтрИтоги,Поз+1);
  			Иначе
  				ИмяЭлемента=СокрЛП(СтрИтоги);
  				СтрИтоги="";
  			КонецЕсли;
  			Если ПустоеЗначение(ИмяЭлемента)=1 Тогда
  				Продолжить;
  			КонецЕсли;           
  			СпИтоги.ДобавитьЗначение(ИмяЭлемента);
  		КонецЦикла;
  	КонецЕсли;
  
  	
  	ТабКолонок=СоздатьОбъект("ТаблицаЗначений");
  	ТабКолонок.НоваяКолонка("Номер","Число",15,0);
  	ТабКолонок.НоваяКолонка("Имя","Строка");
  	ТабКолонок.НоваяКолонка("Ширина","Число",15,0);
  	ТабКолонок.НоваяКолонка("ТипЗн","Строка");
  	ТабКолонок.НоваяКолонка("Длина","Число",15,0);
  	ТабКолонок.НоваяКолонка("Точность","Число",15,0);
  	ТабКолонок.НоваяКолонка("Заголовок","Строка");
  	ТабКолонок.НоваяКолонка("ФорматнаяСтрока","Строка");
  	ТабКолонок.НоваяКолонка("ВывестиИтог","Число",1,0);
  	Для СчКол=1 По аТаблица.КоличествоКолонок() Цикл
  		ТипЗн="";
  		Длина=0;
  		Точность=0;
  		ЗаголовокКол="";
  		ИмяКолонки=аТаблица.ПолучитьПараметрыКолонки(СчКол,ТипЗн,Длина,Точность,ЗаголовокКол,,,);
  		Если ПустоеЗначение(ЗаголовокКол)=1 Тогда
  		    ЗаголовокКол=ИмяКолонки;
  		КонецЕсли;
  		
  		ФорматнаяСтрока="";
  		ВывестиИтог=0;
  		
  		Если ТипЗн="Число" Тогда
  			ДлинаФС=Длина;
  			ТочностьФС=Точность;
  			Если (ДлинаФС>0) ИЛИ (ТочностьФС>0) Тогда
  				ДлинаФС=?(ДлинаФС=0,15,ДлинаФС);
  				ФорматнаяСтрока="Ч0"+ДлинаФС+"."+ТочностьФС+".";
  			КонецЕсли;
  			Если СпИтоги.Принадлежит("_Все_Числовые_")=1 Тогда
  				ВывестиИтог=1;
  				флВывестиИтогиПоКолонкам=1;
  			КонецЕсли;
  		КонецЕсли;
  		
  		Если (СпИтоги.Принадлежит(ИмяКолонки)=1) ИЛИ (СпИтоги.Принадлежит("_Все_")=1) Тогда
  		    ВывестиИтог=1;
  			флВывестиИтогиПоКолонкам=1;
  		КонецЕсли;
  		
  		ТабКолонок.НоваяСтрока();
  		ТабКолонок.Номер=СчКол;
  		ТабКолонок.Имя=ИмяКолонки;
  		ТабКолонок.ТипЗн=ТипЗн;
  		ТабКолонок.Длина=Длина;
  		ТабКолонок.Точность=Точность;
  		ТабКолонок.Заголовок=ЗаголовокКол;
  		ТабКолонок.Ширина=СтрДлина(ЗаголовокКол)+3;
  		ТабКолонок.ФорматнаяСтрока=ФорматнаяСтрока;
  		ТабКолонок.ВывестиИтог=ВывестиИтог;
  	КонецЦикла;
  	
  	Для СчСтр=1 По аТаблица.КоличествоСтрок() Цикл
  		ТабКолонок.ВыбратьСтроки();
  		Пока ТабКолонок.ПолучитьСтроку()=1 Цикл
  			Если ТабКолонок.ФорматнаяСтрока<>"" Тогда
  				Содержимое=СокрЛП(Формат(аТаблица.ПолучитьЗначение(СчСтр,ТабКолонок.Номер),ТабКолонок.ФорматнаяСтрока));
  			Иначе
  				Содержимое=СокрЛП(аТаблица.ПолучитьЗначение(СчСтр,ТабКолонок.Номер));
  			КонецЕсли;
  			ТабКолонок.Ширина=Макс(ТабКолонок.Ширина,СтрДлина(Содержимое));
  		КонецЦикла;
  	КонецЦикла;
  	
  	Таб=СоздатьОбъект("Таблица");
  	
  	СтрШапкиТ=1;
  	НачКолТ=1;
  	
  	Если ПустоеЗначение(аЗаголовокШапки)=0 Тогда
  	    
  		ОбластьТ=Таб.Область(СтрШапкиТ,НачКолТ,СтрШапкиТ,НачКолТ); 
  		ОбластьТ.Текст=аЗаголовокШапки;
  		ОбластьТ.Контроль(1);
  		ОбластьТ.ВертикальноеПоложение(3);
  		ОбластьТ.ГоризонтальноеПоложение(1);
  		ОбластьТ.РазмерШрифта(12);
  		ОбластьТ.Полужирный(1);
  		ОбластьТ.ЦветТекста(255);
  		
  		СтрШапкиТ=СтрШапкиТ+1;
  	КонецЕсли;
  	
  	ОбластьТ=Таб.Область(СтрШапкиТ,НачКолТ,СтрШапкиТ,НачКолТ); 
  	ОбластьТ.Текст="№ п/п";
  	ОбластьТ.Полужирный(1);
  	ОбластьТ.Контроль(4);
  	ШиринаСтолбца=СтрДлина(аТаблица.КоличествоСтрок())+3;
  	ОбластьТ.ШиринаСтолбца(ШиринаСтолбца);
  	ОбластьТ.ВертикальноеПоложение(3);
  	ОбластьТ.ГоризонтальноеПоложение(3);
  	ОбластьТ.Рамка(3,3,3,3);
  	
  	ТабКолонок.ВыбратьСтроки();
  	Пока ТабКолонок.ПолучитьСтроку()=1 Цикл
  		НомКолТ=НачКолТ+ТабКолонок.Номер;
  		ОбластьТ=Таб.Область(СтрШапкиТ,НомКолТ,СтрШапкиТ,НомКолТ); 
  		ОбластьТ.Текст=ТабКолонок.Заголовок;
  		ОбластьТ.Полужирный(1);
  		ОбластьТ.Контроль(4);
  		ШиринаСтолбца=ТабКолонок.Ширина;
  		Если ШиринаСтолбца>=60 Тогда
  			ШиринаСтолбца=Цел(ШиринаСтолбца/2);
  		КонецЕсли;
  		ОбластьТ.ШиринаСтолбца(ШиринаСтолбца);
  		ОбластьТ.ВертикальноеПоложение(3);
  		ОбластьТ.ГоризонтальноеПоложение(3);
  		ОбластьТ.Рамка(3,3,3,3);
  	КонецЦикла;
  	 
  	НомСтрТ=СтрШапкиТ;
  	Для СчСтр=1 По аТаблица.КоличествоСтрок() Цикл
  		НомСтрТ=НомСтрТ+1;
  		
  		ОбластьТ=Таб.Область(НомСтрТ,НачКолТ,НомСтрТ,НачКолТ);
  		ОбластьТ.Текст=СчСтр;
  		ОбластьТ.Контроль(4);
  		ОбластьТ.ВертикальноеПоложение(3);
  		ОбластьТ.ГоризонтальноеПоложение(3);
  		ОбластьТ.Рамка(3,3,3,3);
  		
  		ТабКолонок.ВыбратьСтроки();
  		Пока ТабКолонок.ПолучитьСтроку()=1 Цикл
  			НомКолТ=НачКолТ+ТабКолонок.Номер;
  			Если ТабКолонок.ФорматнаяСтрока<>"" Тогда
  				Содержимое=СокрЛП(Формат(аТаблица.ПолучитьЗначение(СчСтр,ТабКолонок.Номер),ТабКолонок.ФорматнаяСтрока));
  			Иначе
  				Содержимое=СокрЛП(аТаблица.ПолучитьЗначение(СчСтр,ТабКолонок.Номер));
  			КонецЕсли;
  			ОбластьТ=Таб.Область(НомСтрТ,НомКолТ,НомСтрТ,НомКолТ);
  			ОбластьТ.Текст=Содержимое;
  			ОбластьТ.Контроль(4);
  			ОбластьТ.ВертикальноеПоложение(3);
  			Если ТабКолонок.ТипЗн="Число" Тогда
  				ОбластьТ.ГоризонтальноеПоложение(2);
  			Иначе
  				ОбластьТ.ГоризонтальноеПоложение(1);
  			КонецЕсли;	
  			ОбластьТ.Рамка(3,3,3,3);
  		КонецЦикла;
  	КонецЦикла;	 
  	
  	Если флВывестиИтогиПоКолонкам=1 Тогда
  		НомСтрТ=НомСтрТ+1;
  		ОбластьТ=Таб.Область(НомСтрТ,НачКолТ,НомСтрТ,НачКолТ); 
  		ОбластьТ.Текст="ИТ.";
  		ОбластьТ.Полужирный(1);
  		ОбластьТ.Контроль(4);
  		ОбластьТ.ВертикальноеПоложение(3);
  		ОбластьТ.ГоризонтальноеПоложение(3);
  		ОбластьТ.Рамка(3,3,3,3);
  		
  		ТабКолонок.ВыбратьСтроки();
  		Пока ТабКолонок.ПолучитьСтроку()=1 Цикл
  		
  			Содержимое="";
  			Если ТабКолонок.ВывестиИтог=1 Тогда
  				ИтогПоКол=0;
  				
  				Если ТабКолонок.ТипЗн="Число" Тогда
  					ИтогПоКол=аТаблица.Итог(ТабКолонок.Имя);
  				Иначе
  					ИтогПоКол=0;
  					аТаблица.ВыбратьСтроки();
  					Пока аТаблица.ПолучитьСтроку()=1 Цикл
  						ИтогПоКол=ИтогПоКол+Число(Строка(аТаблица.ПолучитьЗначение(аТаблица.НомерСтроки,ТабКолонок.Номер)));
  					КонецЦикла;
  				КонецЕсли;
  				
  				Если ТабКолонок.ФорматнаяСтрока<>"" Тогда
  					Содержимое=СокрЛП(Формат(ИтогПоКол,ТабКолонок.ФорматнаяСтрока));
  				Иначе
  					Содержимое=СокрЛП(ИтогПоКол);
  				КонецЕсли;
  			КонецЕсли;
  			
  			
  			НомКолТ=НачКолТ+ТабКолонок.Номер;
  			ОбластьТ=Таб.Область(НомСтрТ,НомКолТ,НомСтрТ,НомКолТ); 
  			ОбластьТ.Текст=Содержимое;
  			ОбластьТ.Полужирный(1);
  			ОбластьТ.Контроль(4);
  			ОбластьТ.ВертикальноеПоложение(3);
  			ОбластьТ.ГоризонтальноеПоложение(2);
  			ОбластьТ.Рамка(3,3,3,3);
  		КонецЦикла;
  	КонецЕсли;
  	
  	Таб.Опции(0,0,СтрШапкиТ);
  	Таб.ТолькоПросмотр(1);
  	Таб.Показать(аЗаголовокТаб);
  	Возврат 1;
  КонецФункции  //глВывестиТаблицуЗначений()
  

 

has been added to your cart:
Оформление заказа