Всем доброго дня!
Пожалуйста помогите решить проблему: есть Отчет (не на СКД), в нем есть табличная часть. Заголовки колонок формируются автоматически, в зависимости от содержимого колонок (все колонки числовые). По команде "Сформировать" заполняется эта ТЧ и в зависимости от Итогов в колонках, пустые колонки "прячутся" (Видимость=Ложь). Не могу сообразить, как вывести на печать (в макет) только видимые колонки (с заголовками как в ТЧ)??? Может быть это вааще не возможно сделать?
P.S. Управляемые формы, платформа 8.3.14, ЗУП-3.1 релиз 3.1.10.111
---
В форме создайте реквизит Результат с типом "ТабличныйДокумент" и расположите его временно на форме, его надо заполнить на основании Вашей ТЧ. Заполнение идет с помощью макета, где описаны области заполнения "Шапка", "СтрокаТЧ" и т.п. После заполнения Вы получите полный вывод ТЧ, а потом сделайте кнопку "Удалить" и по ней удалите лишние колонки - посмотрите результат. Далее кнопку можно будет убрать и сразу формировать Результат и удалять колонки.
---
Не могу сообразить, как вывести на печать (в макет) только видимые колонки (с заголовками как в ТЧ)??? Может быть это вааще не возможно сделать? Очень даже возможно, даже в 1С 7.7 эта задача решалась при помощи метода ПрисоединитьСекцию()

В 8-ке этот метод стал называться Присоединить(), но принцип не изменился: https://forum.infostart.ru/forum9/topic97671/

В вашем случае можно предложить следующий алгоритм:
1. Заполняем массив или список значений именами колонок, которые нужно вывести.
2. Создаем табличный документ.
3. Выводим в табличный документ методом Вывести() общую секцию заголовка (секцию, которая должна выводиться в любом случае).
4. В цикле по массиву (или списку значений) методом Присоединить() добавляем справа заголовки тех колонок, которые должны быть выведены.
5. Методом Вывести() выводим в новую строку общую секцию строки.
6. В цикле по массиву (или списку значений) методом Присоединить() добавляем справа ячейки тех колонок, которые должны быть выведены.
7. Повторяем в цикле по строкам пп. 5 и 6.
---
Да проще в макете прописать область для строки в целом для всех колонок, вывести просто все строки, а потом удалить ненужные колонки - есть же метод УдалитьОбласть. Заголовки выводим тоже для всех колонок
---
потом удалить ненужные колонки - есть же метод УдалитьОбласть. Неизвестно, что там еще в шапке и подвале отчета, и как их покорежит удаление колонок.

Впрочем, кому что проще, не стану спорить - пусть автор выбирает.
---
Есть такой объект ТабличныйДокумент, там можно выводить в
нужную область программно информацию.
Это может быть реквизит формы, его можно не выводить на форму.
Можно заполнить его полностью, а потом ненужные колонки
удалить (есть метод УдалитьОбласть).

А так желательно на СКД все-таки сделать.
---
На СКД сделать мозгов не хватает: ТЧ этого отчета заполняется из Документа/ов, в котором две ТЧ и в одной колонки стандартно по горизонтали, а в другой, так сказать "по вертикали" (т.е. "вертикаль" перестроена в "горизонталь" и добавлена/присоединена к колонкам первой ТЧ). Вот такая "хитрая" ТЧ в этом Отчете.
---
Может стоит сформулировать задачку из каких документов что надо
получить и Вам подскажут как это можно сделать на СКД?
---
Документы, из которых формируется Отчет специфические и довольно сложные по структуре и не имеют отношения к Типовому функционалу. Поэтому объяснять их содержание очень сложно и трудоемко. А в этом Отчете уже есть Табличная часть, в которой все правильно заполняется и остается только без пустографок вывести на печать.
Метод УдалитьОбласть - он полностью удаляет например колонку и сдвигает влево правые колонки или его нужно еще использовать для Строк и Подвала?
---
Вы задаете область ("R2C2:R2C2") и определяете тип смещения По вертикали По горизонтали. Не пробовал - можно ли в качестве области задать сразу колонку. Если да - задаете ее и тип смещения по горизонтали. Посмотрите синтаксис-помощник поиском "ТабличныйДокумент"
---
Метод УдалитьОбласть - он полностью удаляет например колонку Как вы себе представляете указание в качестве области целиком колонки?
или его нужно еще использовать для Строк и Подвала? Разумеется, для строк обязательно! А вот для подвала - смотря что там, в этом подвале.

Да и с шапкой не все так просто, если в ней есть объединенные ячейки.

P.S. Если все-таки решите делать через удаление, то надо отдавать себе отчет: удалять области надо справа налево (начиная с самой правой), иначе собьете выборку.
---
Напишите ваше сообщение
(12) Как вы себе представляете указание в качестве области целиком колонки?

Смотрите в (16)
---
ОК, осталось проверить - как будет выглядеть результат, если в шапке и подвале отчета есть объединенные ячейки - так часто делают, чтобы заголовки и подписи выводились "красиво"

Макет не видели ни вы, ни я, так что не вижу смысла дальше спорить, все в руках автора.
---
А что тут спорить? Никакого макета нет - есть ТЧ с заголовками
колонок, ее и надо вывести. Автор же не универсальную процедуру пишет.
---
Никакого макета нет - есть ТЧ с заголовками
колонок, ее и надо вывести. См. (9):
его нужно еще использовать для Строк и Подвала?
---
Спасибо! Я попробую, поюзаю и потом напишу, что получилось.
---
Кстати, есть еще вариант - сформировать таблицу значений на основе ТЧ и "скормить" ее СКД. Причем можно в ТЗ выгрузить всю ТЧ, а условия наложить уже средствами СКД.
---
"Вывести список" не пойдет?
---
Вот тут посмотрите - может поможет... Предлагают ширину колонки сделать 0.
---
https://forum.infostart.ru/forum9/topic37072/
---
Проверил - вот такой код прекрасно сработал

```1c
    &НаСервереБезКонтекста
    Процедура УдалитьКолонкуНаСервере(ТабДок)
    Область = ТабДок.Область("C2");
    ТабДок.УдалитьОбласть(Область,ТипСмещенияТабличногоДокумента.ПоГоризонтали);
    КонецПроцедуры

    &НаКлиенте
    Процедура УдалитьКолонку(Команда)
    УдалитьКолонкуНаСервере(Результат);
    КонецПроцедуры
```

Маленькая "Тонкость" - С2 надо латинским шрифтом писать.
---
Добрый день, Леонид!
В модуле объекта ТабДок.УдалитьОбласть(Область,Смещение); выдает ошибку: Выделение не соответствует вставляемому блоку. Сейчас попробую этот Ваш последний вариант.
---
Учтите, что если слева направо удалять - номера колонок ("С2" - 2 это номер колонки) правее будут после удаления уменьшаться на 1
---
Да я учитываю и номер колонки и латинский шрифт, только не клеится &НаСервереБезКонтекста, у меня процедура Печать не в форме модуля, а в модуле объекта.
---
А ТабДок где у Вас? Он же должен быть реквизитом формы. У меня - это "Результат", я его на форму вывел, чтобы видно было как идет удаление
---
ТабДок у меня наверное Макет?! Но
Область = ТабДок.Область("C2");
ТабДок.УдалитьОбласть(Область,ТипСмещенияТабличногоДокумента.ПоГоризонтали);
не дает ни какого результата!!! Все остается на своем месте.
Кстати, извиняюсь, в модуле объекта у меня не Процедура Печать, а функция.
Может перетащить это все в модуль формы?
---
В модуле объекта не надо указывать &НаСервереБезКонтекста - он вроде как всегда на сервере.
---
В форме создайте реквизит Результат с типом "ТабличныйДокумент" и расположите его временно на форме, его надо заполнить на основании Вашей ТЧ. Заполнение идет с помощью макета, где описаны области заполнения "Шапка", "СтрокаТЧ" и т.п. После заполнения Вы получите полный вывод ТЧ, а потом сделайте кнопку "Удалить" и по ней удалите лишние колонки - посмотрите результат. Далее кнопку можно будет убрать и сразу формировать Результат и удалять колонки.
---
Большое Спасибо, сейчас попробую.
---
Заполнение идет с помощью макета, где описаны области заполнения "Шапка", "СтрокаТЧ" и т.п. После заполнения Вы получите полный вывод ТЧ, а потом сделайте кнопку "Удалить" и по ней удалите лишние колонки Это называется "создать себе трудности, чтобы потом их героически преодолевать".

Макет должен содержать всего одну колонку с данными, в цикле перебираем колонки ТЧ, каждую проверяем на необходимость вывода по тому же условию, что и видимость, если не должна выводиться (невидима), то пропускаем.

Если должна, то заполняем данными из нее соответствующую область макета и присоединяем ее к выходному табличному документу.

Таких однотипных циклов будет всего 3: по заголовкам, по строкам (в цикле) и по подвалу.

И не надо потом ничего удалять.

P.S. Впрочем, кому что нравится.
---
Мне очень интересна Ваша мысль, я сам пытался сделать так же, только не знаю, как правильно это сделать??? Видимо мозги уже засыхают. Только смущает, т.е. не пойму, что это за "макет" и почему "Макет должен содержать всего одну колонку с данными"?
---
не пойму, что это за "макет" Грубо говоря - заготовка печатной формы вашего отчета.

У вас там должна быть шапка? Содержащая, например, наименование организации, период (или дату) отчета и т.д.? То же самое - подвал? Подписанты и прочее?

Откуда это будет выводиться? Или только голая таблица с данными?
---
Да, и шапка и подвал.
---
и шапка и подвал И где все это находится сейчас? В табличной части?
---
Нет, Это в Макете.
---
Тогда идея насчет "одной колонки" не годится, я неправильно вас понял. См. (38)

P.S. Вы бы хоть макет тут выложили, а то мы второй день спорим о том, чего в глаза не видели.
---
Этот Макет я и "нарисовал".
---
Ну, так осталось только программно создать временный Табличный документ и перенести в него только то, что нужно напечатать: шапку, нужные колонки заголовков и строк, подвал. И вывести этот документ на печать.
---
И как правильно это сделать? У меня на печать выводится вот такая ерунда:
---
Наконец-то. "В основном в хвосте" или "всегда в хвосте"- от этого зависит выбор алгоритма.

Я бы взял за образец код из ссылки в (3):
1. Создаем объект Табличный документ.
2. Из вашего макета получаем область шапки - допустим, строки R1-R5.
3. Выводим их в ТД.
4. Получаем область R6C1:R6C3 ("Класс" - "Педоклад") и выводим ее в ТД методом Вывести() - с новой строки.
5. В цикле перебираем ячейки строки заголовка: R6C4, R6C5, R6C6 и т.д. (нумерация не с единицы, т.к. "постоянные" колонки уже выведены).
6. Определяем для каждой колонки - должна ли она выводиться? Если да, то получаем область макета R6Cn:R6Cn и присоединяем ее к ТД методом Присоединить() - в той же строке ТД.
7. В цикле по строкам макета R6-Rn повторяем пункты 4-6.
8. Повторяем пп.2-3 для подвала с учетом номеров их строк.
---
Не всегда "в хвосте", иногда бывает где-либо в середине, например, ни у кого из сотрудников не заполнен параметр "Квалификация", т.е. колонка пустая, вот и желательно спрятать ее с глаз и на бумаге сэкономить место для других колонок. Но главное - не печать последние пустые колонки!
---
Откуда у Вас пустые колонки?
При удалении колонки все сдвигается влево.
Или у Вас в макете есть пустые колонки?
Макет сфоткайте.
В макете область шапки нарисовали? Почему не вывели?
---
А это не будет дублем того, что в Отчете уже есть заполненная ТЧ со всеми необходимыми данными и все пустые/лишние колонки уже скрыты?
---
На ИТС можно посмотреть книжку Радченко
https://its.1c.ru/db/pubdevguide83#content:150:hdoc
---
А может быть просто выгрузить табличную часть Отчета в таблицу значений, удалить там пустые колонки и эту ТЗ отправить стандартным образом на печать?
---
ТЗ стандартным образом на печать не выводится - только через ТабличныйДокумент. Или можно в СКД ее отправить. Но в СКД
надо будет прописывать заголовки колонок или программно
их формировать...
---
Да, в Макете полный набор колонок.
---
ОблДопл - это что за область?
Вы визуально для отладки на форму кинули Результат?
Если не удалять колонки - там что? Есть "пустые"?
Может у Вас правее в макете пустые ячейки?
---
Да, я кинул "Результат" на форму, только он не заполняется, видимо нужно написать код для заполнения.
ОблДопл - это пробно я создал для последней колонки.
---
А что же у Вас заполняется "пустыми" колонками?
---
В Макете правее, чем Доплата9 ничего нет.
Колонки Доплата1 по Доплата9 могут быть заполнены, зависит от количества доплат назначенных сотруднику, а если их меньше 9, то и в ТЧ и в Макете пустые колонки, которые нужно удалить.
---
Там может это они и выводятся? Тогда их надо тоже программно удалить.
---
Как раз вся суть вопроса в этом - программно удалить пустые колонки.
---
Я так и не понял почему "Результат" не выводится? Вы вместо него что-то заполняете?
---
Нет, я добавил этот реквизит "Результат" на форму, но ни с чем его "не связал".
---
Попробуйте задать область так:
Область = ТабДок.Область("C20:С30");
Если не прокатит - в цикле по одной колонке.
Вы же выводите все куда-то? Куда? Надо бы в Результат.
Покажите код вывода...
---
вот, а в модуле объекта в Функции Печать() Экспорт работа с Макетом (его заполнением).
---
На клиенте попробуйте вместо ТабДок = ...
Результат =

Или в ПечатьНаСервере(Результат) - передаете
реквизит формы и его же передаете с модуль объекта,
а там не создаете...
Но это не обязательно.
---
Хорошо, буду пробовать, результат сообщу.
---
Но это все - если хотите визуально посмотреть.
А удаление пустых (дополнительных) через
Область = ТабДок.Область("C20:С30");
ТабДок.УдалитьОбласть(Область,ТипСмещенияТабличногоДокумента.ПоГоризонтали)
У табдок есть свойство ширинаТаблицы.
---
На мой взгляд, в 30 дан правильный совет.
В макете абсолютно не нужны многочисленные колонки.
И названия колонок и итоги в них элементарно получаются.
Добавьте реквизит формы, например "НевидимыеКолонки", с типом "СписокЗначений" и когда "пустые колонки "прячутся" (Видимость=Ложь)" заполните его.
Дальше заполняете ТабличныйДокумент.
---
Довольно интересное предложение, а можно его более подробно?
---
Тут предлагают более сложный алгоритм, но зато универсальный

Делаем в макете область Область1 одну ячейку и в ней параметр "ЗначениеЯчейки"

Вывод в Табличный документ пойдет по 2 циклам - сначала по строкам ТЧ,
затем по колонкам ТЧ.
Причем первую ячейку будете выводить ТабДок.Вывести(Область1),
а последующие - при проверке наличия итогов по колонке <> 0
ТабДок.Присоединить(Область1).
Также в цикле будете выводить заголовки нужных колонок.
---
Примерно так:
На форме создать реквизит "ВидимыеКолонки" с типом "СписокЗначений".
Когда в коде определяется видимость колонок
ВидимыеКолонки.Добавить(ИмяКолонки, Заголовок)

Затем формируем из "ВидимыеКолонки" строку и выгружаем в Таблицу значений данные из таблицы на форме ТЗ = Таб.Выгрузить( , строка колонок)

Ну а дальше заполняем табличный документ, сначала имена колонок, затем значения ,и наконец, итоги по колонкам
---
Вот рабочий код

```1c
    &НаСервере
    Функция ПечатьНаСервере()
    Отчетик = РеквизитФормыВЗначение("Отчет");
    Макет = Отчетик.ПолучитьМакет("Макет");
    ТабДок = Новый ТабличныйДокумент;
    РеквизитыТЧ = Отчетик.Метаданные().ТабличныеЧасти.ТЧ.Реквизиты;
    ОбластьЗаголовок = Макет.ПолучитьОбласть("ЗаголовокКолонки");
    ОбластьЧисловойЯчейки = Макет.ПолучитьОбласть("ЗначениеЧисловойЯчейки");
    ОбластьСотрудника = Макет.ПолучитьОбласть("ОбластьСотрудника");
    ПерваяКолонка = 1;
    Для Каждого Колонка из РеквизитыТЧ Цикл
    ОбластьЗаголовок.Параметры.Заголовок = Колонка.Синоним;
    Если ПерваяКолонка = 1 Тогда
    ТабДок.Вывести(ОбластьЗаголовок);
    ПерваяКолонка = 0;
    Иначе
    Если Отчет.ТЧ.Итог(Колонка.Имя) > 0 Тогда
    ТабДок.Присоединить(ОбластьЗаголовок);
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;

    Для Каждого Строка из Отчет.ТЧ Цикл
    ПерваяКолонка = 1;
    Для Каждого Колонка из РеквизитыТЧ Цикл
    Значение = Строка[Колонка.Имя];
    Если ПерваяКолонка = 1 Тогда
    ОбластьСотрудника.Параметры.Значение = Значение;
    ТабДок.Вывести(ОбластьСотрудника);
    ПерваяКолонка = 0;
    Иначе
    Если Отчет.ТЧ.Итог(Колонка.Имя) > 0 Тогда
    ОбластьЧисловойЯчейки. Параметры.Значение = Значение;
    ТабДок.Присоединить(ОбластьЧисловойЯчейки);
    КонецЕсли;
    КонецЕсли
    КонецЦикла;
    КонецЦикла;

    Возврат ТабДок;
    КонецФункции
    &НаКлиенте
    Процедура Печать(Команда)
    Результат = ПечатьНаСервере();
    Результат.Показать();
    КонецПроцедуры
```
---
Не знаю как код красиво отформатировать
---
Напишите ваше сообщение
---
Качайте пример готовой обработки - все на скорую руку... Красоту сами наводите.
---
ТЧ вручную заполняйте и играйтесь с кнопкой печать
---
Большое спасибо, завтра попробую ПечатьТЧ.erf. А красота не проблема, когда "система" начинает работать, я сумею ее "раскрасить". Спасибо!
Кстати: быстро и красиво отформатировать текст модуля я выделяю нужный кусок/область и Shift + Alt + F
---
В конфигураторе это понятно. Я про форматирование на форуме писал.