Стандартная интерактивная команда Вывести список позволяет пользователю быстро сформировать печатную форму списка или таблицы. При этом платформа автоматически учитывает текущее состояние таблицы: видимость колонок, их ширину, пользовательские заголовки и порядок следования. Однако в платформе 1С отсутствует прямой платформенный метод, позволяющий вызвать это действие программно в фоновом режиме без открытия диалогового окна настройки.
Когда состав колонок таблицы формируется динамически (например, в документах планирования, расчетах или динамических матрицах), использовать статичные макеты оформления невозможно. Разберем основные способы решения этой задачи.
Рассмотрим классический способ быстрой генерации табличного документа без ручной отрисовки макета ячеек. Объект ПостроительОтчета умеет принимать в качестве источника данных коллекцию строк (например, таблицу значений) и формировать готовый ТабличныйДокумент с автоматическим оформлением.
Для того чтобы учесть только нужные колонки и их пользовательские заголовки, выполним следующие шаги:
ТаблицаЗначений или используем коллекцию данных формы.ПостроительОтчета и передадим данные через ОписаниеИсточникаДанных.ВыбранныеПоля построителя и заполним ее заново, указав имена только видимых полей и их пользовательские заголовки через свойство Представление.Вывести(), передав результирующий ТабличныйДокумент.Посмотрим на пример реализации данного подхода на сервере:
// Создаем результирующий табличный документ
ТабДок = Новый ТабличныйДокумент;
// Преобразуем данные формы в таблицу значений
ТЗДанные = Объект.СоставПлана.Выгрузить();
// Инициализируем построитель отчета
Построитель = Новый ПостроительОтчета;
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТЗДанные);
// Очищаем автосформированные поля
Построитель.ВыбранныеПоля.Очистить();
// МассивВидимыхКолонок получен с клиента (содержит структуры с ИмяПоля и Заголовок)
Для Каждого ОписаниеКолонки Из МассивВидимыхКолонок Цикл
Поле = Построитель.ВыбранныеПоля.Добавить(ОписаниеКолонки.Имя);
Поле.Представление = ОписаниеКолонки.Заголовок;
КонецЦикла;
// Выводим результат в табличный документ
Построитель.Вывести(ТабДок);
Если требуется точно повторить визуальное оформление таблицы формы (ширину колонок, формат чисел и дат, фиксацию шапки, границы ячеек), наиболее надежным решением является прямой обход элементов формы и построение документа через обращение к областям ячеек.
Проанализируем алгоритм работы раздельно для клиента и сервера:
Элементы.ИмяТаблицы.ПодчиненныеЭлементы. Отбираем только те колонки, у которых свойство Видимость установлено в значение Истина. Собираем массив структур со свойствами: Имя, ПутьКДанным, Заголовок, Ширина, Формат.ТабличныйДокумент, выводим строку заголовков и построчно заполняем данными, применяя форматирование.Разберем программный код для клиентской части:
&НаКлиенте
Функция ПолучитьНастройкиКолонок(ИмяЭлементаТаблицы)
НастройкиКолонок = Новый Массив;
ЭлементТаблицы = Элементы[ИмяЭлементаТаблицы];
Для Каждого Колонка Из ЭлементТаблицы.ПодчиненныеЭлементы Цикл
Если ТипЗнч(Колонка) = Тип("ПолеФормы") И Колонка.Видимость Тогда
СтрКолонки = Новый Структура;
СтрКолонки.Вставить("Имя", Колонка.Имя);
СтрКолонки.Вставить("ПутьКДанным", СтрЗаменить(Колонка.ПутьКДанным, ИмяЭлементаТаблицы + ".", ""));
СтрКолонки.Вставить("Заголовок", ?(ЗначениеЗаполнено(Колонка.Заголовок), Колонка.Заголовок, Колонка.Имя));
СтрКолонки.Вставить("Ширина", Колонка.Ширина);
СтрКолонки.Вставить("Формат", Колонка.Формат);
НастройкиКолонок.Добавить(СтрКолонки);
КонецЕсли;
КонецЦикла;
Возврат НастройкиКолонок;
КонецФункции
Теперь рассмотрим процедуру вывода на сервере:
&НаСервере
Функция СформироватьТабличныйДокумент(НастройкиКолонок)
ТабДок = Новый ТабличныйДокумент;
НомерСтроки = 1;
// Формируем шапку таблицы
НомерКолонки = 1;
Для Каждого ОписаниеКолонки Из НастройкиКолонок Цикл
ОбластьЯчейки = ТабДок.Область(НомерСтроки, НомерКолонки);
ОбластьЯчейки.Текст = ОписаниеКолонки.Заголовок;
ОбластьЯчейки.Шрифт = Новый Шрифт(ТабДок.Область(НомерСтроки, НомерКолонки).Шрифт,,, Истина);
Если ОписаниеКолонки.Ширина > 0 Тогда
ТабДок.Область(, НомерКолонки).ШиринаКолонки = ОписаниеКолонки.Ширина;
КонецЕсли;
НомерКолонки = НомерКолонки + 1;
КонецЦикла;
// Выводим строки данных
КоллекцияДанных = Объект.СоставПлана;
Для Каждого СтрДанных Из КоллекцияДанных Цикл
НомерСтроки = НомерСтроки + 1;
НомерКолонки = 1;
Для Каждого ОписаниеКолонки Из НастройкиКолонок Цикл
ОбластьЯчейки = ТабДок.Область(НомерСтроки, НомерКолонки);
Значение = СтрДанных[ОписаниеКолонки.ПутьКДанным];
Если ЗначениеЗаполнено(ОписаниеКолонки.Формат) Тогда
ОбластьЯчейки.Текст = Формат(Значение, ОписаниеКолонки.Формат);
Иначе
ОбластьЯчейки.Значение = Значение;
ОбластьЯчейки.Текст = Строка(Значение);
КонецЕсли;
НомерКолонки = НомерКолонки + 1;
КонецЦикла;
КонецЦикла;
// Оформляем сетку
ОбластьТаблицы = ТабДок.Область(1, 1, НомерСтроки, НастройкиКолонок.Количество());
ОбластьТаблицы.Обвести(ТипЛинииЯчейкиТабличногоДокумента.Сплошная,
ТипЛинииЯчейкиТабличногоДокумента.Сплошная,
ТипЛинииЯчейкиТабличногоДокумента.Сплошная,
ТипЛинииЯчейкиТабличногоДокумента.Сплошная);
ТабДок.ФиксацияСверху = 1;
Возврат ТабДок;
КонецФункции
Если в таблице планирования требуется динамический вывод итогов, группировок или сложное условное оформление, целесообразно использовать программную СКД:
СхемаКомпоновкиДанных программно.ВыбранныеПоля только те поля, которые видимы на форме.КомпоновщикМакета, ПроцессорКомпоновкиДанных и ПроцессорВыводаРезультатаКомпоновкиПрименительноКТабличномуДокументу.При реализации вывода таблиц формы обратите внимание на следующие особенности:
ГруппаФормы вида ГруппаКолонок), для их вывода потребуется рекурсивный обход элементов с объединением смежных ячеек методом Область.Объединить().Формат() со строкой форматирования из поля формы.