1C v7.7: Вывод на экран произвольной переменной типа "Таблица значений"

Описание

Процедура предназначена для облегчения отладки прикладных решений (конфигураций).
Выводит на экран в удобночитаемом виде содержимое произвольной переменной типа "ТаблицаЗначений".
Может быть использована с любой конфигурацией 1С: Предприятие V 7.7.

Автор: Денис Горбунов, осень 2001 - осень 2003
Оригинал расположен на: http://faq1c.gorbunov.ru

Как это использовать

Входные параметры:

1. Тип "ТаблицаЗначений", переменная, содержимое которой мы хотим посмотреть.
2. Тип "Строка", заголовок окна, которое будет выведено на экран, необязательный параметр.

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

Результат работы:
Формирование и вывод на экран печатной формы (объекта типа "Таблица").
Выглядит как обычная таблица - с шапкой (заголовком), разной шириной колонок (ширина
определяется автоматически по содержимому)

История создания

Отлаживая осенью 2001 года одну конфигурацию, я захотел посмотреть, а что такое собственно
у меня находится в переменной. Переменная эта была типа "ТаблицаЗначений" и посмотреть ее
с помощью встроенных в отладчик средств можно было лишь частями. Мало того, - еще и переход
от просмотра одной части к просмотру другой был делом муторным.

Да и, вообще, просмотр сложных структур данных неудобен в большинстве отладчиков
большинства систем программирования, а не только 1С: Предприятие V 7.7. Мне давненько это не нравилось.

И напала на меня мысль, что в языке программирования 1С: Предприятие V 7.7
есть все необходимые средства для реализации универсального алгоритма просмотра
"ТаблицыЗначений".

Отбится от этой мысли не удалось. И первый (насколько я помню даже еще нерабочий) вариант
был сделан в тот же день. И через небольшой промежуток времени алгоритм был доведен до ума.
В течение 2001, 2002, 2003 годов алгоритм совершенстовался по мелочам. Основная же идея созрела
еще в самый первый день.

Оказалось, что отлаживать многие вещи, видя, что варится в мозгу прикладного решения (конфигурации),
намного удобнее, потому уже с 2001 года я вставляю это процедуру во все глобальные модуля
прикладных решений (конфигураций) с которым работаю. Чтобы можно было воспользоваться ею в любой момент.
Чего и вам желаю.

Исходный текст

Врезается в глобальный модуль прикладного решения (конфигурации)
и вызывается откуда угодно. Если не хочется врезать в глобальный модуль,
то слово "Экспорт" в объявлении процедуры смысла не имеет ;)

//********************************************************************************
//
// Создано: осень 2001 года, Денис
//
// Может использоваться при отладке, отображает содержимое
// произвольного объекта типа "ТаблицаЗначений"
//
// Исправлено 7 декабря 2002 года, Денис
// Добавлено изменение ширины столбцов
// и обработка случая, когда параметр не является таблицой значений
//
// Исправлено 25 января 2003 года, Денис
// Добавлена расшифровка
//
Процедура глВывестиТаблицуЗначений(ТаблицаЗначений, Заголовок = "") Экспорт
Перем Таб, ИИ, ЖЖ, НазваниеКолонки, ТипКолонки, Ширина, Значение, Сообщение;

Таб = СоздатьОбъект("Таблица");

Если ТипЗначенияСтр(ТаблицаЗначений) <> "ТаблицаЗначений" Тогда
Сообщение = "В процедуру ""глВывестиТаблицуЗначений()"" передана переменная не типа ""ТаблицаЗначений"", "+
"а типа """+СокрЛП(ТипЗначенияСтр(ТаблицаЗначений))+"""";
Таб.Область(1, 1, 1, 1).Текст = Сообщение;
Таб.Область(1, 1, 1, 1).ШиринаСтолбца(СтрДлина(Сообщение));

Таб.ТолькоПросмотр(1);
Таб.Показать("Не таблица значений: "+Заголовок);

Возврат;
КонецЕсли;

Для ЖЖ = 1 по ТаблицаЗначений.КоличествоКолонок() цикл
ТаблицаЗначений.ПолучитьПараметрыКолонки(ЖЖ,,,, НазваниеКолонки);
Таб.Область(1, ЖЖ, 1, ЖЖ).Текст = СокрЛП(НазваниеКолонки);
Таб.Область(1, ЖЖ, 1, ЖЖ).РамкаОбвести(5, 5, 5, 5);
Таб.Область(1, ЖЖ, 1, ЖЖ).ВертикальноеПоложение(3);
Таб.Область(1, ЖЖ, 1, ЖЖ).ГоризонтальноеПоложение(3);
Таб.Область(1, ЖЖ, 1, ЖЖ).РазмерШрифта(7);
Таб.Область(1, ЖЖ, 1, ЖЖ).Полужирный(1);

Ширина = Таб.Область(1, ЖЖ, 1, ЖЖ).ШиринаСтолбца();
Ширина = Макс(Ширина, СтрДлина(СокрЛП(НазваниеКолонки)));
Таб.Область(1, ЖЖ, 1, ЖЖ).ШиринаСтолбца(Ширина);
КонецЦикла;

Для ИИ = 1 по ТаблицаЗначений.КоличествоСтрок() цикл
Для ЖЖ = 1 по ТаблицаЗначений.КоличествоКолонок() цикл
Значение = ТаблицаЗначений.ПолучитьЗначение(ИИ, ЖЖ);
Таб.Область(ИИ+1, ЖЖ, ИИ+1, ЖЖ).Текст = Значение;
Таб.Область(ИИ+1, ЖЖ, ИИ+1, ЖЖ).Расшифровка(Значение, 0);
Таб.Область(ИИ+1, ЖЖ, ИИ+1, ЖЖ).РамкаОбвести(3, 0, 3, 0);

Ширина = Таб.Область(1, ЖЖ, 1, ЖЖ).ШиринаСтолбца();
Ширина = Макс(Ширина, СтрДлина(СокрЛП(Строка(Значение))));
Таб.Область(1, ЖЖ, 1, ЖЖ).ШиринаСтолбца(Ширина);

ТаблицаЗначений.ПолучитьПараметрыКолонки(ЖЖ, ТипКолонки); ;
Если ТипКолонки = "Число" тогда
Таб.Область(ИИ+1, ЖЖ, ИИ+1, ЖЖ).ГоризонтальноеПоложение(2);
КонецЕсли;
Если ИИ = ТаблицаЗначений.ТекущаяСтрока() тогда
Таб.Область(ИИ+1, ЖЖ, ИИ+1, ЖЖ).ЦветФона(255, 0, 0);
КонецЕсли;
КонецЦикла;
КонецЦикла;

Таб.ТолькоПросмотр(1);
Таб.Показать("Таблица значений: "+Заголовок);
КонецПроцедуры

Компьютерные вопросы: 
2002-2012 ©