Как для таблицы значений в форме программно получить MXL по ПКМ "Вывести список"?

1. fixin 4253 11.09.12 13:13 Сейчас в теме
Чтобы таблицу значений вывести в список и получить ТабличныйДокумент? Причем с цветами.
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
20. taiba 87 17.09.12 15:02 Сейчас в теме
(18) fixin, у меня тоже было лаконичнее, пока не стал этажерки строить.
Запросы можно соптимизировать, так как сейчас там по кусочкам решаются задачи по мере всплывания. Там лишь рассчитываюся параметры блоков колонок таблицы - высоты, ширины и прочее.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
26. manfeese 25.09.17 13:54 Сейчас в теме
(1)
Функция формирует табличный документ из табличного поля
Недостатки: выводит только те колонки, которые связаны с данными.
Форму можно нарисовать самостоятельно при необходимости.

Функция ТабличноеПолеВТабличныйДокумент(ТабличноеПоле)
	
	ТабДокумент   = Новый ТабличныйДокумент;
	
	ГраницаСлева  = ?(ТабличноеПоле.ВертикальныеЛинии  , Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная, 1), Неопределено);
	ГраницаСправа = ?(ТабличноеПоле.ВертикальныеЛинии  , Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная, 1), Неопределено);
	ГраницаСверху = ?(ТабличноеПоле.ГоризонтальныеЛинии, Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная, 1), Неопределено);
	ГраницаСнизу  = ?(ТабличноеПоле.ГоризонтальныеЛинии, Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная, 1), Неопределено);
	
	НомерСтроки = 0;
	
	Для Каждого Колонка Из ТабличноеПоле.Колонки Цикл
		
		Если Колонка.Данные = "" Тогда
			Продолжить;
		КонецЕсли;
		
		ИндексКолонки = ТабличноеПоле.Колонки.Индекс(Колонка);
		КолонкаТабличногоПоля = ТабДокумент.Область(, ИндексКолонки+1, , ИндексКолонки+1);
		КолонкаТабличногоПоля.ШиринаКолонки = Колонка.Ширина;
		
	КонецЦикла;
	
	Если ТабличноеПоле.Шапка Тогда
		
		НомерСтроки = НомерСтроки + 1;
		Для Каждого Колонка Из ТабличноеПоле.Колонки Цикл
			
			Если Колонка.Данные = "" Тогда
				Продолжить;
			КонецЕсли;
			
			ИндексКолонки                         = ТабличноеПоле.Колонки.Индекс(Колонка);
			ОбластьЯчейки                         = ТабДокумент.Область(НомерСтроки, ИндексКолонки+1, НомерСтроки, ИндексКолонки+1);
			ОбластьЯчейки.Текст                   = Колонка.ТекстШапки;
			ОбластьЯчейки.ЦветФона                = ?(Колонка.ЦветФонаШапки.Вид = ВидЦвета.АвтоЦвет, ЦветаСтиля.ЦветФонаКнопки, Колонка.ЦветФонаШапки);
			ОбластьЯчейки.ЦветРамки               = ?(ТабличноеПоле.ЦветРамки.Вид = ВидЦвета.АвтоЦвет, ЦветаСтиля.ЦветРамки, ТабличноеПоле.ЦветРамки);
			ОбластьЯчейки.Шрифт                   = Колонка.ШрифтШапки;
			ОбластьЯчейки.ГоризонтальноеПоложение = Колонка.ГоризонтальноеПоложениеВШапке;
			ОбластьЯчейки.Обвести(ГраницаСлева, ГраницаСверху, ГраницаСправа, ГраницаСнизу);
			
		КонецЦикла;
		
	КонецЕсли;
	
	Построитель = Новый ПостроительЗапроса;
	Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабличноеПоле.Значение);
	Для Каждого ЭлементОтбораИсточник Из ТабличноеПоле.ОтборСтрок Цикл
		Если ЭлементОтбораИсточник.Использование = Ложь Тогда
			Продолжить;
		КонецЕсли;
		ЭлементОтбораПриемник = Построитель.Отбор.Добавить(ЭлементОтбораИсточник.ПутьКДанным);
		ЭлементОтбораПриемник.Использование = ЭлементОтбораИсточник.Использование;
		ЭлементОтбораПриемник.ВидСравнения  = ЭлементОтбораИсточник.ВидСравнения;
		ЭлементОтбораПриемник.Значение      = ЭлементОтбораИсточник.Значение;
		ЭлементОтбораПриемник.ЗначениеС     = ЭлементОтбораИсточник.ЗначениеС;
		ЭлементОтбораПриемник.ЗначениеПо    = ЭлементОтбораИсточник.ЗначениеПо;
	КонецЦикла;
	Построитель.Выполнить();
	
	Результат = Построитель.Результат;
	Выборка   = Результат.Выбрать();
	
	Пока Выборка.Следующий() Цикл
		
		НомерСтроки = НомерСтроки + 1;
		
		Для Каждого Колонка Из ТабличноеПоле.Колонки Цикл
			
			Если Колонка.Данные = "" Тогда
				Продолжить;
			КонецЕсли;
			
			ИндексКолонки                         = ТабличноеПоле.Колонки.Индекс(Колонка);
			ОбластьЯчейки                         = ТабДокумент.Область(НомерСтроки, ИндексКолонки+1, НомерСтроки, ИндексКолонки+1);
			ОбластьЯчейки.ЦветФона                = ?(Колонка.ЦветФонаПоля.Вид = ВидЦвета.АвтоЦвет, ЦветаСтиля.ЦветФонаПоля, Колонка.ЦветФонаПоля);
			ОбластьЯчейки.ЦветРамки               = ?(ТабличноеПоле.ЦветРамки.Вид = ВидЦвета.АвтоЦвет, ЦветаСтиля.ЦветРамки, ТабличноеПоле.ЦветРамки);
			ОбластьЯчейки.Шрифт                   = Колонка.ШрифтТекста;
			ОбластьЯчейки.ГоризонтальноеПоложение = Колонка.ГоризонтальноеПоложениеВКолонке;
			ОбластьЯчейки.Обвести(ГраницаСлева, ГраницаСверху, ГраницаСправа, ГраницаСнизу);
			
			ФорматнаяСтрока = "";
			ЗначениеЯчейки  = Выборка[Колонка.Данные];
			ТипКолонки      = Результат.Колонки[Колонка.Данные].ТипЗначения;
			
			Если ТипЗнч(ЗначениеЯчейки) = Тип("Число") Тогда
				КвалификаторыЧисла  = ТипКолонки.КвалификаторыЧисла;
				ФорматнаяСтрока     = "ЧЦ=" + КвалификаторыЧисла.Разрядность + "; ЧДЦ=" + КвалификаторыЧисла.РазрядностьДробнойЧасти;
			ИначеЕсли ТипЗнч(ЗначениеЯчейки) = Тип("Дата") Тогда
				КвалификаторыДаты = ТипКолонки.КвалификаторыДаты;
				Если КвалификаторыДаты.ЧастиДаты = ЧастиДаты.Дата Тогда
					ФорматнаяСтрока = "ДФ=dd.MM.yyyy";
				ИначеЕсли КвалификаторыДаты.ЧастиДаты = ЧастиДаты.Время Тогда
					ФорматнаяСтрока = "ДФ=HH:mm:ss";
				КонецЕсли;
			КонецЕсли;
			
			Если ЗначениеЗаполнено(ФорматнаяСтрока) Тогда
				ОбластьЯчейки.Текст = Формат(ЗначениеЯчейки, ФорматнаяСтрока);
			ИНаче
				ОбластьЯчейки.Текст = ЗначениеЯчейки;
			КонецЕсли;
			
		КонецЦикла;
		
	КонецЦикла;
	
	Если ТабличноеПоле.Подвал Тогда
		
		НомерСтроки = НомерСтроки + 1;
		Для Каждого Колонка Из ТабличноеПоле.Колонки Цикл
			
			Если Колонка.Данные = "" Тогда
				Продолжить;
			КонецЕсли;
			
			ИндексКолонки                         = ТабличноеПоле.Колонки.Индекс(Колонка);
			ОбластьЯчейки                         = ТабДокумент.Область(НомерСтроки, ИндексКолонки+1, НомерСтроки, ИндексКолонки+1);
			ОбластьЯчейки.Текст                   = Колонка.ТекстПодвала;
			ОбластьЯчейки.ЦветФона                = ?(Колонка.ЦветФонаШапки.Вид = ВидЦвета.АвтоЦвет, ЦветаСтиля.ЦветФонаКнопки, Колонка.ЦветФонаПодвала);
			ОбластьЯчейки.ЦветРамки               = ?(ТабличноеПоле.ЦветРамки.Вид = ВидЦвета.АвтоЦвет, ЦветаСтиля.ЦветРамки, ТабличноеПоле.ЦветРамки);
			ОбластьЯчейки.Шрифт                   = Колонка.ШрифтПодвала;
			ОбластьЯчейки.ГоризонтальноеПоложение = Колонка.ГоризонтальноеПоложениеВПодвале;
			ОбластьЯчейки.Обвести(ГраницаСлева, ГраницаСверху, ГраницаСправа, ГраницаСнизу);
			
		КонецЦикла;
		
	КонецЕсли;
	
	Возврат ТабДокумент;
	
КонецФункции
Показать
user986734; +1 Ответить
2. mikaizh 11.09.12 17:52 Сейчас в теме
        Построитель=Новый ПостроительОтчета;
	Построитель.ИсточникДанных=Новый ОписаниеИсточникаДанных(ТаблицаЗначений);
	ТабДокумент = Новый ТабличныйДокумент;;
	Построитель.Вывести(ТабДокумент);
	ТабДокумент.Показать();
3. fixin 4253 11.09.12 21:24 Сейчас в теме
(2) а разве в таблице значений хранится цвет? Он только у элементы формы, содержащего таблицу значений. но спасибо за наводку, попробую.
6. taiba 87 12.09.12 12:43 Сейчас в теме
(3) fixin, О каком цвете речь вообще?
7. Поручик 4674 12.09.12 12:51 Сейчас в теме
(6) Он хочет получить раскрашенный MXL в точности такой же, как раскрашенный список чего-то.
8. fixin 4253 12.09.12 13:54 Сейчас в теме
(7) именно. я хочу получить такой же MXL, какой получаю, когда щелкая ПМК на таблице и выбираю "Вывести список". Может у кого готовая функция есть, так влом писать азы...
4. tigermonster 9 11.09.12 21:34 Сейчас в теме
В таблице значений добавить колонку "ЦветСтроки"
В табличном поле при выводе строки использовать данную ячейку используя свойство "ОформлениеСтроки"
5. fixin 4253 11.09.12 21:56 Сейчас в теме
(4) твой ответ не в кассу, совсем не в тему
9. mikaizh 12.09.12 15:45 Сейчас в теме
вот так наверное
Прикрепленные файлы:
Раскраска.epf
acanta; fixin; +2 Ответить
10. fixin 4253 12.09.12 16:23 Сейчас в теме
(9) что за файл? не открывается в 1С. всего 12 Кб. можешь код вытащить из него? и текстом сюда?
Хотя нет. посмотрел. Но это не решение.
Вы решили задачу только для цвета. А как быть с шириной и расположением колонок (они могут идти друг над другом и т.п.).
Я хочу просто программно повторить результат вывода по ПКМ.
12. fixin 4253 15.09.12 00:36 Сейчас в теме
(11) вау, в понедельник проверю, если это работает, вы получите обещаные деньги за наводку.
14. fixin 4253 17.09.12 13:16 Сейчас в теме
(11) taiba, косячок:


Поправил код, там использовались неуниверсальные функции и вынес код по раскраске в отдельную функцию.
Модуль выглядит так:
// Обработка максимально повторяет работу опции "Вывести список" контекстного меню табличной части.
// Еще есть проблемы со стилями, которые в текущей редакции решать лень.
// Автор: Виктор Клевцов; 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;
		СтрокиБлока = табКолонок.НайтиСтроки(Новый Структура("НомерБлока", НомерБлока));
		Для Каждого СтрокаБлока из СтрокиБлока Цикл
			Произведение = Произведение * СтрокаБлока.МаксНомерКолонки
		КонецЦикла;
		// Получили Произведение - теперь вычислим ширину
		Для Каждого СтрокаБлока из СтрокиБлока Цикл
			СтрокиТЗ = тз.НайтиСтроки(Новый Структура("НомерБлока,НомерСтроки", НомерБлока, СтрокаБлока.НомерСтроки));
			ШиринаКолонки = Произведение / СтрокаБлока.МаксНомерКолонки;
			Для Каждого СтрокаТЗ из СтрокиТЗ Цикл
				СтрокаТЗ.ШиринаКолонки = ШиринаКолонки;
			КонецЦикла;
			
			МаксШирина = Макс(МаксШирина, ШиринаКолонки);
		КонецЦикла;
	КонецЦикла;
	
	//тз.ВыбратьСтроку("тз с длинами");
	
	Возврат тз;
КонецФункции

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


ДействияФормыЗаполнить(Неопределено);
Показать
19. taiba 87 17.09.12 14:58 Сейчас в теме
(14) fixin, Да, увлёкся я под вечер :)

а так?
Прикрепленные файлы:
ВывестиСписок2.zip
13. m-serg74 46 16.09.12 14:36 Сейчас в теме
такое прокатит)))
	мТабДок = Новый ТабличныйДокумент;
	Линия = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная, 1);
	мСтрЯч = 1;
	мКолЯч = 0;
	Для Каждого мКол Из ЭлементыФормы.Услуги.Колонки Цикл
		Если мКол.Видимость Тогда
			мКолЯч = мКолЯч + 1;
			мОб = мТабДок.Область(мСтрЯч, мКолЯч);
			мОб.Текст = мКол.ТекстШапки;
			мОб.ЦветТекста = WindowsЦвета.ТекстКнопки;
			мОб.ЦветФона = WindowsЦвета.Кнопка;
			мОб.Обвести(Линия, Линия, Линия, Линия);
			мОб.ШиринаКолонки = мКол.Ширина;
		КонецЕсли;
	КонецЦикла;
	Для Каждого мСтр Из ЭлементыФормы.Услуги.Значение Цикл
		мСтрЯч = мСтрЯч + 1;
		мОф = ЭлементыФормы.Услуги.ОформлениеСтроки(мСтр);
		мКолЯч = 0;
		Для Каждого мКол Из ЭлементыФормы.Услуги.Колонки Цикл
			Если мКол.Видимость Тогда
				мКолЯч = мКолЯч + 1;
				мЯч = мОф.Ячейки.Найти(мКол.Имя);
				мОб = мТабДок.Область(мСтрЯч, мКолЯч);
				мОб.Текст = мЯч.Текст;
				мОб.ЦветТекста = мЯч.ЦветТекста;
				мОб.ЦветФона = мЯч.ЦветФона;
				мОб.Обвести(Линия, Линия, Линия, Линия);
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
	мТабДок.Показать("Вывод");
Показать
Vostr; eeeio; manlak; ivan_luzinov; fixin; +5 Ответить
15. fixin 4253 17.09.12 13:22 Сейчас в теме
(13) m-serg74, ваш код лаконичнее, хотя тоже не работает с многоэтажными списками.
Я его тоже поправил для использования в функции.
Функция ВывестиСписок2(ТЗНаФорме) Экспорт
	мТабДок = Новый ТабличныйДокумент;
	Линия = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная, 1);
	мСтрЯч = 1;
	мКолЯч = 0;
	Для Каждого мКол Из ТЗНаФорме.Колонки Цикл
		Если мКол.Видимость Тогда
			мКолЯч = мКолЯч + 1;
			мОб = мТабДок.Область(мСтрЯч, мКолЯч);
			мОб.Текст = мКол.ТекстШапки;
			мОб.ЦветТекста = WindowsЦвета.ТекстКнопки;
			мОб.ЦветФона = WindowsЦвета.Кнопка;
			мОб.Обвести(Линия, Линия, Линия, Линия);
			мОб.ШиринаКолонки = мКол.Ширина;
		КонецЕсли;
	КонецЦикла;
	Для Каждого мСтр Из ТЗНаФорме.Значение Цикл
		мСтрЯч = мСтрЯч + 1;
		мОф = ТЗНаФорме.ОформлениеСтроки(мСтр);
		мКолЯч = 0;
		Для Каждого мКол Из ТЗНаФорме.Колонки Цикл
			Если мКол.Видимость Тогда
				мКолЯч = мКолЯч + 1;
				мЯч = мОф.Ячейки.Найти(мКол.Имя);
				мОб = мТабДок.Область(мСтрЯч, мКолЯч);
				мОб.Текст = мЯч.Текст;
				мОб.ЦветТекста = мЯч.ЦветТекста;
				мОб.ЦветФона = мЯч.ЦветФона;
				мОб.Обвести(Линия, Линия, Линия, Линия);
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
	Возврат мТабДок;
КонецФункции
Показать


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

Думаю, нужна таблица значений, где по номеру колонки выдается ее коордитана Х и Y в полученной шапке
Достаточно в начале рассчитать эту таблицу и затем уже при выводе колонки позиционировать в нужную ячейку со сдвигом по Х по горизонтали и по Y по вертикали.
Vostr; manlak; ivan_luzinov; +3 Ответить
16. AlexO 135 17.09.12 13:27 Сейчас в теме
(15) fixin,
Сергей, давно бы сами написали :)
И не жмитесь, увеличьте вознаграждение минимум вдвое - taiba только ради вас выложил интересную обработку.
18. fixin 4253 17.09.12 13:50 Сейчас в теме
(16) могу и увеличить. Но код таибы какой-то усложненный, еще и запросы зачем-то. у М-серга более лаконично и быстрее шуршит.
20. taiba 87 17.09.12 15:02 Сейчас в теме
(18) fixin, у меня тоже было лаконичнее, пока не стал этажерки строить.
Запросы можно соптимизировать, так как сейчас там по кусочкам решаются задачи по мере всплывания. Там лишь рассчитываюся параметры блоков колонок таблицы - высоты, ширины и прочее.
21. fixin 4253 21.09.12 18:00 Сейчас в теме
(20) короче, у меня к счастью, не многострочные таблицы. Таиба, я отдаю тебе деньги, но я бы разделил их между тобой и м-серг74. Если можешь, переведи ему треть бабок.
Потому что я все же взял его вариант. Он быстрый и безотказный как калашников. Я посомтрел твой код, там имхо все сложно.
Для того чтобы посчитать смещения не нужна такая гора кода, да и таблица не нужна.
У тебя есть массив колонок, пусть 20 колонок например. Для каждой колонки ты вычисляешь координату Х и Y + ее ширину. Все.
Можно и таблицей из трех колонок. Но не более.
Короче, я свою проблем решил, желаю на досуге оптимизировать код и сделать его все же как рекомендовал в виде изолированной функции (одной или нескольких), чтобы ее можно было выщемить из кода.
ПОследний вариант не смотрел, надеюсь ты его тестировал. Мне хватило кода серг-74.
22. taiba 87 21.09.12 19:09 Сейчас в теме
(21) fixin, хм. аж интересно стало разобрать.

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

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

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

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

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

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

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


ps: спасибо за вопрос и признание
24. fixin 4253 21.09.12 22:34 Сейчас в теме
(22) ладно, таиба, лучшее - враг хорошего. Если работает без ошибок, то и ладно. Просто я не очень понял, нафига запрос? ;-)

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

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

Всем творческих успехов.
23. m-serg74 46 21.09.12 21:21 Сейчас в теме
(21) fixin, круче и пожелать не мог, за Ваш коммент низкий поклон!!! А денег мне реально не надо...
17. m-serg74 46 17.09.12 13:27 Сейчас в теме
(15) fixin, за +1 спасибо,
но отдам деньги
а мне они не нужны) я их на работе зарабатываю)))
ЗЫ. с многоэтажными лень заморачиваться было.
25. m-serg74 46 21.09.12 22:38 Сейчас в теме
Всем творческих успехов
Тебе тоже успехов!
27. Heinrich2906 17.10.18 15:21 Сейчас в теме
Спасибо огромное Виктору Клевцову, taiba@mail.ru!!!
Заработало с пол оборота))))
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот