Вывод Отчета на печать

1. ivnik 583 17.08.19 19:10 Сейчас в теме
Всем доброго дня!
Пожалуйста помогите решить проблему: есть Отчет (не на СКД), в нем есть табличная часть. Заголовки колонок формируются автоматически, в зависимости от содержимого колонок (все колонки числовые). По команде "Сформировать" заполняется эта ТЧ и в зависимости от Итогов в колонках, пустые колонки "прячутся" (Видимость=Ложь). Не могу сообразить, как вывести на печать (в макет) только видимые колонки (с заголовками как в ТЧ)??? Может быть это вааще не возможно сделать?
P.S. Управляемые формы, платформа 8.3.14, ЗУП-3.1 релиз 3.1.10.111
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
27. leosoft 165 18.08.19 15:56 Сейчас в теме +5 $m
В форме создайте реквизит Результат с типом "ТабличныйДокумент" и расположите его временно на форме, его надо заполнить на основании Вашей ТЧ. Заполнение идет с помощью макета, где описаны области заполнения "Шапка", "СтрокаТЧ" и т.п. После заполнения Вы получите полный вывод ТЧ, а потом сделайте кнопку "Удалить" и по ней удалите лишние колонки - посмотрите результат. Далее кнопку можно будет убрать и сразу формировать Результат и удалять колонки.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. user856012 13 17.08.19 20:50 Сейчас в теме
(1)
Не могу сообразить, как вывести на печать (в макет) только видимые колонки (с заголовками как в ТЧ)??? Может быть это вааще не возможно сделать?
Очень даже возможно, даже в 1С 7.7 эта задача решалась при помощи метода ПрисоединитьСекцию()

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

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

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

А так желательно на СКД все-таки сделать.
6. ivnik 583 17.08.19 21:53 Сейчас в теме
(2) На СКД сделать мозгов не хватает: ТЧ этого отчета заполняется из Документа/ов, в котором две ТЧ и в одной колонки стандартно по горизонтали, а в другой, так сказать "по вертикали" (т.е. "вертикаль" перестроена в "горизонталь" и добавлена/присоединена к колонкам первой ТЧ). Вот такая "хитрая" ТЧ в этом Отчете.
8. leosoft 165 17.08.19 22:02 Сейчас в теме
(6) Может стоит сформулировать задачку из каких документов что надо
получить и Вам подскажут как это можно сделать на СКД?
9. ivnik 583 17.08.19 22:18 Сейчас в теме
(8) Документы, из которых формируется Отчет специфические и довольно сложные по структуре и не имеют отношения к Типовому функционалу. Поэтому объяснять их содержание очень сложно и трудоемко. А в этом Отчете уже есть Табличная часть, в которой все правильно заполняется и остается только без пустографок вывести на печать.
Метод УдалитьОбласть - он полностью удаляет например колонку и сдвигает влево правые колонки или его нужно еще использовать для Строк и Подвала?
10. leosoft 165 17.08.19 23:05 Сейчас в теме
(9) Вы задаете область ("R2C2:R2C2") и определяете тип смещения По вертикали По горизонтали. Не пробовал - можно ли в качестве области задать сразу колонку. Если да - задаете ее и тип смещения по горизонтали. Посмотрите синтаксис-помощник поиском "ТабличныйДокумент"
12. user856012 13 18.08.19 01:41 Сейчас в теме
(9)
Метод УдалитьОбласть - он полностью удаляет например колонку
Как вы себе представляете указание в качестве области целиком колонки?
или его нужно еще использовать для Строк и Подвала?
Разумеется, для строк обязательно! А вот для подвала - смотря что там, в этом подвале.

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

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


Смотрите в (16)
18. user856012 13 18.08.19 12:01 Сейчас в теме
(17) ОК, осталось проверить - как будет выглядеть результат, если в шапке и подвале отчета есть объединенные ячейки - так часто делают, чтобы заголовки и подписи выводились "красиво"

Макет не видели ни вы, ни я, так что не вижу смысла дальше спорить, все в руках автора.
19. leosoft 165 18.08.19 12:05 Сейчас в теме
(18) А что тут спорить? Никакого макета нет - есть ТЧ с заголовками
колонок, ее и надо вывести. Автор же не универсальную процедуру пишет.
20. user856012 13 18.08.19 12:13 Сейчас в теме
(19)
Никакого макета нет - есть ТЧ с заголовками
колонок, ее и надо вывести.
См. (9):
его нужно еще использовать для Строк и Подвала?
7. ivnik 583 17.08.19 21:54 Сейчас в теме
Спасибо! Я попробую, поюзаю и потом напишу, что получилось.
11. leosoft 165 17.08.19 23:31 Сейчас в теме
Кстати, есть еще вариант - сформировать таблицу значений на основе ТЧ и "скормить" ее СКД. Причем можно в ТЗ выгрузить всю ТЧ, а условия наложить уже средствами СКД.
13. user596430_gleb21 3 18.08.19 04:52 Сейчас в теме
"Вывести список" не пойдет?
14. leosoft 165 18.08.19 10:35 Сейчас в теме
Вот тут посмотрите - может поможет... Предлагают ширину колонки сделать 0.
16. leosoft 165 18.08.19 11:50 Сейчас в теме
Проверил - вот такой код прекрасно сработал

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

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


Маленькая "Тонкость" - С2 надо латинским шрифтом писать.
21. ivnik 583 18.08.19 15:14 Сейчас в теме
(16) Добрый день, Леонид!
В модуле объекта ТабДок.УдалитьОбласть(Область,Смещение); выдает ошибку: Выделение не соответствует вставляемому блоку. Сейчас попробую этот Ваш последний вариант.
22. leosoft 165 18.08.19 15:30 Сейчас в теме
Учтите, что если слева направо удалять - номера колонок ("С2" - 2 это номер колонки) правее будут после удаления уменьшаться на 1
23. ivnik 583 18.08.19 15:33 Сейчас в теме
(22) Да я учитываю и номер колонки и латинский шрифт, только не клеится &НаСервереБезКонтекста, у меня процедура Печать не в форме модуля, а в модуле объекта.
24. leosoft 165 18.08.19 15:36 Сейчас в теме
А ТабДок где у Вас? Он же должен быть реквизитом формы. У меня - это "Результат", я его на форму вывел, чтобы видно было как идет удаление
26. ivnik 583 18.08.19 15:46 Сейчас в теме
(24)ТабДок у меня наверное Макет?! Но
Область = ТабДок.Область("C2");
ТабДок.УдалитьОбласть(Область,ТипСмещенияТабличногоДокумента.ПоГоризонтали);
не дает ни какого результата!!! Все остается на своем месте.
Кстати, извиняюсь, в модуле объекта у меня не Процедура Печать, а функция.
Может перетащить это все в модуль формы?
25. leosoft 165 18.08.19 15:38 Сейчас в теме
В модуле объекта не надо указывать &НаСервереБезКонтекста - он вроде как всегда на сервере.
27. leosoft 165 18.08.19 15:56 Сейчас в теме +5 $m
В форме создайте реквизит Результат с типом "ТабличныйДокумент" и расположите его временно на форме, его надо заполнить на основании Вашей ТЧ. Заполнение идет с помощью макета, где описаны области заполнения "Шапка", "СтрокаТЧ" и т.п. После заполнения Вы получите полный вывод ТЧ, а потом сделайте кнопку "Удалить" и по ней удалите лишние колонки - посмотрите результат. Далее кнопку можно будет убрать и сразу формировать Результат и удалять колонки.
29. ivnik 583 18.08.19 16:01 Сейчас в теме
(27) Большое Спасибо, сейчас попробую.
30. user856012 13 18.08.19 16:11 Сейчас в теме
(27)
Заполнение идет с помощью макета, где описаны области заполнения "Шапка", "СтрокаТЧ" и т.п. После заполнения Вы получите полный вывод ТЧ, а потом сделайте кнопку "Удалить" и по ней удалите лишние колонки
Это называется "создать себе трудности, чтобы потом их героически преодолевать".

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

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

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

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

P.S. Впрочем, кому что нравится.
31. ivnik 583 18.08.19 16:38 Сейчас в теме
(30) Мне очень интересна Ваша мысль, я сам пытался сделать так же, только не знаю, как правильно это сделать??? Видимо мозги уже засыхают. Только смущает, т.е. не пойму, что это за "макет" и почему "Макет должен содержать всего одну колонку с данными"?
33. user856012 13 18.08.19 16:43 Сейчас в теме
(31)
не пойму, что это за "макет"
Грубо говоря - заготовка печатной формы вашего отчета.

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

Откуда это будет выводиться? Или только голая таблица с данными?
34. ivnik 583 18.08.19 16:43 Сейчас в теме
35. user856012 13 18.08.19 16:44 Сейчас в теме
(34)
и шапка и подвал
И где все это находится сейчас? В табличной части?
37. ivnik 583 18.08.19 16:45 Сейчас в теме
39. user856012 13 18.08.19 16:50 Сейчас в теме
(37) Тогда идея насчет "одной колонки" не годится, я неправильно вас понял. См. (38)

P.S. Вы бы хоть макет тут выложили, а то мы второй день спорим о том, чего в глаза не видели.
36. ivnik 583 18.08.19 16:44 Сейчас в теме
(33) Этот Макет я и "нарисовал".
38. user856012 13 18.08.19 16:47 Сейчас в теме
(36) Ну, так осталось только программно создать временный Табличный документ и перенести в него только то, что нужно напечатать: шапку, нужные колонки заголовков и строк, подвал. И вывести этот документ на печать.
40. ivnik 583 18.08.19 16:57 Сейчас в теме
(38) И как правильно это сделать? У меня на печать выводится вот такая ерунда:
Прикрепленные файлы:
41. ivnik 583 18.08.19 17:05 Сейчас в теме
(40)
Прикрепленные файлы:
42. user856012 13 18.08.19 17:14 Сейчас в теме
(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 для подвала с учетом номеров их строк.
43. ivnik 583 18.08.19 17:25 Сейчас в теме
(42) Не всегда "в хвосте", иногда бывает где-либо в середине, например, ни у кого из сотрудников не заполнен параметр "Квалификация", т.е. колонка пустая, вот и желательно спрятать ее с глаз и на бумаге сэкономить место для других колонок. Но главное - не печать последние пустые колонки!
46. leosoft 165 18.08.19 18:04 Сейчас в теме
(43) Откуда у Вас пустые колонки?
При удалении колонки все сдвигается влево.
Или у Вас в макете есть пустые колонки?
Макет сфоткайте.
В макете область шапки нарисовали? Почему не вывели?
32. ivnik 583 18.08.19 16:42 Сейчас в теме
(30) А это не будет дублем того, что в Отчете уже есть заполненная ТЧ со всеми необходимыми данными и все пустые/лишние колонки уже скрыты?
28. leosoft 165 18.08.19 15:59 Сейчас в теме
На ИТС можно посмотреть книжку Радченко
https://its.1c.ru/db/pubdevguide83#content:150:hdoc
44. ivnik 583 18.08.19 17:36 Сейчас в теме
А может быть просто выгрузить табличную часть Отчета в таблицу значений, удалить там пустые колонки и эту ТЗ отправить стандартным образом на печать?
45. leosoft 165 18.08.19 17:59 Сейчас в теме
ТЗ стандартным образом на печать не выводится - только через ТабличныйДокумент. Или можно в СКД ее отправить. Но в СКД
надо будет прописывать заголовки колонок или программно
их формировать...
47. ivnik 583 18.08.19 18:11 Сейчас в теме
Да, в Макете полный набор колонок.
Прикрепленные файлы:
48. leosoft 165 18.08.19 18:17 Сейчас в теме
ОблДопл - это что за область?
Вы визуально для отладки на форму кинули Результат?
Если не удалять колонки - там что? Есть "пустые"?
Может у Вас правее в макете пустые ячейки?
49. ivnik 583 18.08.19 18:22 Сейчас в теме
(48) Да, я кинул "Результат" на форму, только он не заполняется, видимо нужно написать код для заполнения.
ОблДопл - это пробно я создал для последней колонки.
50. leosoft 165 18.08.19 18:24 Сейчас в теме
А что же у Вас заполняется "пустыми" колонками?
51. ivnik 583 18.08.19 18:27 Сейчас в теме
В Макете правее, чем Доплата9 ничего нет.
Колонки Доплата1 по Доплата9 могут быть заполнены, зависит от количества доплат назначенных сотруднику, а если их меньше 9, то и в ТЧ и в Макете пустые колонки, которые нужно удалить.
52. leosoft 165 18.08.19 18:30 Сейчас в теме
Там может это они и выводятся? Тогда их надо тоже программно удалить.
53. ivnik 583 18.08.19 18:31 Сейчас в теме
Как раз вся суть вопроса в этом - программно удалить пустые колонки.
54. leosoft 165 18.08.19 18:32 Сейчас в теме
Я так и не понял почему "Результат" не выводится? Вы вместо него что-то заполняете?
55. ivnik 583 18.08.19 18:34 Сейчас в теме
Нет, я добавил этот реквизит "Результат" на форму, но ни с чем его "не связал".
56. leosoft 165 18.08.19 18:37 Сейчас в теме
Попробуйте задать область так:
Область = ТабДок.Область("C20:С30");
Если не прокатит - в цикле по одной колонке.
Вы же выводите все куда-то? Куда? Надо бы в Результат.
Покажите код вывода...
57. ivnik 583 18.08.19 18:40 Сейчас в теме
вот, а в модуле объекта в Функции Печать() Экспорт работа с Макетом (его заполнением).
Прикрепленные файлы:
58. leosoft 165 18.08.19 18:46 Сейчас в теме
На клиенте попробуйте вместо ТабДок = ...
Результат =

Или в ПечатьНаСервере(Результат) - передаете
реквизит формы и его же передаете с модуль объекта,
а там не создаете...
Но это не обязательно.
59. ivnik 583 18.08.19 18:51 Сейчас в теме
Хорошо, буду пробовать, результат сообщу.
60. leosoft 165 18.08.19 18:54 Сейчас в теме
Но это все - если хотите визуально посмотреть.
А удаление пустых (дополнительных) через
Область = ТабДок.Область("C20:С30");
ТабДок.УдалитьОбласть(Область,ТипСмещенияТабличногоДокумента.ПоГоризонтали)
У табдок есть свойство ширинаТаблицы.
61. user596430_gleb21 3 19.08.19 16:24 Сейчас в теме
На мой взгляд, в 30 дан правильный совет.
В макете абсолютно не нужны многочисленные колонки.
И названия колонок и итоги в них элементарно получаются.
Добавьте реквизит формы, например "НевидимыеКолонки", с типом "СписокЗначений" и когда "пустые колонки "прячутся" (Видимость=Ложь)" заполните его.
Дальше заполняете ТабличныйДокумент.
62. ivnik 583 19.08.19 19:01 Сейчас в теме
(61) Довольно интересное предложение, а можно его более подробно?
63. leosoft 165 19.08.19 20:15 Сейчас в теме
(62) Тут предлагают более сложный алгоритм, но зато универсальный

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

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

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

Ну а дальше заполняем табличный документ, сначала имена колонок, затем значения ,и наконец, итоги по колонкам
65. leosoft 165 19.08.19 21:15 Сейчас в теме
Вот рабочий код

&НаСервере
Функция ПечатьНаСервере()
	 	Отчетик = РеквизитФормыВЗначение("Отчет");
		Макет = Отчетик.ПолучитьМакет("Макет");
		ТабДок = Новый ТабличныйДокумент;
		РеквизитыТЧ = Отчетик.Метаданные().ТабличныеЧасти.ТЧ.Реквизиты;
		ОбластьЗаголовок = Макет.ПолучитьОбласть("ЗаголовокКолонки");
		ОбластьЧисловойЯчейки =  Макет.ПолучитьОбласть("ЗначениеЧисловойЯчейки");
        ОбластьСотрудника = Макет.ПолучитьОбласть("ОбластьСотрудника");
		ПерваяКолонка = 1;
		Для Каждого Колонка из РеквизитыТЧ Цикл
			     ОбластьЗаголовок.Параметры.Заголовок = Колонка.Синоним; 
				 Если ПерваяКолонка = 1 Тогда
					        ТабДок.Вывести(ОбластьЗаголовок);
                            ПерваяКолонка = 0;
						Иначе
		                    Если Отчет.ТЧ.Итог(Колонка.Имя) > 0 Тогда			 
			                           ТабДок.Присоединить(ОбластьЗаголовок);
							КонецЕсли;		   
				 КонецЕсли;		  
	   КонецЦикла;
	   
	   Для Каждого Строка из Отчет.ТЧ Цикл
		        ПерваяКолонка = 1;
		        Для Каждого Колонка из РеквизитыТЧ Цикл
                         Значение = Строка[Колонка.Имя];
						 Если ПерваяКолонка = 1 Тогда
							         ОбластьСотрудника.Параметры.Значение = Значение;
							        ТабДок.Вывести(ОбластьСотрудника);
						             ПерваяКолонка = 0;
						Иначе
						            Если Отчет.ТЧ.Итог(Колонка.Имя) > 0 Тогда			 
									           ОбластьЧисловойЯчейки. Параметры.Значение = Значение;
			                                   ТабДок.Присоединить(ОбластьЧисловойЯчейки);
									КонецЕсли;		   
						КонецЕсли	 
					 КонецЦикла;
	  КонецЦикла;				 
			 
        Возврат ТабДок;
КонецФункции
&НаКлиенте
Процедура Печать(Команда)
	Результат = ПечатьНаСервере();
	Результат.Показать();
КонецПроцедуры
Показать
66. leosoft 165 19.08.19 21:17 Сейчас в теме
Не знаю как код красиво отформатировать
67. leosoft 165 19.08.19 21:20 Сейчас в теме
Напишите ваше сообщение
Прикрепленные файлы:
ПечатьТЧ.erf
68. leosoft 165 19.08.19 21:21 Сейчас в теме
Качайте пример готовой обработки - все на скорую руку... Красоту сами наводите.
69. leosoft 165 19.08.19 21:22 Сейчас в теме
ТЧ вручную заполняйте и играйтесь с кнопкой печать
70. ivnik 583 19.08.19 23:42 Сейчас в теме
(69) Большое спасибо, завтра попробую ПечатьТЧ.erf. А красота не проблема, когда "система" начинает работать, я сумею ее "раскрасить". Спасибо!
Кстати: быстро и красиво отформатировать текст модуля я выделяю нужный кусок/область и Shift + Alt + F
71. leosoft 165 20.08.19 09:33 Сейчас в теме
(70) В конфигураторе это понятно. Я про форматирование на форуме писал.
Оставьте свое сообщение

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