Чтобы таблицу значений вывести в список и получить ТабличныйДокумент? Причем с цветами.
---
fixin, у меня тоже было лаконичнее, пока не стал этажерки строить.
Запросы можно соптимизировать, так как сейчас там по кусочкам решаются задачи по мере всплывания. Там лишь рассчитываюся параметры блоков колонок таблицы - высоты, ширины и прочее.
---
Функция формирует табличный документ из табличного поля
Недостатки: выводит только те колонки, которые связаны с данными.
Форму можно нарисовать самостоятельно при необходимости.

```1c
    Функция ТабличноеПолеВТабличныйДокумент(ТабличноеПоле)

    ТабДокумент = Новый ТабличныйДокумент;

    ГраницаСлева = ?(ТабличноеПоле.ВертикальныеЛинии , Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная, 1), Неопределено);
    ГраницаСправа = ?(ТабличноеПоле.ВертикальныеЛинии , Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная, 1), Неопределено);
    ГраницаСверху = ?(ТабличноеПоле.ГоризонтальныеЛинии, Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная, 1), Неопределено);
    ГраницаСнизу = ?(ТабличноеПоле.ГоризонтальныеЛинии, Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная, 1), Неопределено);

    НомерСтроки = 0;

    Для Каждого Колонка Из ТабличноеПоле.Колонки Цикл

    Если Колонка.Данные = " Тогда
    Продолжить;
    КонецЕсли;

    ИндексКолонки = ТабличноеПоле.Колонки.Индекс(Колонка);
    КолонкаТабличногоПоля = ТабДокумент.Область(, ИндексКолонки+1, , ИндексКолонки+1);
    КолонкаТабличногоПоля.ШиринаКолонки = Колонка.Ширина;

    КонецЦикла;

    Если ТабличноеПоле.Шапка Тогда

    НомерСтроки = НомерСтроки + 1;
    Для Каждого Колонка Из ТабличноеПоле.Колонки Цикл

    Если Колонка.Данные = " Тогда
    Продолжить;
    КонецЕсли;

    ИндексКолонки = ТабличноеПоле.Колонки.Индекс(Колонка);
    ОбластьЯчейки = ТабДокумент.Область(НомерСтроки, ИндексКолонки+1, НомерСтроки, ИндексКолонки+1);
    ОбластьЯчейки.Текст = Колонка.ТекстШапки;
    ОбластьЯчейки.ЦветФона = ?(Колонка.ЦветФонаШапки.Вид = ВидЦвета.АвтоЦвет, ЦветаСтиля.ЦветФонаКнопки, Колонка.ЦветФонаШапки);
    ОбластьЯчейки.ЦветРамки = ?(ТабличноеПоле.ЦветРамки.Вид = ВидЦвета.АвтоЦвет, ЦветаСтиля.ЦветРамки, ТабличноеПоле.ЦветРамки);
    ОбластьЯчейки.Шрифт = Колонка.ШрифтШапки;
    ОбластьЯчейки.ГоризонтальноеПоложение = Колонка.ГоризонтальноеПоложениеВШапке;
    ОбластьЯчейки.Обвести(ГраницаСлева, ГраницаСверху, ГраницаСправа, ГраницаСнизу);

    КонецЦикла;

    КонецЕсли;

    Построитель = Новый ПостроительЗапроса;
    Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабличноеПоле.Значение);
    Для Каждого ЭлементОтбораИсточник Из ТабличноеПоле.ОтборСтрок Цикл
    Если ЭлементОтбораИсточник.Использование = Ложь Тогда
    Продолжить;
    КонецЕсли;
    ЭлементОтбораПриемник = Построитель.Отбор.Добавить(ЭлементОтбораИсточник.ПутьКДанным);
    ЭлементОтбораПриемник.Использование = ЭлементОтбораИсточник.Использование;
    ЭлементОтбораПриемник.ВидСравнения = ЭлементОтбораИсточник.ВидСравнения;
    ЭлементОтбораПриемник.Значение = ЭлементОтбораИсточник.Значение;
    ЭлементОтбораПриемник.ЗначениеС = ЭлементОтбораИсточник.ЗначениеС;
    ЭлементОтбораПриемник.ЗначениеПо = ЭлементОтбораИсточник.ЗначениеПо;
    КонецЦикла;
    Построитель.Выполнить();

    Результат = Построитель.Результат;
    Выборка = Результат.Выбрать();

    Пока Выборка.Следующий() Цикл

    НомерСтроки = НомерСтроки + 1;

    Для Каждого Колонка Из ТабличноеПоле.Колонки Цикл

    Если Колонка.Данные = " Тогда
    Продолжить;
    КонецЕсли;

    ИндексКолонки = ТабличноеПоле.Колонки.Индекс(Колонка);
    ОбластьЯчейки = ТабДокумент.Область(НомерСтроки, ИндексКолонки+1, НомерСтроки, ИндексКолонки+1);
    ОбластьЯчейки.ЦветФона = ?(Колонка.ЦветФонаПоля.Вид = ВидЦвета.АвтоЦвет, ЦветаСтиля.ЦветФонаПоля, Колонка.ЦветФонаПоля);
    ОбластьЯчейки.ЦветРамки = ?(ТабличноеПоле.ЦветРамки.Вид = ВидЦвета.АвтоЦвет, ЦветаСтиля.ЦветРамки, ТабличноеПоле.ЦветРамки);
    ОбластьЯчейки.Шрифт = Колонка.ШрифтТекста;
    ОбластьЯчейки.ГоризонтальноеПоложение = Колонка.ГоризонтальноеПоложениеВКолонке;
    ОбластьЯчейки.Обвести(ГраницаСлева, ГраницаСверху, ГраницаСправа, ГраницаСнизу);

    ФорматнаяСтрока = ";
    ЗначениеЯчейки = Выборка[Колонка.Данные];
    ТипКолонки = Результат.Колонки[Колонка.Данные].ТипЗначения;

    Если ТипЗнч(ЗначениеЯчейки) = Тип("Число") Тогда
    КвалификаторыЧисла = ТипКолонки.КвалификаторыЧисла;
    ФорматнаяСтрока = "ЧЦ=" + КвалификаторыЧисла.Разрядность + "; ЧДЦ=" + КвалификаторыЧисла.РазрядностьДробнойЧасти;
    ИначеЕсли ТипЗнч(ЗначениеЯчейки) = Тип("Дата") Тогда
    КвалификаторыДаты = ТипКолонки.КвалификаторыДаты;
    Если КвалификаторыДаты.ЧастиДаты = ЧастиДаты.Дата Тогда
    ФорматнаяСтрока = "ДФ=dd.MM.yyyy";
    ИначеЕсли КвалификаторыДаты.ЧастиДаты = ЧастиДаты.Время Тогда
    ФорматнаяСтрока = "ДФ=HH:mm:ss";
    КонецЕсли;
    КонецЕсли;

    Если ЗначениеЗаполнено(ФорматнаяСтрока) Тогда
    ОбластьЯчейки.Текст = Формат(ЗначениеЯчейки, ФорматнаяСтрока);
    ИНаче
    ОбластьЯчейки.Текст = ЗначениеЯчейки;
    КонецЕсли;

    КонецЦикла;

    КонецЦикла;

    Если ТабличноеПоле.Подвал Тогда

    НомерСтроки = НомерСтроки + 1;
    Для Каждого Колонка Из ТабличноеПоле.Колонки Цикл

    Если Колонка.Данные = " Тогда
    Продолжить;
    КонецЕсли;

    ИндексКолонки = ТабличноеПоле.Колонки.Индекс(Колонка);
    ОбластьЯчейки = ТабДокумент.Область(НомерСтроки, ИндексКолонки+1, НомерСтроки, ИндексКолонки+1);
    ОбластьЯчейки.Текст = Колонка.ТекстПодвала;
    ОбластьЯчейки.ЦветФона = ?(Колонка.ЦветФонаШапки.Вид = ВидЦвета.АвтоЦвет, ЦветаСтиля.ЦветФонаКнопки, Колонка.ЦветФонаПодвала);
    ОбластьЯчейки.ЦветРамки = ?(ТабличноеПоле.ЦветРамки.Вид = ВидЦвета.АвтоЦвет, ЦветаСтиля.ЦветРамки, ТабличноеПоле.ЦветРамки);
    ОбластьЯчейки.Шрифт = Колонка.ШрифтПодвала;
    ОбластьЯчейки.ГоризонтальноеПоложение = Колонка.ГоризонтальноеПоложениеВПодвале;
    ОбластьЯчейки.Обвести(ГраницаСлева, ГраницаСверху, ГраницаСправа, ГраницаСнизу);

    КонецЦикла;

    КонецЕсли;

    Возврат ТабДокумент;

    КонецФункции
```
---
```1c
    Построитель=Новый ПостроительОтчета;
    Построитель.ИсточникДанных=Новый ОписаниеИсточникаДанных(ТаблицаЗначений);
    ТабДокумент = Новый ТабличныйДокумент;;
    Построитель.Вывести(ТабДокумент);
    ТабДокумент.Показать();
```
---
а разве в таблице значений хранится цвет? Он только у элементы формы, содержащего таблицу значений. но спасибо за наводку, попробую.
---
fixin, О каком цвете речь вообще?
---
Он хочет получить раскрашенный MXL в точности такой же, как раскрашенный список чего-то.
---
именно. я хочу получить такой же MXL, какой получаю, когда щелкая ПМК на таблице и выбираю "Вывести список". Может у кого готовая функция есть, так влом писать азы...
---
В таблице значений добавить колонку "ЦветСтроки"
В табличном поле при выводе строки использовать данную ячейку используя свойство "ОформлениеСтроки"
---
твой ответ не в кассу, совсем не в тему
---
вот так наверное
---
что за файл? не открывается в 1С. всего 12 Кб. можешь код вытащить из него? и текстом сюда?
Хотя нет. посмотрел. Но это не решение.
Вы решили задачу только для цвета. А как быть с шириной и расположением колонок (они могут идти друг над другом и т.п.).
Я хочу просто программно повторить результат вывода по ПКМ.
---
http://infostart.ru/public/152133/
---
вау, в понедельник проверю, если это работает, вы получите обещаные деньги за наводку.
---
taiba, косячок:

Поправил код, там использовались неуниверсальные функции и вынес код по раскраске в отдельную функцию.
Модуль выглядит так:

```1c
    // Обработка максимально повторяет работу опции "Вывести список" контекстного меню табличной части.
    // Еще есть проблемы со стилями, которые в текущей редакции решать лень.
    // Автор: Виктор Клевцов; taiba@mail.ru

    Процедура ДействияФормыЗаполнить(Кнопка)
    ЭлементыФормы.Выставки.Видимость = Ложь;

    ГСЧ = Новый ГенераторСлучайныхЧисел(132);
    // заполним таблицу чем-нибудь
    Выставки.Очистить();
    Для к = 1 По 10 Цикл

    Строка = Выставки.Добавить();
    Для Каждого Колонка из ЭлементыФормы.Выставки.Колонки Цикл
    Если Колонка.Видимость и Колонка.Имя <> "НомерСтроки" Тогда
    Строка[Колонка.Имя] = ГСЧ.СлучайноеЧисло(132165, 6562162);
    Строка[Колонка.Имя+"Цвет"] = ЗначениеВСтрокуВнутр(Новый Цвет(ГСЧ.СлучайноеЧисло(0, 255), ГСЧ.СлучайноеЧисло(0, 255), ГСЧ.СлучайноеЧисло(0, 255)));
    КонецЕсли;
    КонецЦикла;
    КонецЦикла;
    ЭлементыФормы.Выставки.Видимость = Истина;
    КонецПроцедуры

    Процедура ВыставкиПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
    Для Каждого Колонка из ЭлементыФормы.Выставки.Колонки Цикл
    Если Колонка.Видимость Тогда
    Попытка
    Цвет = ЗначениеИзСтрокиВнутр(ДанныеСтроки[Колонка.Имя+"Цвет"])
    Исключение
    Цвет = Неопределено
    КонецПопытки;
    Если Не Цвет = Неопределено Тогда
    ОформлениеСтроки.Ячейки[Колонка.Имя].ЦветФона = Цвет;
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    КонецПроцедуры

    Процедура КоманднаяПанель1ВывестиСписок(Кнопка)
    ТабДокумент = ВывестиСписок(ЭлементыФормы.Выставки);
    ТабДокумент.Показать();
    КонецПроцедуры

    //=== НАЧАЛО ДЛЯ ВСТАВКИ В КОД ===

    Функция ВывестиСписок(ТЗНаФорме) Экспорт
    Перем ТабДокумент, масКолонки, ШагНомерСтроки, МаксШирина, тзБлоков;
    Перем сткПараметрыШапки, ЛинияШапки, сткПараметрыПодвала, НомерСтроки;
    Перем Колонка, СтартПоГоризонтали, СтартПоВертикали, ФинишПоГоризонтали, ФинишПоВертикали, Координата, Ячейка;
    Перем ЛинияГор, ЛинияВер, СтрокаИ, ОформлениеСтроки, ЦветТекстаСтроки, ЦветФонаСтроки, ШрифтСтроки;
    Перем ОформлениеЯчейки, ЦветТекстаЯчейки, ЦветФонаЯчейки, ШрифтЯчейки;

    ТабДокумент = Новый ТабличныйДокумент;

    // параметры колонок
    масКолонки = Новый Массив;
    Для Каждого Колонка из ТЗНаФорме.Колонки Цикл
    Если Колонка.Видимость Тогда
    масКолонки.Добавить(Колонка);
    КонецЕсли;
    КонецЦикла;
    ШагНомерСтроки = 0;
    МаксШирина = 0;
    тзБлоков = ПолучитьТЗБлоков(масКолонки, ШагНомерСтроки, МаксШирина);

    // параметры шапки
    сткПараметрыШапки = ПолучитьПараметрыШапки(ТЗНаФорме);
    ЛинияШапки = сткПараметрыШапки.ЛинияШапки;

    НомерСтроки = 1;
    Если сткПараметрыШапки.ВыводитьШапку Тогда
    Для Каждого СтрокаБлока из тзБлоков Цикл
    Колонка = СтрокаБлока.Колонка;
    //Координаты
    СтартПоГоризонтали = 1 + (СтрокаБлока.НомерБлока-1)*МаксШирина + (СтрокаБлока.НомерКолонки-1)*СтрокаБлока.ШиринаКолонки;
    СтартПоВертикали = НомерСтроки + (СтрокаБлока.НомерСтроки-1);
    ФинишПоГоризонтали = СтартПоГоризонтали + СтрокаБлока.ШиринаКолонки - 1;
    ФинишПоВертикали = СтартПоВертикали + СтрокаБлока.ВысотаСтроки - 1;
    Координата = "R"+СтартПоВертикали+"C"+СтартПоГоризонтали+":R"+ФинишПоВертикали+"C"+ФинишПоГоризонтали;

    Ячейка = ТабДокумент.Область(Координата);
    Ячейка.Объединить();
    Ячейка.ЦветТекста = сткПараметрыШапки.ЦветТекстаШапки;
    Ячейка.ЦветФона = сткПараметрыШапки.ЦветФонаШапки;
    Ячейка.Шрифт = сткПараметрыШапки.ШрифтШапки;
    Ячейка.Обвести(ЛинияШапки, ЛинияШапки, ЛинияШапки, ЛинияШапки);
    Ячейка.ВертикальноеПоложение = ВертикальноеПоложение.Верх;
    Ячейка.ГоризонтальноеПоложение = Колонка.ГоризонтальноеПоложениеВШапке;
    Ячейка.ШиринаКолонки = Колонка.Ширина;
    Ячейка.Текст = Колонка.ТекстШапки;

    Сообщить("+Координата+" "+Ячейка.Текст);
    КонецЦикла;

    НомерСтроки = НомерСтроки + ШагНомерСтроки;
    КонецЕсли;

    // Строки
    ЛинияГор = Неопределено;
    ЛинияВер = Неопределено;
    ПолучитьЛинииТаблицы(ТЗНаФорме, ЛинияГор, ЛинияВер);

    Для Каждого СтрокаИ из Выставки Цикл
    ОформлениеСтроки = ТЗНаФорме.ОформлениеСтроки(СтрокаИ);
    Если ОформлениеСтроки.ЦветТекста.Вид = ВидЦвета.АвтоЦвет Тогда
    ЦветТекстаСтроки = ЦветаСтиля.ЦветТекстаФормы
    Иначе
    ЦветТекстаСтроки = ОформлениеСтроки.ЦветТекста
    КонецЕсли;
    Если ОформлениеСтроки.ЦветФона.Вид = ВидЦвета.АвтоЦвет Тогда
    ЦветФонаСтроки = ЦветаСтиля.ЦветФонаПоля
    Иначе
    ЦветФонаСтроки = ОформлениеСтроки.ЦветФона
    КонецЕсли;
    Если ОформлениеСтроки.Шрифт.Вид = ВидШрифта.АвтоШрифт Тогда
    ШрифтСтроки = Неопределено
    Иначе
    ШрифтСтроки = ОформлениеСтроки.Шрифт
    КонецЕсли;

    Для Каждого СтрокаБлока из тзБлоков Цикл
    Колонка = СтрокаБлока.Колонка;
    //Координаты
    СтартПоГоризонтали = 1 + (СтрокаБлока.НомерБлока-1)*МаксШирина + (СтрокаБлока.НомерКолонки-1)*СтрокаБлока.ШиринаКолонки;
    СтартПоВертикали = НомерСтроки + (СтрокаБлока.НомерСтроки-1);
    ФинишПоГоризонтали = СтартПоГоризонтали + СтрокаБлока.ШиринаКолонки - 1;
    ФинишПоВертикали = СтартПоВертикали + СтрокаБлока.ВысотаСтроки - 1;
    Координата = "R"+СтартПоВертикали+"C"+СтартПоГоризонтали+":R"+ФинишПоВертикали+"C"+ФинишПоГоризонтали;

    Ячейка = ТабДокумент.Область(Координата);
    Ячейка.Объединить();

    ОформлениеЯчейки = ОформлениеСтроки.Ячейки[Колонка.Имя];
    Если ОформлениеЯчейки.ЦветТекста.Вид = ВидЦвета.АвтоЦвет Тогда
    ЦветТекстаЯчейки = ЦветаСтиля.ЦветТекстаФормы
    Иначе
    ЦветТекстаЯчейки = ОформлениеЯчейки.ЦветТекста
    КонецЕсли;
    Если ОформлениеЯчейки.ЦветФона.Вид = ВидЦвета.АвтоЦвет Тогда
    ЦветФонаЯчейки = ЦветаСтиля.ЦветФонаПоля
    Иначе
    ЦветФонаЯчейки = ОформлениеЯчейки.ЦветФона
    КонецЕсли;
    Если ОформлениеЯчейки.Шрифт.Вид = ВидШрифта.АвтоШрифт Тогда
    ШрифтЯчейки = Неопределено
    Иначе
    ШрифтЯчейки = ОформлениеЯчейки.Шрифт
    КонецЕсли;

    Ячейка.ЦветТекста = ЦветТекстаЯчейки;
    Ячейка.ЦветФона = ЦветФонаЯчейки;
    Ячейка.Шрифт = ШрифтЯчейки;
    Ячейка.Обвести(ЛинияВер, ЛинияГор, ЛинияВер, ЛинияГор);
    Ячейка.ВертикальноеПоложение = ВертикальноеПоложение.Верх;
    Ячейка.ГоризонтальноеПоложение = Колонка.ГоризонтальноеПоложениеВКолонке;
    Ячейка.ШиринаКолонки = Колонка.Ширина;
    Ячейка.Текст = СтрокаИ[Колонка.Имя];

    КонецЦикла;

    НомерСтроки = НомерСтроки + ШагНомерСтроки;
    КонецЦикла;

    // подвал
    // параметры подвала
    сткПараметрыПодвала = ПолучитьПараметрыПодвала(ТЗНаФорме);

    Если сткПараметрыПодвала.ВыводитьПодвал Тогда

    Для Каждого СтрокаБлока из тзБлоков Цикл
    Колонка = СтрокаБлока.Колонка;
    //Координаты
    СтартПоГоризонтали = 1 + (СтрокаБлока.НомерБлока-1)*МаксШирина + (СтрокаБлока.НомерКолонки-1)*СтрокаБлока.ШиринаКолонки;
    СтартПоВертикали = НомерСтроки + (СтрокаБлока.НомерСтроки-1);
    ФинишПоГоризонтали = СтартПоГоризонтали + СтрокаБлока.ШиринаКолонки - 1;
    ФинишПоВертикали = СтартПоВертикали + СтрокаБлока.ВысотаСтроки - 1;
    Координата = "R"+СтартПоВертикали+"C"+СтартПоГоризонтали+":R"+ФинишПоВертикали+"C"+ФинишПоГоризонтали;

    Ячейка = ТабДокумент.Область(Координата);
    Ячейка.Объединить();

    Ячейка.ЦветТекста = сткПараметрыПодвала.ЦветТекстаПодвала;
    Ячейка.ЦветФона = сткПараметрыПодвала.ЦветФонаПодвала;
    Ячейка.Шрифт = сткПараметрыПодвала.ШрифтПодвала;
    Ячейка.Обвести(ЛинияШапки, ЛинияШапки, ЛинияШапки, ЛинияШапки);
    Ячейка.ВертикальноеПоложение = ВертикальноеПоложение.Верх;
    Ячейка.ГоризонтальноеПоложение = Колонка.ГоризонтальноеПоложениеВПодвале;
    Ячейка.ШиринаКолонки = Колонка.Ширина;
    Ячейка.Текст = Колонка.ТекстПодвала;
    КонецЦикла;
    КонецЕсли;

    Возврат ТабДокумент;
    КонецФункции

    Процедура ПолучитьЛинииТаблицы(ТабличноеПоле, ЛинияГор, ЛинияВер)
    Если ТабличноеПоле.Рамка.Вид = ВидРамки.ЭлементСтиля Тогда
    Толщина = РамкиСтиля.РамкаЭлементаУправления.Толщина;
    ТипЛинии = РамкиСтиля.РамкаЭлементаУправления.ТипРамки;
    Иначе
    Толщина = ТабличноеПоле.Рамка.Толщина;
    ТипЛинии = ТабличноеПоле.Рамка.ТипРамки;
    КонецЕсли;

    Если ТипЛинии = Неопределено Тогда
    ТипЛинии = ТипЛинииЯчейкиТабличногоДокумента.Сплошная;
    Толщина = 1;
    КонецЕсли;

    Если ТабличноеПоле.ГоризонтальныеЛинии Тогда
    ЛинияГор = Новый Линия(ТипЛинии, Толщина);
    Иначе
    ЛинияГор = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.НетЛинии, -1);
    КонецЕсли;

    Если ТабличноеПоле.ВертикальныеЛинии Тогда
    ЛинияВер = Новый Линия(ТипЛинии, Толщина);
    Иначе
    ЛинияВер = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.НетЛинии, -1);
    КонецЕсли;
    КонецПроцедуры

    Функция ПолучитьПараметрыШапки(ТабличноеПоле)
    сткПараметрыШапки = Новый Структура("ВыводитьШапку, ЦветТекстаШапки, ЦветФонаШапки, ВысотаШапки, ШрифтШапки, ЛинияШапки");

    сткПараметрыШапки.ВыводитьШапку = ТабличноеПоле.Шапка;

    Если сткПараметрыШапки.ВыводитьШапку Тогда
    сткПараметрыШапки.ЦветТекстаШапки = ТабличноеПоле.ЦветТекстаШапки;
    Если Строка(сткПараметрыШапки.ЦветТекстаШапки) = "Авто" Тогда
    сткПараметрыШапки.ЦветТекстаШапки = ЦветаСтиля.ЦветТекстаФормы
    КонецЕсли;

    сткПараметрыШапки.ЦветФонаШапки = ТабличноеПоле.ЦветФонаШапки;
    Если Строка(сткПараметрыШапки.ЦветФонаШапки) = "Авто" Тогда
    сткПараметрыШапки.ЦветФонаШапки = ЦветаСтиля.ЦветФонаКнопки
    КонецЕсли;

    сткПараметрыШапки.ВысотаШапки = ТабличноеПоле.ВысотаШапки; // в строках

    сткПараметрыШапки.ШрифтШапки = ТабличноеПоле.ШрифтШапки; //WindowsШрифты.ШрифтДиалоговИМеню;

    сткПараметрыШапки.ЛинияШапки = Новый Линия(ТипЛинииРисункаТабличногоДокумента.Сплошная, 1);
    КонецЕсли;

    Возврат сткПараметрыШапки;
    КонецФункции

    Функция ПолучитьПараметрыПодвала(ТабличноеПоле)
    сткПараметрыПодвала = Новый Структура("ВыводитьПодвал, ЦветТекстаПодвала, ЦветФонаПодвала, ВысотаПодвала, ШрифтПодвала");
    сткПараметрыПодвала.ВыводитьПодвал = ТабличноеПоле.Подвал;

    Если сткПараметрыПодвала.ВыводитьПодвал Тогда
    сткПараметрыПодвала.ЦветТекстаПодвала = ТабличноеПоле.ЦветТекстаПодвала;
    Если Строка(сткПараметрыПодвала.ЦветТекстаПодвала) = "Авто" Тогда
    сткПараметрыПодвала.ЦветТекстаПодвала = ЦветаСтиля.ЦветТекстаФормы
    КонецЕсли;

    сткПараметрыПодвала.ЦветФонаПодвала = ТабличноеПоле.ЦветФонаПодвала;
    Если Строка(сткПараметрыПодвала.ЦветФонаПодвала) = "Авто" Тогда
    сткПараметрыПодвала.ЦветФонаПодвала = ЦветаСтиля.ЦветФонаКнопки
    КонецЕсли;

    сткПараметрыПодвала.ВысотаПодвала = ТабличноеПоле.ВысотаПодвала; // в строках

    сткПараметрыПодвала.ШрифтПодвала = ТабличноеПоле.ШрифтПодвала; //WindowsШрифты.ШрифтДиалоговИМеню;

    //ЛинияШапки = Новый Линия(ТипЛинииРисункаТабличногоДокумента.Сплошная, 1);
    КонецЕсли;

    Возврат сткПараметрыПодвала;
    КонецФункции

    Функция ПолучитьОписаниеТиповЦелогоЧисла() Экспорт
    Возврат Новый ОписаниеТипов("Число");
    КонецФункции

    Функция ПолучитьТЗБлоков(масКолонок, МаксНомерСтроки, МаксШирина)
    Перем КоличествоБлоков;
    Перем ТЗ, НомерБлока, НомерСтроки, НомерКолонки;
    Перем Колонка, НС;
    Перем Запрос, Рез;
    Перем ТабСтрок, СтрокаСтрок, ОсталосьРаспределить, СтрокиТЗ, СтрокаТЗ;
    Перем СтрокиБлока, СтрокаБлока, табКолонок, Произведение, ШиринаКолонки;

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

    НС = тз.Добавить();
    НС.Колонка = Колонка;
    НС.НомерБлока = НомерБлока;
    НС.НомерСтроки = НомерСтроки;
    НС.НомерКолонки = НомерКолонки;
    КонецЦикла;

    //тз.ВыбратьСтроку();

    Запрос = Новый Запрос(
    "ВЫБРАТЬ
    | ИсхТЗ.НомерБлока,
    | ИсхТЗ.НомерСтроки,
    | ИсхТЗ.НомерКолонки
    |ПОМЕСТИТЬ врТЗ
    |ИЗ
    | &тз КАК ИсхТЗ
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ ПЕРВЫЕ 1
    | врТЗ.НомерСтроки КАК МаксНомерСтроки
    |ИЗ
    | врТЗ КАК врТЗ
    |
    |УПОРЯДОЧИТЬ ПО
    | МаксНомерСтроки УБЫВ
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | врТЗ.НомерБлока,
    | МАКСИМУМ(врТЗ1.НомерСтроки) КАК ЧислоСтрокВБлоке
    |ИЗ
    | врТЗ КАК врТЗ
    | ЛЕВОЕ СОЕДИНЕНИЕ врТЗ КАК врТЗ1
    | ПО врТЗ.НомерБлока = врТЗ1.НомерБлока
    |
    |СГРУППИРОВАТЬ ПО
    | врТЗ.НомерБлока
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | врТЗ.НомерБлока КАК НомерБлока,
    | врТЗ.НомерСтроки КАК НомерСтроки,
    | МАКСИМУМ(врТЗ1.НомерКолонки) КАК МаксНомерКолонки
    |ИЗ
    | врТЗ КАК врТЗ
    | ЛЕВОЕ СОЕДИНЕНИЕ врТЗ КАК врТЗ1
    | ПО врТЗ.НомерБлока = врТЗ1.НомерБлока
    | И врТЗ.НомерСтроки = врТЗ1.НомерСтроки
    |
    |СГРУППИРОВАТЬ ПО
    | врТЗ.НомерБлока,
    | врТЗ.НомерСтроки
    |
    |УПОРЯДОЧИТЬ ПО
    | НомерБлока,
    | НомерСтроки
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ ПЕРВЫЕ 1
    | врТЗ.НомерБлока КАК КоличествоБлоков
    |ИЗ
    | врТЗ КАК врТЗ
    |
    |УПОРЯДОЧИТЬ ПО
    | НомерБлока УБЫВ
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |УНИЧТОЖИТЬ врТЗ"
    );
    Запрос.УстановитьПараметр("тз", тз);
    Рез = Запрос.ВыполнитьПакет();

    КоличествоБлоков = Рез[4].Выгрузить()[0].КоличествоБлоков;

    МаксНомерСтроки = Рез[1].Выгрузить()[0].МаксНомерСтроки;
    //Сообщить("МаксНомерСтроки "+МаксНомерСтроки);

    ТабСтрок = Рез[2].Выгрузить();
    //ТабСтрок.ВыбратьСтроку("Макс строк блока");
    Для Каждого СтрокаСтрок из ТабСтрок Цикл // Блоки
    ОсталосьРаспределить = МаксНомерСтроки;
    Для НомерСтроки = 1 по СтрокаСтрок.ЧислоСтрокВБлоке Цикл
    СтрокиТЗ = тз.НайтиСтроки(Новый Структура("НомерБлока,НомерСтроки", СтрокаСтрок.НомерБлока, НомерСтроки));
    Для Каждого СтрокаТЗ из СтрокиТЗ Цикл
    СтрокаТЗ.ВысотаСтроки = 1;
    КонецЦикла;
    ОсталосьРаспределить = ОсталосьРаспределить - 1;
    КонецЦикла;
    // последней навесим весь остаток
    Если ОсталосьРаспределить <> 0 Тогда
    ОсталосьРаспределить = ОсталосьРаспределить + 1;
    СтрокиТЗ = тз.НайтиСтроки(Новый Структура("НомерБлока,НомерСтроки", СтрокаСтрок.НомерБлока, НомерСтроки-1));
    Для Каждого СтрокаТЗ из СтрокиТЗ Цикл
    СтрокаТЗ.ВысотаСтроки = ОсталосьРаспределить;
    КонецЦикла;
    КонецЕсли;
    КонецЦикла;

    // Ширина колонки по Макс колонок блока
    МаксШирина = 0;

    табКолонок = Рез[3].Выгрузить();
    //табКолонок.ВыбратьСтроку("Макс колонок блока");
    Для НомерБлока=1 по КоличествоБлоков Цикл
    Произведение = 1;
    СтрокиБлока = табКолонок.НайтиСтроки(Новый Структура("НомерБлока", НомерБлока));
    Для Каждого СтрокаБлока из СтрокиБлока Цикл
    Произведение = Произведение * СтрокаБлока.МаксНомерКолонки
    КонецЦикла;
    // Получили Произведение - теперь вычислим ширину
    Для Каждого СтрокаБлока из СтрокиБлока Цикл
    СтрокиТЗ = тз.НайтиСтроки(Новый Структура("НомерБлока,НомерСтроки", НомерБлока, СтрокаБлока.НомерСтроки));
    ШиринаКолонки = Произведение / СтрокаБлока.МаксНомерКолонки;
    Для Каждого СтрокаТЗ из СтрокиТЗ Цикл
    СтрокаТЗ.ШиринаКолонки = ШиринаКолонки;
    КонецЦикла;

    МаксШирина = Макс(МаксШирина, ШиринаКолонки);
    КонецЦикла;
    КонецЦикла;

    //тз.ВыбратьСтроку("тз с длинами");

    Возврат тз;
    КонецФункции

    //=== КОНЕЦ ДЛЯ ВСТАВКИ В КОД ===

    ДействияФормыЗаполнить(Неопределено);
```
---
fixin, Да, увлёкся я под вечер :)

а так?
---
такое прокатит)))

```1c
    мТабДок = Новый ТабличныйДокумент;
    Линия = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная, 1);
    мСтрЯч = 1;
    мКолЯч = 0;
    Для Каждого мКол Из ЭлементыФормы.Услуги.Колонки Цикл
    Если мКол.Видимость Тогда
    мКолЯч = мКолЯч + 1;
    мОб = мТабДок.Область(мСтрЯч, мКолЯч);
    мОб.Текст = мКол.ТекстШапки;
    мОб.ЦветТекста = WindowsЦвета.ТекстКнопки;
    мОб.ЦветФона = WindowsЦвета.Кнопка;
    мОб.Обвести(Линия, Линия, Линия, Линия);
    мОб.ШиринаКолонки = мКол.Ширина;
    КонецЕсли;
    КонецЦикла;
    Для Каждого мСтр Из ЭлементыФормы.Услуги.Значение Цикл
    мСтрЯч = мСтрЯч + 1;
    мОф = ЭлементыФормы.Услуги.ОформлениеСтроки(мСтр);
    мКолЯч = 0;
    Для Каждого мКол Из ЭлементыФормы.Услуги.Колонки Цикл
    Если мКол.Видимость Тогда
    мКолЯч = мКолЯч + 1;
    мЯч = мОф.Ячейки.Найти(мКол.Имя);
    мОб = мТабДок.Область(мСтрЯч, мКолЯч);
    мОб.Текст = мЯч.Текст;
    мОб.ЦветТекста = мЯч.ЦветТекста;
    мОб.ЦветФона = мЯч.ЦветФона;
    мОб.Обвести(Линия, Линия, Линия, Линия);
    КонецЕсли;
    КонецЦикла;
    КонецЦикла;
    мТабДок.Показать("Вывод");
```
---
m-serg74, ваш код лаконичнее, хотя тоже не работает с многоэтажными списками.
Я его тоже поправил для использования в функции.

```1c
    Функция ВывестиСписок2(ТЗНаФорме) Экспорт
    мТабДок = Новый ТабличныйДокумент;
    Линия = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная, 1);
    мСтрЯч = 1;
    мКолЯч = 0;
    Для Каждого мКол Из ТЗНаФорме.Колонки Цикл
    Если мКол.Видимость Тогда
    мКолЯч = мКолЯч + 1;
    мОб = мТабДок.Область(мСтрЯч, мКолЯч);
    мОб.Текст = мКол.ТекстШапки;
    мОб.ЦветТекста = WindowsЦвета.ТекстКнопки;
    мОб.ЦветФона = WindowsЦвета.Кнопка;
    мОб.Обвести(Линия, Линия, Линия, Линия);
    мОб.ШиринаКолонки = мКол.Ширина;
    КонецЕсли;
    КонецЦикла;
    Для Каждого мСтр Из ТЗНаФорме.Значение Цикл
    мСтрЯч = мСтрЯч + 1;
    мОф = ТЗНаФорме.ОформлениеСтроки(мСтр);
    мКолЯч = 0;
    Для Каждого мКол Из ТЗНаФорме.Колонки Цикл
    Если мКол.Видимость Тогда
    мКолЯч = мКолЯч + 1;
    мЯч = мОф.Ячейки.Найти(мКол.Имя);
    мОб = мТабДок.Область(мСтрЯч, мКолЯч);
    мОб.Текст = мЯч.Текст;
    мОб.ЦветТекста = мЯч.ЦветТекста;
    мОб.ЦветФона = мЯч.ЦветФона;
    мОб.Обвести(Линия, Линия, Линия, Линия);
    КонецЕсли;
    КонецЦикла;
    КонецЦикла;
    Возврат мТабДок;
    КонецФункции
```

Я взял ваш код, т.к. он проще и быстрее, но отдам деньги тому, кто сделает нормальный вывод многострочных списков.

Думаю, нужна таблица значений, где по номеру колонки выдается ее коордитана Х и Y в полученной шапке
Достаточно в начале рассчитать эту таблицу и затем уже при выводе колонки позиционировать в нужную ячейку со сдвигом по Х по горизонтали и по Y по вертикали.
---
fixin,
Сергей, давно бы сами написали :)
И не жмитесь, увеличьте вознаграждение минимум вдвое - taiba только ради вас выложил интересную обработку.
---
могу и увеличить. Но код таибы какой-то усложненный, еще и запросы зачем-то. у М-серга более лаконично и быстрее шуршит.
---
fixin, у меня тоже было лаконичнее, пока не стал этажерки строить.
Запросы можно соптимизировать, так как сейчас там по кусочкам решаются задачи по мере всплывания. Там лишь рассчитываюся параметры блоков колонок таблицы - высоты, ширины и прочее.
---
короче, у меня к счастью, не многострочные таблицы. Таиба, я отдаю тебе деньги, но я бы разделил их между тобой и м-серг74. Если можешь, переведи ему треть бабок.
Потому что я все же взял его вариант. Он быстрый и безотказный как калашников. Я посомтрел твой код, там имхо все сложно.
Для того чтобы посчитать смещения не нужна такая гора кода, да и таблица не нужна.
У тебя есть массив колонок, пусть 20 колонок например. Для каждой колонки ты вычисляешь координату Х и Y + ее ширину. Все.
Можно и таблицей из трех колонок. Но не более.
Короче, я свою проблем решил, желаю на досуге оптимизировать код и сделать его все же как рекомендовал в виде изолированной функции (одной или нескольких), чтобы ее можно было выщемить из кода.
ПОследний вариант не смотрел, надеюсь ты его тестировал. Мне хватило кода серг-74.
---
fixin, хм. аж интересно стало разобрать.

код можно разделить на 3 логических блока:
1. получение оформления
2. получение таблицы блоков колонок
3. вывод

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

2. таблица блоков - размеры колонок нужно вычислять для каждого блока колонок. под блоком понимается вертикальная группировка нескольких колонок (до достижения конца или до колонки с Положение.НоваяКолонка). Это делает первый цикл в ПолучитьТЗБлоков.

Далее запросами я выбрал параметры блоков:
МаксНомерСтроки для расчета высоты блока (первые строки идут высотой 1, а последняя занимает весь остаток до МаксНомерСтроки);
таблица с числом строк в каждом блоке
таблица с максимальным числом колонок в строке блока
и количество блоков для условий циклов

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

3. Ну и сам вывод. Получаются оформление и таблица колонок, ну и сам вывод по полученным величинам.

Без переноса оформления и разбора блоков модуль выглядел примерно так же, как у м-серг, но в (10) было поставлено условие Вы решили задачу только для цвета. А как быть с шириной и расположением колонок (они могут идти друг над другом и т.п.).

ps: спасибо за вопрос и признание
---
ладно, таиба, лучшее - враг хорошего. Если работает без ошибок, то и ладно. Просто я не очень понял, нафига запрос? ;-)

(23) ну не знаю, у таибы тогда была еще первая багнутая версия (последнюю не проверял еще, наверное поправил он ее), а мне нужно было срочно, взял м-серговскую, подточил буквально пару штрихов и все заработало. Манагеров по крайней мере устроило. Повезло, что табличка была в одну строчку.

Короче, всем спасибо что помогли.

Всем творческих успехов.
---
fixin, круче и пожелать не мог, за Ваш коммент низкий поклон!!! А денег мне реально не надо...
---
fixin, за +1 спасибо,
```1c
    но отдам деньги
```
 а мне они не нужны) я их на работе зарабатываю)))
ЗЫ. с многоэтажными лень заморачиваться было.
---
Всем творческих успехов Тебе тоже успехов!
---
Спасибо огромное Виктору Клевцову, taiba@mail.ru!!!
Заработало с пол оборота))))