Всем доброго дня!
Пожалуйста помогите решить проблему: есть Отчет (не на СКД), в нем есть табличная часть. Заголовки колонок формируются автоматически, в зависимости от содержимого колонок (все колонки числовые). По команде "Сформировать" заполняется эта ТЧ и в зависимости от Итогов в колонках, пустые колонки "прячутся" (Видимость=Ложь). Не могу сообразить, как вывести на печать (в макет) только видимые колонки (с заголовками как в ТЧ)??? Может быть это вааще не возможно сделать?
P.S. Управляемые формы, платформа 8.3.14, ЗУП-3.1 релиз 3.1.10.111
В форме создайте реквизит Результат с типом "ТабличныйДокумент" и расположите его временно на форме, его надо заполнить на основании Вашей ТЧ. Заполнение идет с помощью макета, где описаны области заполнения "Шапка", "СтрокаТЧ" и т.п. После заполнения Вы получите полный вывод ТЧ, а потом сделайте кнопку "Удалить" и по ней удалите лишние колонки - посмотрите результат. Далее кнопку можно будет убрать и сразу формировать Результат и удалять колонки.
В вашем случае можно предложить следующий алгоритм:
1. Заполняем массив или список значений именами колонок, которые нужно вывести.
2. Создаем табличный документ.
3. Выводим в табличный документ методом Вывести() общую секцию заголовка (секцию, которая должна выводиться в любом случае).
4. В цикле по массиву (или списку значений) методом Присоединить() добавляем справа заголовки тех колонок, которые должны быть выведены.
5. Методом Вывести() выводим в новую строку общую секцию строки.
6. В цикле по массиву (или списку значений) методом Присоединить() добавляем справа ячейки тех колонок, которые должны быть выведены.
7. Повторяем в цикле по строкам пп. 5 и 6.
(3) Да проще в макете прописать область для строки в целом для всех колонок, вывести просто все строки, а потом удалить ненужные колонки - есть же метод УдалитьОбласть. Заголовки выводим тоже для всех колонок
Есть такой объект ТабличныйДокумент, там можно выводить в
нужную область программно информацию.
Это может быть реквизит формы, его можно не выводить на форму.
Можно заполнить его полностью, а потом ненужные колонки
удалить (есть метод УдалитьОбласть).
(2) На СКД сделать мозгов не хватает: ТЧ этого отчета заполняется из Документа/ов, в котором две ТЧ и в одной колонки стандартно по горизонтали, а в другой, так сказать "по вертикали" (т.е. "вертикаль" перестроена в "горизонталь" и добавлена/присоединена к колонкам первой ТЧ). Вот такая "хитрая" ТЧ в этом Отчете.
(8) Документы, из которых формируется Отчет специфические и довольно сложные по структуре и не имеют отношения к Типовому функционалу. Поэтому объяснять их содержание очень сложно и трудоемко. А в этом Отчете уже есть Табличная часть, в которой все правильно заполняется и остается только без пустографок вывести на печать.
Метод УдалитьОбласть - он полностью удаляет например колонку и сдвигает влево правые колонки или его нужно еще использовать для Строк и Подвала?
(9) Вы задаете область ("R2C2:R2C2") и определяете тип смещения По вертикали По горизонтали. Не пробовал - можно ли в качестве области задать сразу колонку. Если да - задаете ее и тип смещения по горизонтали. Посмотрите синтаксис-помощник поиском "ТабличныйДокумент"
Метод УдалитьОбласть - он полностью удаляет например колонку
Как вы себе представляете указание в качестве области целиком колонки?
или его нужно еще использовать для Строк и Подвала?
Разумеется, для строк обязательно! А вот для подвала - смотря что там, в этом подвале.
Да и с шапкой не все так просто, если в ней есть объединенные ячейки.
P.S. Если все-таки решите делать через удаление, то надо отдавать себе отчет: удалять области надо справа налево (начиная с самой правой), иначе собьете выборку.
(17) ОК, осталось проверить - как будет выглядеть результат, если в шапке и подвале отчета есть объединенные ячейки - так часто делают, чтобы заголовки и подписи выводились "красиво"
Макет не видели ни вы, ни я, так что не вижу смысла дальше спорить, все в руках автора.
Кстати, есть еще вариант - сформировать таблицу значений на основе ТЧ и "скормить" ее СКД. Причем можно в ТЗ выгрузить всю ТЧ, а условия наложить уже средствами СКД.
(16) Добрый день, Леонид!
В модуле объекта ТабДок.УдалитьОбласть(Область,Смещение); выдает ошибку: Выделение не соответствует вставляемому блоку. Сейчас попробую этот Ваш последний вариант.
(22) Да я учитываю и номер колонки и латинский шрифт, только не клеится &НаСервереБезКонтекста, у меня процедура Печать не в форме модуля, а в модуле объекта.
(24)ТабДок у меня наверное Макет?! Но
Область = ТабДок.Область("C2");
ТабДок.УдалитьОбласть(Область,ТипСмещенияТабличногоДокумента.ПоГоризонтали);
не дает ни какого результата!!! Все остается на своем месте.
Кстати, извиняюсь, в модуле объекта у меня не Процедура Печать, а функция.
Может перетащить это все в модуль формы?
В форме создайте реквизит Результат с типом "ТабличныйДокумент" и расположите его временно на форме, его надо заполнить на основании Вашей ТЧ. Заполнение идет с помощью макета, где описаны области заполнения "Шапка", "СтрокаТЧ" и т.п. После заполнения Вы получите полный вывод ТЧ, а потом сделайте кнопку "Удалить" и по ней удалите лишние колонки - посмотрите результат. Далее кнопку можно будет убрать и сразу формировать Результат и удалять колонки.
Заполнение идет с помощью макета, где описаны области заполнения "Шапка", "СтрокаТЧ" и т.п. После заполнения Вы получите полный вывод ТЧ, а потом сделайте кнопку "Удалить" и по ней удалите лишние колонки
Это называется "создать себе трудности, чтобы потом их героически преодолевать".
Макет должен содержать всего одну колонку с данными, в цикле перебираем колонки ТЧ, каждую проверяем на необходимость вывода по тому же условию, что и видимость, если не должна выводиться (невидима), то пропускаем.
Если должна, то заполняем данными из нее соответствующую область макета и присоединяем ее к выходному табличному документу.
Таких однотипных циклов будет всего 3: по заголовкам, по строкам (в цикле) и по подвалу.
(30) Мне очень интересна Ваша мысль, я сам пытался сделать так же, только не знаю, как правильно это сделать??? Видимо мозги уже засыхают. Только смущает, т.е. не пойму, что это за "макет" и почему "Макет должен содержать всего одну колонку с данными"?
Грубо говоря - заготовка печатной формы вашего отчета.
У вас там должна быть шапка? Содержащая, например, наименование организации, период (или дату) отчета и т.д.? То же самое - подвал? Подписанты и прочее?
Откуда это будет выводиться? Или только голая таблица с данными?
(36) Ну, так осталось только программно создать временный Табличный документ и перенести в него только то, что нужно напечатать: шапку, нужные колонки заголовков и строк, подвал. И вывести этот документ на печать.
(40) Наконец-то. "В основном в хвосте" или "всегда в хвосте"- от этого зависит выбор алгоритма.
Я бы взял за образец код из ссылки в (3):
1. Создаем объект Табличный документ.
2. Из вашего макета получаем область шапки - допустим, строки R1-R5.
3. Выводим их в ТД.
4. Получаем область R6C1:R6C3 ("Класс" - "Педоклад") и выводим ее в ТД методом Вывести() - с новой строки.
5. В цикле перебираем ячейки строки заголовка: R6C4, R6C5, R6C6 и т.д. (нумерация не с единицы, т.к. "постоянные" колонки уже выведены).
6. Определяем для каждой колонки - должна ли она выводиться? Если да, то получаем область макета R6Cn:R6Cn и присоединяем ее к ТД методом Присоединить() - в той же строке ТД.
7. В цикле по строкам макета R6-Rn повторяем пункты 4-6.
8. Повторяем пп.2-3 для подвала с учетом номеров их строк.
(42) Не всегда "в хвосте", иногда бывает где-либо в середине, например, ни у кого из сотрудников не заполнен параметр "Квалификация", т.е. колонка пустая, вот и желательно спрятать ее с глаз и на бумаге сэкономить место для других колонок. Но главное - не печать последние пустые колонки!
(43) Откуда у Вас пустые колонки?
При удалении колонки все сдвигается влево.
Или у Вас в макете есть пустые колонки?
Макет сфоткайте.
В макете область шапки нарисовали? Почему не вывели?
ТЗ стандартным образом на печать не выводится - только через ТабличныйДокумент. Или можно в СКД ее отправить. Но в СКД
надо будет прописывать заголовки колонок или программно
их формировать...
ОблДопл - это что за область?
Вы визуально для отладки на форму кинули Результат?
Если не удалять колонки - там что? Есть "пустые"?
Может у Вас правее в макете пустые ячейки?
(48) Да, я кинул "Результат" на форму, только он не заполняется, видимо нужно написать код для заполнения.
ОблДопл - это пробно я создал для последней колонки.
В Макете правее, чем Доплата9 ничего нет.
Колонки Доплата1 по Доплата9 могут быть заполнены, зависит от количества доплат назначенных сотруднику, а если их меньше 9, то и в ТЧ и в Макете пустые колонки, которые нужно удалить.
Попробуйте задать область так:
Область = ТабДок.Область("C20:С30");
Если не прокатит - в цикле по одной колонке.
Вы же выводите все куда-то? Куда? Надо бы в Результат.
Покажите код вывода...
Но это все - если хотите визуально посмотреть.
А удаление пустых (дополнительных) через
Область = ТабДок.Область("C20:С30");
ТабДок.УдалитьОбласть(Область,ТипСмещенияТабличногоДокумента.ПоГоризонтали)
У табдок есть свойство ширинаТаблицы.
61.
user596430_gleb21
319.08.19 16:24 Сейчас в теме
На мой взгляд, в 30 дан правильный совет.
В макете абсолютно не нужны многочисленные колонки.
И названия колонок и итоги в них элементарно получаются.
Добавьте реквизит формы, например "НевидимыеКолонки", с типом "СписокЗначений" и когда "пустые колонки "прячутся" (Видимость=Ложь)" заполните его.
Дальше заполняете ТабличныйДокумент.
(62) Тут предлагают более сложный алгоритм, но зато универсальный
Делаем в макете область Область1 одну ячейку и в ней параметр "ЗначениеЯчейки"
Вывод в Табличный документ пойдет по 2 циклам - сначала по строкам ТЧ,
затем по колонкам ТЧ.
Причем первую ячейку будете выводить ТабДок.Вывести(Область1),
а последующие - при проверке наличия итогов по колонке <> 0
ТабДок.Присоединить(Область1).
Также в цикле будете выводить заголовки нужных колонок.
64.
user596430_gleb21
319.08.19 20:41 Сейчас в теме
Примерно так:
На форме создать реквизит "ВидимыеКолонки" с типом "СписокЗначений".
Когда в коде определяется видимость колонок
ВидимыеКолонки.Добавить(ИмяКолонки, Заголовок)
Затем формируем из "ВидимыеКолонки" строку и выгружаем в Таблицу значений данные из таблицы на форме ТЗ = Таб.Выгрузить( , строка колонок)
Ну а дальше заполняем табличный документ, сначала имена колонок, затем значения ,и наконец, итоги по колонкам
&НаСервере
Функция ПечатьНаСервере()
Отчетик = РеквизитФормыВЗначение("Отчет");
Макет = Отчетик.ПолучитьМакет("Макет");
ТабДок = Новый ТабличныйДокумент;
РеквизитыТЧ = Отчетик.Метаданные().ТабличныеЧасти.ТЧ.Реквизиты;
ОбластьЗаголовок = Макет.ПолучитьОбласть("ЗаголовокКолонки");
ОбластьЧисловойЯчейки = Макет.ПолучитьОбласть("ЗначениеЧисловойЯчейки");
ОбластьСотрудника = Макет.ПолучитьОбласть("ОбластьСотрудника");
ПерваяКолонка = 1;
Для Каждого Колонка из РеквизитыТЧ Цикл
ОбластьЗаголовок.Параметры.Заголовок = Колонка.Синоним;
Если ПерваяКолонка = 1 Тогда
ТабДок.Вывести(ОбластьЗаголовок);
ПерваяКолонка = 0;
Иначе
Если Отчет.ТЧ.Итог(Колонка.Имя) > 0 Тогда
ТабДок.Присоединить(ОбластьЗаголовок);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Для Каждого Строка из Отчет.ТЧ Цикл
ПерваяКолонка = 1;
Для Каждого Колонка из РеквизитыТЧ Цикл
Значение = Строка[Колонка.Имя];
Если ПерваяКолонка = 1 Тогда
ОбластьСотрудника.Параметры.Значение = Значение;
ТабДок.Вывести(ОбластьСотрудника);
ПерваяКолонка = 0;
Иначе
Если Отчет.ТЧ.Итог(Колонка.Имя) > 0 Тогда
ОбластьЧисловойЯчейки. Параметры.Значение = Значение;
ТабДок.Присоединить(ОбластьЧисловойЯчейки);
КонецЕсли;
КонецЕсли
КонецЦикла;
КонецЦикла;
Возврат ТабДок;
КонецФункции
&НаКлиенте
Процедура Печать(Команда)
Результат = ПечатьНаСервере();
Результат.Показать();
КонецПроцедуры
(69) Большое спасибо, завтра попробую ПечатьТЧ.erf. А красота не проблема, когда "система" начинает работать, я сумею ее "раскрасить". Спасибо!
Кстати: быстро и красиво отформатировать текст модуля я выделяю нужный кусок/область и Shift + Alt + F