В 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;
КонецФункции //глВывестиТаблицуЗначений()