Как для таблицы значений в форме программно получить MXL по ПКМ "Вывести список"?
По теме из базы знаний
Найденные решения
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)
Функция формирует табличный документ из табличного поля
Недостатки: выводит только те колонки, которые связаны с данными.
Форму можно нарисовать самостоятельно при необходимости.
Функция формирует табличный документ из табличного поля
Недостатки: выводит только те колонки, которые связаны с данными.
Форму можно нарисовать самостоятельно при необходимости.
Функция ТабличноеПолеВТабличныйДокумент(ТабличноеПоле)
ТабДокумент = Новый ТабличныйДокумент;
ГраницаСлева = ?(ТабличноеПоле.ВертикальныеЛинии , Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная, 1), Неопределено);
ГраницаСправа = ?(ТабличноеПоле.ВертикальныеЛинии , Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная, 1), Неопределено);
ГраницаСверху = ?(ТабличноеПоле.ГоризонтальныеЛинии, Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная, 1), Неопределено);
ГраницаСнизу = ?(ТабличноеПоле.ГоризонтальныеЛинии, Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная, 1), Неопределено);
НомерСтроки = 0;
Для Каждого Колонка Из ТабличноеПоле.Колонки Цикл
Если Колонка.Данные = "" Тогда
Продолжить;
КонецЕсли;
ИндексКолонки = ТабличноеПоле.Колонки.Индекс(Колонка);
КолонкаТабличногоПоля = ТабДокумент.Область(, ИндексКолонки+1, , ИндексКолонки+1);
КолонкаТабличногоПоля.ШиринаКолонки = Колонка.Ширина;
КонецЦикла;
Если ТабличноеПоле.Шапка Тогда
НомерСтроки = НомерСтроки + 1;
Для Каждого Колонка Из ТабличноеПоле.Колонки Цикл
Если Колонка.Данные = "" Тогда
Продолжить;
КонецЕсли;
ИндексКолонки = ТабличноеПоле.Колонки.Индекс(Колонка);
ОбластьЯчейки = ТабДокумент.Область(НомерСтроки, ИндексКолонки+1, НомерСтроки, ИндексКолонки+1);
ОбластьЯчейки.Текст = Колонка.ТекстШапки;
ОбластьЯчейки.ЦветФона = ?(Колонка.ЦветФонаШапки.Вид = ВидЦвета.АвтоЦвет, ЦветаСтиля.ЦветФонаКнопки, Колонка.ЦветФонаШапки);
ОбластьЯчейки.ЦветРамки = ?(ТабличноеПоле.ЦветРамки.Вид = ВидЦвета.АвтоЦвет, ЦветаСтиля.ЦветРамки, ТабличноеПоле.ЦветРамки);
ОбластьЯчейки.Шрифт = Колонка.ШрифтШапки;
ОбластьЯчейки.ГоризонтальноеПоложение = Колонка.ГоризонтальноеПоложениеВШапке;
ОбластьЯчейки.Обвести(ГраницаСлева, ГраницаСверху, ГраницаСправа, ГраницаСнизу);
КонецЦикла;
КонецЕсли;
Построитель = Новый ПостроительЗапроса;
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабличноеПоле.Значение);
Для Каждого ЭлементОтбораИсточник Из ТабличноеПоле.ОтборСтрок Цикл
Если ЭлементОтбораИсточник.Использование = Ложь Тогда
Продолжить;
КонецЕсли;
ЭлементОтбораПриемник = Построитель.Отбор.Добавить(ЭлементОтбораИсточник.ПутьКДанным);
ЭлементОтбораПриемник.Использование = ЭлементОтбораИсточник.Использование;
ЭлементОтбораПриемник.ВидСравнения = ЭлементОтбораИсточник.ВидСравнения;
ЭлементОтбораПриемник.Значение = ЭлементОтбораИсточник.Значение;
ЭлементОтбораПриемник.ЗначениеС = ЭлементОтбораИсточник.ЗначениеС;
ЭлементОтбораПриемник.ЗначениеПо = ЭлементОтбораИсточник.ЗначениеПо;
КонецЦикла;
Построитель.Выполнить();
Результат = Построитель.Результат;
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
НомерСтроки = НомерСтроки + 1;
Для Каждого Колонка Из ТабличноеПоле.Колонки Цикл
Если Колонка.Данные = "" Тогда
Продолжить;
КонецЕсли;
ИндексКолонки = ТабличноеПоле.Колонки.Индекс(Колонка);
ОбластьЯчейки = ТабДокумент.Область(НомерСтроки, ИндексКолонки+1, НомерСтроки, ИндексКолонки+1);
ОбластьЯчейки.ЦветФона = ?(Колонка.ЦветФонаПоля.Вид = ВидЦвета.АвтоЦвет, ЦветаСтиля.ЦветФонаПоля, Колонка.ЦветФонаПоля);
ОбластьЯчейки.ЦветРамки = ?(ТабличноеПоле.ЦветРамки.Вид = ВидЦвета.АвтоЦвет, ЦветаСтиля.ЦветРамки, ТабличноеПоле.ЦветРамки);
ОбластьЯчейки.Шрифт = Колонка.ШрифтТекста;
ОбластьЯчейки.ГоризонтальноеПоложение = Колонка.ГоризонтальноеПоложениеВКолонке;
ОбластьЯчейки.Обвести(ГраницаСлева, ГраницаСверху, ГраницаСправа, ГраницаСнизу);
ФорматнаяСтрока = "";
ЗначениеЯчейки = Выборка[Колонка.Данные];
ТипКолонки = Результат.Колонки[Колонка.Данные].ТипЗначения;
Если ТипЗнч(ЗначениеЯчейки) = Тип("Число") Тогда
КвалификаторыЧисла = ТипКолонки.КвалификаторыЧисла;
ФорматнаяСтрока = "ЧЦ=" + КвалификаторыЧисла.Разрядность + "; ЧДЦ=" + КвалификаторыЧисла.РазрядностьДробнойЧасти;
ИначеЕсли ТипЗнч(ЗначениеЯчейки) = Тип("Дата") Тогда
КвалификаторыДаты = ТипКолонки.КвалификаторыДаты;
Если КвалификаторыДаты.ЧастиДаты = ЧастиДаты.Дата Тогда
ФорматнаяСтрока = "ДФ=dd.MM.yyyy";
ИначеЕсли КвалификаторыДаты.ЧастиДаты = ЧастиДаты.Время Тогда
ФорматнаяСтрока = "ДФ=HH:mm:ss";
КонецЕсли;
КонецЕсли;
Если ЗначениеЗаполнено(ФорматнаяСтрока) Тогда
ОбластьЯчейки.Текст = Формат(ЗначениеЯчейки, ФорматнаяСтрока);
ИНаче
ОбластьЯчейки.Текст = ЗначениеЯчейки;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Если ТабличноеПоле.Подвал Тогда
НомерСтроки = НомерСтроки + 1;
Для Каждого Колонка Из ТабличноеПоле.Колонки Цикл
Если Колонка.Данные = "" Тогда
Продолжить;
КонецЕсли;
ИндексКолонки = ТабличноеПоле.Колонки.Индекс(Колонка);
ОбластьЯчейки = ТабДокумент.Область(НомерСтроки, ИндексКолонки+1, НомерСтроки, ИндексКолонки+1);
ОбластьЯчейки.Текст = Колонка.ТекстПодвала;
ОбластьЯчейки.ЦветФона = ?(Колонка.ЦветФонаШапки.Вид = ВидЦвета.АвтоЦвет, ЦветаСтиля.ЦветФонаКнопки, Колонка.ЦветФонаПодвала);
ОбластьЯчейки.ЦветРамки = ?(ТабличноеПоле.ЦветРамки.Вид = ВидЦвета.АвтоЦвет, ЦветаСтиля.ЦветРамки, ТабличноеПоле.ЦветРамки);
ОбластьЯчейки.Шрифт = Колонка.ШрифтПодвала;
ОбластьЯчейки.ГоризонтальноеПоложение = Колонка.ГоризонтальноеПоложениеВПодвале;
ОбластьЯчейки.Обвести(ГраницаСлева, ГраницаСверху, ГраницаСправа, ГраницаСнизу);
КонецЦикла;
КонецЕсли;
Возврат ТабДокумент;
КонецФункции
Показать
(9) что за файл? не открывается в 1С. всего 12 Кб. можешь код вытащить из него? и текстом сюда?
Хотя нет. посмотрел. Но это не решение.
Вы решили задачу только для цвета. А как быть с шириной и расположением колонок (они могут идти друг над другом и т.п.).
Я хочу просто программно повторить результат вывода по ПКМ.
Хотя нет. посмотрел. Но это не решение.
Вы решили задачу только для цвета. А как быть с шириной и расположением колонок (они могут идти друг над другом и т.п.).
Я хочу просто программно повторить результат вывода по ПКМ.
(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;
СтрокиБлока = табКолонок.НайтиСтроки(Новый Структура("НомерБлока", НомерБлока));
Для Каждого СтрокаБлока из СтрокиБлока Цикл
Произведение = Произведение * СтрокаБлока.МаксНомерКолонки
КонецЦикла;
// Получили Произведение - теперь вычислим ширину
Для Каждого СтрокаБлока из СтрокиБлока Цикл
СтрокиТЗ = тз.НайтиСтроки(Новый Структура("НомерБлока,НомерСтроки", НомерБлока, СтрокаБлока.НомерСтроки));
ШиринаКолонки = Произведение / СтрокаБлока.МаксНомерКолонки;
Для Каждого СтрокаТЗ из СтрокиТЗ Цикл
СтрокаТЗ.ШиринаКолонки = ШиринаКолонки;
КонецЦикла;
МаксШирина = Макс(МаксШирина, ШиринаКолонки);
КонецЦикла;
КонецЦикла;
//тз.ВыбратьСтроку("тз с длинами");
Возврат тз;
КонецФункции
//=== КОНЕЦ ДЛЯ ВСТАВКИ В КОД ===
ДействияФормыЗаполнить(Неопределено);
Показать
такое прокатит)))
мТабДок = Новый ТабличныйДокумент;
Линия = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная, 1);
мСтрЯч = 1;
мКолЯч = 0;
Для Каждого мКол Из ЭлементыФормы.Услуги.Колонки Цикл
Если мКол.Видимость Тогда
мКолЯч = мКолЯч + 1;
мОб = мТабДок.Область(мСтрЯч, мКолЯч);
мОб.Текст = мКол.ТекстШапки;
мОб.ЦветТекста = WindowsЦвета.ТекстКнопки;
мОб.ЦветФона = WindowsЦвета.Кнопка;
мОб.Обвести(Линия, Линия, Линия, Линия);
мОб.ШиринаКолонки = мКол.Ширина;
КонецЕсли;
КонецЦикла;
Для Каждого мСтр Из ЭлементыФормы.Услуги.Значение Цикл
мСтрЯч = мСтрЯч + 1;
мОф = ЭлементыФормы.Услуги.ОформлениеСтроки(мСтр);
мКолЯч = 0;
Для Каждого мКол Из ЭлементыФормы.Услуги.Колонки Цикл
Если мКол.Видимость Тогда
мКолЯч = мКолЯч + 1;
мЯч = мОф.Ячейки.Найти(мКол.Имя);
мОб = мТабДок.Область(мСтрЯч, мКолЯч);
мОб.Текст = мЯч.Текст;
мОб.ЦветТекста = мЯч.ЦветТекста;
мОб.ЦветФона = мЯч.ЦветФона;
мОб.Обвести(Линия, Линия, Линия, Линия);
КонецЕсли;
КонецЦикла;
КонецЦикла;
мТабДок.Показать("Вывод");
Показать
(13) m-serg74, ваш код лаконичнее, хотя тоже не работает с многоэтажными списками.
Я его тоже поправил для использования в функции.
Я взял ваш код, т.к. он проще и быстрее, но отдам деньги тому, кто сделает нормальный вывод многострочных списков.
Думаю, нужна таблица значений, где по номеру колонки выдается ее коордитана Х и Y в полученной шапке
Достаточно в начале рассчитать эту таблицу и затем уже при выводе колонки позиционировать в нужную ячейку со сдвигом по Х по горизонтали и по Y по вертикали.
Я его тоже поправил для использования в функции.
Функция ВывестиСписок2(ТЗНаФорме) Экспорт
мТабДок = Новый ТабличныйДокумент;
Линия = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная, 1);
мСтрЯч = 1;
мКолЯч = 0;
Для Каждого мКол Из ТЗНаФорме.Колонки Цикл
Если мКол.Видимость Тогда
мКолЯч = мКолЯч + 1;
мОб = мТабДок.Область(мСтрЯч, мКолЯч);
мОб.Текст = мКол.ТекстШапки;
мОб.ЦветТекста = WindowsЦвета.ТекстКнопки;
мОб.ЦветФона = WindowsЦвета.Кнопка;
мОб.Обвести(Линия, Линия, Линия, Линия);
мОб.ШиринаКолонки = мКол.Ширина;
КонецЕсли;
КонецЦикла;
Для Каждого мСтр Из ТЗНаФорме.Значение Цикл
мСтрЯч = мСтрЯч + 1;
мОф = ТЗНаФорме.ОформлениеСтроки(мСтр);
мКолЯч = 0;
Для Каждого мКол Из ТЗНаФорме.Колонки Цикл
Если мКол.Видимость Тогда
мКолЯч = мКолЯч + 1;
мЯч = мОф.Ячейки.Найти(мКол.Имя);
мОб = мТабДок.Область(мСтрЯч, мКолЯч);
мОб.Текст = мЯч.Текст;
мОб.ЦветТекста = мЯч.ЦветТекста;
мОб.ЦветФона = мЯч.ЦветФона;
мОб.Обвести(Линия, Линия, Линия, Линия);
КонецЕсли;
КонецЦикла;
КонецЦикла;
Возврат мТабДок;
КонецФункции
ПоказатьЯ взял ваш код, т.к. он проще и быстрее, но отдам деньги тому, кто сделает нормальный вывод многострочных списков.
Думаю, нужна таблица значений, где по номеру колонки выдается ее коордитана Х и Y в полученной шапке
Достаточно в начале рассчитать эту таблицу и затем уже при выводе колонки позиционировать в нужную ячейку со сдвигом по Х по горизонтали и по Y по вертикали.
(20) короче, у меня к счастью, не многострочные таблицы. Таиба, я отдаю тебе деньги, но я бы разделил их между тобой и м-серг74. Если можешь, переведи ему треть бабок.
Потому что я все же взял его вариант. Он быстрый и безотказный как калашников. Я посомтрел твой код, там имхо все сложно.
Для того чтобы посчитать смещения не нужна такая гора кода, да и таблица не нужна.
У тебя есть массив колонок, пусть 20 колонок например. Для каждой колонки ты вычисляешь координату Х и Y + ее ширину. Все.
Можно и таблицей из трех колонок. Но не более.
Короче, я свою проблем решил, желаю на досуге оптимизировать код и сделать его все же как рекомендовал в виде изолированной функции (одной или нескольких), чтобы ее можно было выщемить из кода.
ПОследний вариант не смотрел, надеюсь ты его тестировал. Мне хватило кода серг-74.
Потому что я все же взял его вариант. Он быстрый и безотказный как калашников. Я посомтрел твой код, там имхо все сложно.
Для того чтобы посчитать смещения не нужна такая гора кода, да и таблица не нужна.
У тебя есть массив колонок, пусть 20 колонок например. Для каждой колонки ты вычисляешь координату Х и Y + ее ширину. Все.
Можно и таблицей из трех колонок. Но не более.
Короче, я свою проблем решил, желаю на досуге оптимизировать код и сделать его все же как рекомендовал в виде изолированной функции (одной или нескольких), чтобы ее можно было выщемить из кода.
ПОследний вариант не смотрел, надеюсь ты его тестировал. Мне хватило кода серг-74.
(21) fixin, хм. аж интересно стало разобрать.
код можно разделить на 3 логических блока:
1. получение оформления
2. получение таблицы блоков колонок
3. вывод
1. блок оформления позволяет перехватить ситуации, когда табличное поле раскрашено не по стандартному стилю. Причем в текущей версии даже недодел - для шапки и подвала берется окрас из свойств всего поля, а не колонки. Если этим пренебречь, то можно ставить цвета по умолчанию, как у m-serg74. Оптимизировать здесь нечего - параметры получаются единожды.
2. таблица блоков - размеры колонок нужно вычислять для каждого блока колонок. под блоком понимается вертикальная группировка нескольких колонок (до достижения конца или до колонки с Положение.НоваяКолонка). Это делает первый цикл в ПолучитьТЗБлоков.
Далее запросами я выбрал параметры блоков:
МаксНомерСтроки для расчета высоты блока (первые строки идут высотой 1, а последняя занимает весь остаток до МаксНомерСтроки);
таблица с числом строк в каждом блоке
таблица с максимальным числом колонок в строке блока
и количество блоков для условий циклов
далее первый цикл после запросов устанавливает высоту для каждой строки;
второй - вычисляет ширины в каждом блоке и заносит в таблицу;
и третий - рассчитывает начальную горизонтальную координату каждой колонки. Оптимизация возможна разве что совмещением циклов, но учитывая объем информации, это некритично.
3. Ну и сам вывод. Получаются оформление и таблица колонок, ну и сам вывод по полученным величинам.
Без переноса оформления и разбора блоков модуль выглядел примерно так же, как у м-серг, но в (10) было поставлено условие
ps: спасибо за вопрос и признание
код можно разделить на 3 логических блока:
1. получение оформления
2. получение таблицы блоков колонок
3. вывод
1. блок оформления позволяет перехватить ситуации, когда табличное поле раскрашено не по стандартному стилю. Причем в текущей версии даже недодел - для шапки и подвала берется окрас из свойств всего поля, а не колонки. Если этим пренебречь, то можно ставить цвета по умолчанию, как у m-serg74. Оптимизировать здесь нечего - параметры получаются единожды.
2. таблица блоков - размеры колонок нужно вычислять для каждого блока колонок. под блоком понимается вертикальная группировка нескольких колонок (до достижения конца или до колонки с Положение.НоваяКолонка). Это делает первый цикл в ПолучитьТЗБлоков.
Далее запросами я выбрал параметры блоков:
МаксНомерСтроки для расчета высоты блока (первые строки идут высотой 1, а последняя занимает весь остаток до МаксНомерСтроки);
таблица с числом строк в каждом блоке
таблица с максимальным числом колонок в строке блока
и количество блоков для условий циклов
далее первый цикл после запросов устанавливает высоту для каждой строки;
второй - вычисляет ширины в каждом блоке и заносит в таблицу;
и третий - рассчитывает начальную горизонтальную координату каждой колонки. Оптимизация возможна разве что совмещением циклов, но учитывая объем информации, это некритично.
3. Ну и сам вывод. Получаются оформление и таблица колонок, ну и сам вывод по полученным величинам.
Без переноса оформления и разбора блоков модуль выглядел примерно так же, как у м-серг, но в (10) было поставлено условие
Вы решили задачу только для цвета. А как быть с шириной и расположением колонок (они могут идти друг над другом и т.п.).
ps: спасибо за вопрос и признание
(22) ладно, таиба, лучшее - враг хорошего. Если работает без ошибок, то и ладно. Просто я не очень понял, нафига запрос? ;-)
(23) ну не знаю, у таибы тогда была еще первая багнутая версия (последнюю не проверял еще, наверное поправил он ее), а мне нужно было срочно, взял м-серговскую, подточил буквально пару штрихов и все заработало. Манагеров по крайней мере устроило. Повезло, что табличка была в одну строчку.
Короче, всем спасибо что помогли.
Всем творческих успехов.
(23) ну не знаю, у таибы тогда была еще первая багнутая версия (последнюю не проверял еще, наверное поправил он ее), а мне нужно было срочно, взял м-серговскую, подточил буквально пару штрихов и все заработало. Манагеров по крайней мере устроило. Повезло, что табличка была в одну строчку.
Короче, всем спасибо что помогли.
Всем творческих успехов.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот