Ниже приведено несколько полезных шаблонов кода по работе с табличным документом:
Код 1C v 8.х //Пример получения текста ячейки
ПолеТабДок = ЭлементыФормы.тдПолеТабличногоДокумента;
ПолеТабДок.Область("R1C2").Текст = спрНоменклатура.Наименование;
ПолеТабДок.Область("R2C2").Текст = "Это Строка"; //указываем явно литерал строки
Код 1C v 8.х // Изменение текста в области или ячейке
Для а = 11 по ТабличныйДокумент.ВысотаТаблицы Цикл
//Ячейка = ТабличныйДокумент.Область(а,1,а,1).Текст;
текстЯчейка = ТабличныйДокумент.Область("R"+а+"C2").Текст;
Если Строка(ТабличныйДокумент.Область("R"+а+"C2").ЦветФона)="стиль: Фон кнопки" Тогда
ТабличныйДокумент.Область("R"+а+"C7").Текст="";
ТабличныйДокумент.Область("R"+а+"C11").Текст="";
ТабличныйДокумент.Область("R"+а+"C8").Текст="";
ТабличныйДокумент.Область("R"+а+"C9").Текст="";
ТабличныйДокумент.Область("R"+а+"C10").Текст="";
КонецЕсли;
КонецЦикла;
Код 1C v 8.х // Как раскрасить ячейку или область табличного документа в зависимости от условия
ТабДок = ЭлементыФормы.ПолеТабличногоДокумента; // Получаем табличный документ из формы
ТабДок.Очистить(); // Очищаем табличный документ
Макет = ПолучитьМакет("Макет"); // Получаем макет с именем "Макет" из текущего объекта
ОбластьСтрокаТаб = Макет.ПолучитьОбласть("СтрокаТаб"); // Получаем область из макета
ОбластьСтрокаТаб.Параметры.НашПараметр = 1; // Устанавливаем значение 1 параметру "НашПараметр"
ОбластьОформления = ТабДок.Вывести(ОбластьСтрокаТаб);
// Вот собственно и само оформление ячейки
ТабДок.Область(ОбластьОформления.Верх, ОбластьОформления.Лево, ОбластьОформления.Низ, ОбластьОформления.Лево).ЦветФона = WebЦвета.Красный;
Код 1C v 8.х //Пример изменения цвета текста при выводе данных в табличный документ
Таб.ВывестиСекцию("Контрагент");
// Изменим Текст ячейки, имя которой заранее задали как "ТекстОСостоянии"
Таб.Область("ТекстОСостоянии").Текст = "Хорошо ";
// В зависимости от условия изменим Цвет Текста
Если Раз<0 Тогда
Таб.Область(Таб.ВысотаТаблицы(),9,Таб.ВысотаТаблицы(),9).ЦветТекста(255,0,0);
ИначеЕсли Раз>0 Тогда
Таб.Область(Таб.ВысотаТаблицы(),9,Таб.ВысотаТаблицы(),9).ЦветТекста(0,0,255);
КонецЕсли;
Для того, чтобы появилась возможность использовать свойство "Значение", необходимо явно присвоить свойству ячейки "СодержитЗначение" значение Истина или установить флажок "Содержит значение" в палитре свойств.
Для ячейки, у которой установлен признак "СодержитЗначение", можно задать тип значения, размещаемого в ячейке.
Следующий фрагмент демонстрирует, как можно управлять этими свойствами из встроенного языка://задаем нужный тип с помощью объекта "ОписаниеТипов"
Код 1C v 8.х МассивБулево = Новый Массив;
МассивБулево.Добавить(Тип("Булево"));
ОписаниеТиповБулево = Новый ОписаниеТипов(МассивБулево);
//...
ПолеТабДок = ЭлементыФормы.тдПолеТабличногоДокумента;
ПолеТабДок.Область("R3C3").СодержитЗначение = Истина; //указываем, что в ячейке будет значение
ПолеТабДок.Область("R3C3").ТипЗначения = ОписаниеТиповБулево; //указываем тип значения
ПолеТабДок.Область("R3C3").Значение = СпрНоменклатура.Услуга; //значение, типа "Булево" из справочника
Для ячейки табличного документа можно задавать формат вывода данных. Для этого используется свойство "Формат", которое содержит форматную строку. Приемы работы с форматной строкой полностью совпадают с функцией Формат()
Код 1C v 8.х ПолеТабДок = ЭлементыФормы.тдПолеТабличногоДокумента;
ПолеТабДок.Область("R4C3").ТипЗначения = ОписаниеТиповДата; //указываем тип, ранее заданный для Даты
ПолеТабДок.Область("R4C3").Значение = ТекущаяДата();
//указываем форматную строку
//будет выглядеть как "[031120-2315]-", если текущая дата '20-11-2003 23:15:00')
ПолеТабДок.Область("R4C3").Формат = "ДФ=[ггММдд-ЧЧмм]-";
Элемент управления в табличном документе
Для ячейки, у которой установлен признак "СодержитЗначение", можно также задать элемент управления, который будет использоваться для редактирования этого значения.
Элемент управления можно назначить через палитру свойств или из встроенного языка с помощью метода "УстановитьЭлементУправления()". Чтобы проверить в программе, установлен ли элемент управления для конкретной ячейки, можно использовать свойство "ЭлементУправления", которое возвращает элемент управления, назначенный для ячейки.
Элементы управления, встроенные в ячейку, отображаются только при входе в режим редактирования значения. На приведенном ниже рисунке редактируемая ячейка обведена овалом и в ней отображается флажок:
Ниже показан пример установки элемента управления типа "Флажок" из встроенного языка://задаем нужный тип с помощью объекта "ОписаниеТипов"
Код 1C v 8.х МассивБулево = Новый Массив;
МассивБулево.Добавить(Тип("Булево"));
ОписаниеТиповБулево = Новый ОписаниеТипов(МассивБулево);
...
ПолеТабДок = ЭлементыФормы.тдПолеТабличногоДокумента;
ПолеТабДок.Область("R5C3").СодержитЗначение = Истина; //указываем, что в ячейке будет значение
ПолеТабДок.Область("R5C3").ТипЗначения = ОписаниеТиповБулево; //указываем ранее заданный тип
ПолеТабДок.Область("R5C3").Значение = СпрНоменклатура.Услуга; //значение, типа "Булево" из справочника
//а теперь указываем, что в ячейке будет отображаться флажок
ПолеТабДок.Область("R5C3").УстановитьЭлементУправления(Тип("Флажок"));
Для элементов управления, расположенных в табличном документе, расширяется набор свойств, методов и событий:
Разберем самые важные свойства и методы:
Свойство "ВстроенВЯчейку" имеет тип "булево" и говорит о том, что элемент управления встраивается в ячейку или просто привязывается к ней, о чем было рассказано выше.
Свойство "Видимость" позволяет показать или скрыть элемент управления.
Свойство "Значение" предоставляет доступ к значению, которое редактируется в элементе управления. Оно используется только для элементов управления, поддерживающих связь с данными.
Метод "Расположить" позволяет разместить элемент управления в конкретной области ячеек табличного документа. Именно этот метод был использован в вышеприведенном примере.
Код 1C v 8.х ПолеТабДок = ЭлементыФормы.тдПолеТабличногоДокумента;
ПолеТабДок.Область("R4C3").Защита = Истина;
Как известно, с помощью языка запросов 1С получить уникальный идентификатор объекта ссылочного типа на данный момент нельзя. Но используя возможность СКД обращаться к внешним функциям можно получить строковое представление уникального идентификатора ссылки. Для этого необходимо использовать глобальную функцию XMLСтрока в вычисляемых полях в макете схемы компоновки.
Далее проведем эксперимент по быстродействию получения результата через запрос с последующей обработкой выборки и вариантов с использованием СКД.
Рассмотрим два случая - вывод в табличный документ и формирование текстового документа.
Так же в случае с СКД мы можем создать схему компоновки программно или использовать готовую. Результат работы СКД так же можно обойти в цикле, либо вывести в таблицу значений с последующей обработкой. Для экспериментов будет использоваться платформа 8.3, конфигурация УТ11 (файловая), справочник "КлассификаторБанковРФ", более 4000 элементов.
Схему компоновки и макет можно посмотреть, скачав обработку (ссылка в конце).
Код 1C v 8.2 УП &НаКлиентеНаСервереБезКонтекста
Функция ПолучитьТекстЗапроса()
Возврат "ВЫБРАТЬ
| КлассификаторБанковРФ.Ссылка,
| КлассификаторБанковРФ.Наименование
|ИЗ
| Справочник.КлассификаторБанковРФ КАК КлассификаторБанковРФ";
КонецФункции // ПолучитьТекстЗапроса()
&НаСервере
Функция ПолучитьСхемуОбработки()
Возврат РеквизитФормыВЗначение("Отчет").ПолучитьМакет("Макет");
КонецФункции
&НаСервереБезКонтекста
Функция ПолучитьСхемуКомпоновки()
Схема = Новый СхемаКомпоновкиДанных;
ИсточникДанных = Схема.ИсточникиДанных.Добавить();
ИсточникДанных.Имя = "Источник";
ИсточникДанных.ТипИсточникаДанных = "Local";
НаборДанных = Схема.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
НаборДанных.Имя = "НаборДанных";
НаборДанных.ИсточникДанных = "Источник";
НаборДанных.Запрос = ПолучитьТекстЗапроса();
НаборСсылка = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
НаборСсылка.Поле = "Ссылка";
НаборСсылка.ПутьКДанным = "Ссылка";
НаборНаименование= НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
НаборНаименование.Поле = "Наименование";
НаборНаименование.ПутьКДанным = "Наименование";
ПолеИД = Схема.ВычисляемыеПоля.Добавить();
ПолеИД.Выражение = "XMLСтрока(Ссылка)";
ПолеИД.Заголовок = "ИД";
ПолеИД.ПутьКДанным = "ИД";
СтрокаТЗ = Схема.НастройкиПоУмолчанию.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
СтрокаТЗ.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
ЭлементыВыбора = Схема.НастройкиПоУмолчанию.Выбор.Элементы;
ПолеСсылка = ЭлементыВыбора.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ПолеСсылка.Поле = Новый ПолеКомпоновкиДанных("Ссылка");
ПолеНаименование = ЭлементыВыбора.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ПолеНаименование.Поле = Новый ПолеКомпоновкиДанных("Наименование");
ПолеИД = ЭлементыВыбора.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ПолеИД.Поле = Новый ПолеКомпоновкиДанных("ИД");
Возврат Схема;
КонецФункции
&НаСервереБезКонтекста
Функция ЗаполнитьПоКомпоновкеПрямойОбход(Схема)
Док = Новый ТекстовыйДокумент;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
Макет = КомпоновщикМакета.Выполнить(Схема, Схема.НастройкиПоУмолчанию,,, Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(Макет,,, Истина);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ПроцессорВывода.УстановитьОбъект(Новый ТаблицаЗначений);
ПроцессорВывода.НачатьВывод();
Пока Истина Цикл
ЭлементКомпоновки = ПроцессорКомпоновки.Следующий();
Если ЭлементКомпоновки = Неопределено Тогда
Прервать;
КонецЕсли;
ПроцессорВывода.ВывестиЭлемент(ЭлементКомпоновки);
Если ЭлементКомпоновки.Макет = "Макет2" И ЭлементКомпоновки.ТипЭлемента = ТипЭлементаРезультатаКомпоновкиДанных.НачалоИКонец Тогда
Док.ДобавитьСтроку(ЭлементКомпоновки.ЗначенияПараметров.П2.Значение + ";" + ЭлементКомпоновки.ЗначенияПараметров.П3.Значение);
КонецЕсли;
КонецЦикла;
ТЗ = ПроцессорВывода.ЗакончитьВывод();
Возврат Док;
КонецФункции // ЗаполнитьПоКомпоновкеПрямойОбход()
&НаСервере
Функция ЗаполнитьОбходТЗ(ИспользоватьСхемуОбработки)
Если ИспользоватьСхемуОбработки Тогда
Схема = ПолучитьСхемуОбработки();
Иначе
Схема = ПолучитьСхемуКомпоновки();
КонецЕсли;
Возврат ЗаполнитьПоКомпоновкеОбходТЗ(Схема);
//Возврат ЗаполнитьПоКомпоновкеОбходТЗ(?(ИспользоватьСхемуОбработки, ПолучитьСхемуОбработки(), ПолучитьСхемуКомпоновки()));
КонецФункции // ЗаполнитьОбходТЗ()
&НаСервере
Функция ЗаполнитьПрямойОбход(ИспользоватьСхемуОбработки)
Если ИспользоватьСхемуОбработки Тогда
Схема = ПолучитьСхемуОбработки();
Иначе
Схема = ПолучитьСхемуКомпоновки();
КонецЕсли;
Возврат ЗаполнитьПоКомпоновкеПрямойОбход(Схема);
//Возврат ЗаполнитьПоКомпоновкеПрямойОбход(?(ИспользоватьСхемуОбработки, ПолучитьСхемуОбработки(), ПолучитьСхемуКомпоновки()));
КонецФункции // ЗаполнитьОбходТЗ()
&НаСервереБезКонтекста
Функция ЗаполнитьПоКомпоновкеОбходТЗ(Схема)
Док = Новый ТекстовыйДокумент;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
Макет = КомпоновщикМакета.Выполнить(Схема, Схема.НастройкиПоУмолчанию,,, Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(Макет,,, Истина);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ПроцессорВывода.УстановитьОбъект(Новый ТаблицаЗначений);
ТЗ = ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Для Каждого СтрокаТЗ Из ТЗ Цикл
Док.ДобавитьСтроку(СтрокаТЗ.Наименование + ";" + СтрокаТЗ.ИД);
КонецЦикла;
Возврат Док;
КонецФункции // ЗаполнитьПоКомпоновкеОбходТЗ()
&НаСервереБезКонтекста
Функция ЗаполнитьПоЗапросу()
Док = Новый ТекстовыйДокумент;
Запрос = Новый Запрос(ПолучитьТекстЗапроса());
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
Док.ДобавитьСтроку(Результат.Наименование + ";" + XMLСтрока(Результат.Ссылка));
КонецЦикла;
Возврат Док;
КонецФункции // ЗаполнитьПоЗапросу()
&НаСервере
Процедура ЗаполнитьТабДокСхема(ИспользоватьСхемуОбработки)
Если ИспользоватьСхемуОбработки Тогда
Схема = ПолучитьСхемуОбработки();
ТабДок = ТабДок1;
Иначе
Схема = ПолучитьСхемуКомпоновки();
ТабДок = ТабДок2;
КонецЕсли;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
Макет = КомпоновщикМакета.Выполнить(Схема, Схема.НастройкиПоУмолчанию);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(Макет,,, Истина);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабДок);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры // ЗаполнитьТабДокСхема()
&НаСервере
Процедура ЗаполнитьТабДокЗапрос()
Макет = РеквизитФормыВЗначение("Отчет").ПолучитьМакет("Отчет");
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
Запрос = Новый Запрос(ПолучитьТекстЗапроса());
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
ОбластьСтрока.Параметры.Заполнить(Результат);
ОбластьСтрока.Параметры.ИД = XMLСтрока(Результат.Ссылка);
ТабДок3.Вывести(ОбластьСтрока);
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ЗаполнитьТабДокСхема(Истина);
ЗаполнитьТабДокСхема(Ложь);
ЗаполнитьТабДокЗапрос();
Т1 = ЗаполнитьПоЗапросу();
Т2 = ЗаполнитьОбходТЗ(Ложь);
Т3 = ЗаполнитьОбходТЗ(Истина);
Т4 = ЗаполнитьПрямойОбход(Ложь);
Т5 = ЗаполнитьПрямойОбход(Истина);
КонецПроцедуры
По результатам замера производительности видно, что вывод результата в табличный документ происходит быстрее при использовании СКД, причем вариант с программным созданием схемы отрабатывает несколько быстрее.
В тоже время вывод результатов в текстовый документ отрабатывает быстрее для запроса.
Программное создание схемы компоновки отработало быстрее, чем получение макета схемы.
Источник
Пример кода быстрая Печать таблицы значений
Код 1C v 8.х //ТПОтчета - Табличное поле с формы (Таблица значений) с данными
ПострПечать = Новый ПостроительОтчета;
ПострПечать.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТПОтчета);
ПострПечать.МакетОформления = ПолучитьМакетОформления(СтандартноеОформление.Интерфейс);
ПострПечать.Выполнить();
Для каждого Колонка Из ПострПечать.ВыбранныеПоля Цикл
Колонка.Представление = ТПОтчета.Колонки[Колонка.Имя].Заголовок;
КонецЦикла;
ПострПечать.Вывести();
Пример функций Печать таблицы значений с использованием Макета
Код 1C v 8.х //Процедура формирует и выводит отчет по переданной таблице значений
// Параметры :
// ТЗ - ТаблицаЗначений
Процедура УниверсальныйОтчетПоТЗ(ТЗ)
Табл=Новый ТабличныйДокумент;
Макет = ЭтотОбъект.ПолучитьМакет("Макет");
ОбластьШапкаОсновной=Макет.ПолучитьОбласть("Шапка|Основной");
ОбластьСтрокаОсновной=Макет.ПолучитьОбласть("Строка|Основной");
ОбластьИтогОсновной=Макет.ПолучитьОбласть("Итог|Основной");
ОбластьШапкаДОП=Макет.ПолучитьОбласть("Шапка|Показатели");
ОбластьСтрокаДОП=Макет.ПолучитьОбласть("Строка|Показатели");
ОбластьИтогДОП=Макет.ПолучитьОбласть("Итог|Показатели");
Табл.Вывести(ОбластьШапкаОсновной);
Для Каждого Колонка из Тз.Колонки ЦИКЛ
ОбластьШапкаДОП.Параметры.ИмяПоказателя=Колонка.Имя;
Табл.Присоединить(ОбластьШапкаДОП);
КонецЦикла;
счетчик=0;
Для каждого стр из Тз Цикл
счетчик=счетчик+1;
ОбластьСтрокаОсновной.Параметры.счетчик=счетчик;
Табл.Вывести(ОбластьСтрокаОсновной);
Для Каждого Колонка из Тз.Колонки ЦИКЛ
ОбластьСтрокаДОП.Параметры.ЗначениеКолонки=стр[Колонка.Имя];
Табл.Присоединить(ОбластьСтрокаДОП);
КонецЦикла;
КонецЦикла;
Табл.Вывести(ОбластьИтогОсновной);
Для Каждого Колонка из Тз.Колонки ЦИКЛ
ОбластьИтогДОП.Параметры.Итог=Тз.Итог(Колонка.Имя);
Табл.Присоединить(ОбластьИтогДОП);
КонецЦикла;
Табл.Показать();
КонецПроцедуры
Код 1C v 7.x
//Вывести таблицу значений
Процедура ПечатьТЗвТаб(ТЗ, Заголовок = "",КолонкиПоНазваниям = 0) Экспорт
Перем ТТЗ;
ТЗ.Выгрузить(ТТЗ);
МаксШирина = 50; // максимальная ширина колонки
СпШирина = СоздатьОбъект("СписокЗначений"); // список ширин колонок по таблице
Для сч = 1 по ТТЗ.КоличествоКолонок() Цикл
Если КолонкиПоНазваниям = 0 Тогда
ИмяРек = ТТЗ.ПолучитьПараметрыКолонки(сч);
Иначе
ИмяРек = "";
ТТЗ.ПолучитьПараметрыКолонки(сч,,,,ИмяРек,);
КонецЕсли;
СпШирина.ДобавитьЗначение(СтрДлина(ИмяРек)*1.2); // с поправкой на размер шрифта
КонецЦикла;
// просто печать таблицы - вывод всех строк и колонок
// числовые значения - по правому краю. Автоподбор ширины - в пределах МаксШирина
Таб=СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("ПечатьТЗ");
Если СокрЛП(Заголовок) <> "" Тогда
Таб.ВывестиСекцию("Шапка");
КонецЕсли;
// заголовки таблицы
Таб.ВывестиСекцию("Строка|Общая");
Для сч=1 по ТТЗ.КоличествоКолонок() Цикл
Если КолонкиПоНазваниям = 0 Тогда
ИмяРек = ТТЗ.ПолучитьПараметрыКолонки(сч);
Иначе
ИмяРек = "";
Ном = "";
ТТЗ.ПолучитьПараметрыКолонки(сч,,,,ИмяРек,);
КонецЕсли;
Таб.ПрисоединитьСекцию("Строка|Столбец");
КонецЦикла;
ВысотаШапки = Таб.ВысотаТаблицы();
// данные таблицы по строкам
ТТЗ.ВыбратьСтроки();
Пока ТТЗ.ПолучитьСтроку()=1 Цикл
Ном = ТТЗ.НомерСтроки;
Таб.ВывестиСекцию("Строка|Общая");
Выс = Таб.ВысотаТаблицы();
Для сч=1 по ТТЗ.КоличествоКолонок() Цикл
ИмяРек=ТТЗ.ПолучитьЗначение(Ном,сч);
Таб.ПрисоединитьСекцию("Строка|Столбец");
Если ТипЗначения(ИмяРек) = 1 Тогда
Обл = Таб.Область("R"+Выс+"C"+(Сч+1)); // ячейка в которую поместили данные
Обл.ГоризонтальноеПоложение(2); // числа - вправо
КонецЕсли;
НачШирина = СпШирина.ПолучитьЗначение(Сч);
Ширина = СтрДлина(ИмяРек);
СпШирина.УстановитьЗначение(Сч,Макс(НачШирина,Ширина));
КонецЦикла;
КонецЦикла;
Для сч = 1 по СпШирина.РазмерСписка() Цикл
Обл = Таб.Область("R"+ВысотаШапки+"C"+(Сч+1));
// форматируем ширину таблицы
Ширина = Мин(МаксШирина,2+СпШирина.ПолучитьЗначение(Сч));
Обл.ШиринаСтолбца(Ширина);
// форматируем заголовок
Обл.Полужирный(1);
КонецЦикла;
Таб.Показать(Заголовок);
Таб.ТолькоПросмотр(1);
КонецПроцедуры
ИЛИ
Код 1C v 7.x Процедура глВывестиТаблицуЗначений(ТаблицаЗначений, Заголовок = "") Экспорт
Перем Таб, ИИ, ЖЖ, НазваниеКолонки, ТипКолонки, Ширина, Значение, Сообщение;
Таб = СоздатьОбъект("Таблица");
Если ТипЗначенияСтр(ТаблицаЗначений) <> "ТаблицаЗначений" Тогда
Сообщение = "В процедуру ""глВывестиТаблицуЗначений()"" передана переменная не типа ""ТаблицаЗначений"", "+
"а типа """+СокрЛП(ТипЗначенияСтр(ТаблицаЗначений))+"""";
Таб.Область(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);
Таб.Показать("Таблица значений: "+Заголовок);
КонецПроцедуры