gifts2017

Возвращаясь к напечатанному…, или опять про массовую печать документов в 1С 7.7

Опубликовал Gimalaj Gimalaev (gimalaj) в раздел Печать - Пакетная печать

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

Вопрос о необходимости распечатывания в 1С большого количества документов поднимался не раз, и в сети можно найти немалое количество обработок, посвященных решению данной проблемы. Данный вопрос не так давно встал и передо мной в следующей постановке: «Мне нужна обработка, позволяющая распечатать много накладных, печатная форма – “ТОРГ-12 (форма 2011г.)” (есть у нас такая внешняя печатная форма – прим. автора)».

Не мудрствуя лукаво, беру за основу ту самую внешнюю печатную форму, вешаю на диалоговое окно всякие красивости для отбора накладных, подправляю код и, вуаля - все готово! Дальше - больше: «А еще мне нужно массово распечатывать эти накладные, но в печатной форме “ТОРГ-12 (Пром)” (есть у нас и такая внешняя печатная форма – прим. автора). Тут уже нужно было что-то делать более универсальное на случай, если через некоторое время понадобятся опять или новые документы, или новые печатные формы.

Выход я нашел следующий: классы! Суть: каждую внешнюю печатную форму оборачиваем в класс и вызываем его из обработки массовой печати документов. Доработки внешней печатной формы под класс совсем небольшие и занимают меньше времени, чем их описание в этой статье. А доработать необходимо следующее:

  • - объявляем экспортными переменную «Докум» и процедуру «Печать()»;
  • - решительно удаляем процедуру «ПриОткрытии()»;
  • - исходную таблицу копируем из обработки в файл «.mxl» (поскольку класс не увидит ее внутри обработки, на то он и класс) и, соответственно, заменяем выражение типа «Таблица.ИсходнаяТаблица(«Таблица»);» на выражение типа «Таблица.ИсходнаяТаблица(глКаталогПечФорм + «Торг12.mxl»);»;
  • - чтобы получить одну портянку с кучей документов, а не кучу портянок по одному документу, убираем объявление типа «Таблица = СоздатьОбъект(«Таблица»);» и «Таблица.ИсходнаяТаблица(глКаталогПечФорм + «Торг12.mxl»);» из процедуры «Печать()» и вставляем его в модуль обработки (добавляем в конец модуля). Соответственно, переменную «Таблица» объявляем переменной модуля;
  • - также убираем из процедуры «Печать()» выражение типа «Таблица.Показать()», вместо этого добавляем экспортную процедуру «Показать()» с единственной строкой: «Таблица.Показать();». Этот метод будем вызывать после цикла с методом «Печать();
  • - для того, чтобы новый документ печатался на новой странице, в конце процедуры «Печать()» добавляем строку типа «Таблица.НоваяСтраница()»;
  • - проверяем модуль на наличие строк типа «Таблица.ПовторятьПриПечатиСтроки();».  Иначе будет сюрприз!
  • - ну и естественно, предусмотреть загрузку внешней компоненты 1срр.dll (если она у вас до сих пор не предусмотрена) и описать классы в defcls.prm.

В результате мы имеем:

  1. Обработка является универсальной - ее можно внедрить в любую конфигурацию.
  2. С помощью примера, приведенного в  данной обработке, можно распечатать любой документ в любой внутренней или внешней печатной форме. При выходе в свет новой печатной формы она элементарно добавляется в обработку.
  3. Код обработки стал до предела кратким и понятным (и содержит порядка сотни строк). Для добавления нового документа нужно добавить лишь несколько строк кода в конец модуля путем копи-паста. Для добавления новой печатной формы к уже существующему документу нужно добавить всего одну строку кода.
  4. Для непосвященных в ООП это отличный пример, что такое классы и как их применять на практике.

Если процедура вывода на печать находится в модуле формы документа, то логика работы та же самая: процедуру «Печать()» копируем и оборачиваем в класс. Правда, здесь доработок будет побольше: нужно будет добавить ссылку на документ (т.е. то, что передается контекстом во внешнюю печатную форму).

Недостатки: я уже написал по поводу строк кода типа «Таблица.ПовторятьПриПечатиСтроки();», с помощью которых выводится на следующую страницу заголовок табличной части документа. Поскольку у меня подавляющее большинство документов помещалось на одной странице, я закомментировал эти строки и убрал колонтитулы из печатных форм. Если кому-нибудь понадобится выводить эти строки - обработку надо будет доработать. Но это недостаток конкретной реализации, а не самой идеи.

Скачать файлы

Наименование Файл Версия Размер
Демо-конфигурация с примером 31
.rar 3,26Mb
06.07.12
31
.rar 3,26Mb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Епрст (Ёпрст) 09.07.12 09:02
Наиболее подходящая для этих целей обработка от Ёпрст (Печать внешних форм документов для 7.7) не выводит печатную форму на экран

Вранье!
Еще как выводит, там даже галка есть - выводить на просмотр.
2. Епрст (Ёпрст) 09.07.12 09:08
Ну и в догонку минусы:

-печать только одной формы для каждого документа
-печать только 1 вида документа
-печать сразу на конкретный принтёр не предусмотрена.

ЗЫ:
В моей поделке, печатать можно комплект печатных форм (который у каждого вида документов свой)
+печать на конкретный выбранный принтёр + предварительный просмотр на экран, при желании
+запись в файло при желании + МФ

+ писать руктями ничего не надо.
3. Gimalaj Gimalaev (gimalaj) 09.07.12 09:51
(1) Ёпрст,
Тогда извини, не увидел.
4. Gimalaj Gimalaev (gimalaj) 09.07.12 09:58
(2) Ёпрст,
Цель этой статьи - не засунуть печать всех документов в одну обработку, а показать еще один способ, как это можно сделать. Перечисленные минусы - это минусы конкретной реализации, а не самой идеи. При желании все указанное можно добавить в обработку.


-печать только одной формы для каждого документа
-печать только 1 вида документа

Тут уже ваша неправда, все это добавляется как указано в статье. Да и в самом примере включено два документа и две печатных формы на документ.
5. Епрст (Ёпрст) 09.07.12 11:48
(4) не верю.

Из скриншота видно, что выбрать можно только один вид документа и только одну печатную форму у этого вида документа.
6. Gimalaj Gimalaev (gimalaj) 09.07.12 12:02
(5) Я изложил идею, а обработку можно доработать. Если вы так настойчивы, я доработаю...
7. Епрст (Ёпрст) 09.07.12 12:05
(6) идея не очень..Слишком много переделок, бухи не оценят.
ЗЫ: я всего лишь прокомментил скриншот к обработке.
8. Епрст (Ёпрст) 09.07.12 12:06
+7 сами классы то где хранить собираешься ? В мд ? Во внешних файлах ?..
9. Gimalaj Gimalaev (gimalaj) 09.07.12 12:27
(7) Форум-то не для бухов, а для программистов. Бухи печатать будут, а не оценивать )
(8) Класс - это копия файла внешней печатной формы, у меня - в отдельной папке.
10. Епрст (Ёпрст) 09.07.12 13:03
(9) кодеры тем более не оценят - никакой универсальности + все формы переделывать.
11. Gimalaj Gimalaev (gimalaj) 09.07.12 13:52
(10) Переделывать нужно не все, а только нужные, и сама переделка занимает несколько минут.
12. Епрст (Ёпрст) 09.07.12 13:56
(11) как ты будешь оценивать "нужность" печатной формы ?
Нужные, это какие ?
По определению - все печатные формы документа.
А бухам главное - печать комплекта документов.. т.е на один документ чтоб сразу печаталось ттн,торг12,счетфактура, приложения, справки ,счет и т.д..

+отбор
13. Gimalaj Gimalaev (gimalaj) 09.07.12 15:43
(12)
- как ты будешь оценивать "нужность" печатной формы ?
Да никак не буду. Буду исходить из поставленной задачи: какую форму нужно будет - ту и подцеплю.

- бухам главное - печать комплекта документов.. т.е на один документ чтоб сразу печаталось ттн,торг12,счетфактура, приложения, справки ,счет и т.д..
Далеко не всегда. Зачастую бывает нужно именно один какой-то вид перепечатать (ошибка закралась и т.п.)
14. Александр Рытов (Арчибальд) 10.07.12 10:17
Слушай Ёпрста! (с) Арчибальд.
В самом деле, если под каждый чих начинать программировать... пусть даже это пара строчек... а уж классы заводить... Это умножение сущности без необходимости.

Кроме упомянутой печати от Ёпрста есть еще и http://infostart.ru/public/78895/ и http://infostart.ru/public/78036/.
15. Вадим Никонов (V.Nikonov) 11.07.12 09:05
К тому же, в ТиС_7.7 "ГрупповаяОбработкаСправочниковДокументов" без проблем печатает документы (форма по умолчанию). Доработать такую функцию под аналогичную обработку из других конфигураций не составит особых проблем...
16. Вадим Никонов (V.Nikonov) 11.07.12 09:17
Более ценными является внешняя печатная форма документа сособная отпечатать комплект форм! Например, к реализации напечатать Складскую форму и две Торг12. Еще лучше, если можно добавлять подчинённые документы, например, Счет-Фактуру...
Разумеется настройка комплекта должна быть гибкой и универсальной!
17. Епрст (Ёпрст) 11.07.12 09:32
(16) это всё есть в моей поделке
Арчибальд; +1 Ответить 1
18. Вадим Никонов (V.Nikonov) 11.07.12 09:40
(17) Ёпрст, уточню: Пользователь настраивает комплект под вид документа, затем печатает сформированный список комплектом. Причем настроеный набор комплекта поминится до следующей перенастройки.
В Вашем случае сначала печатается один набор, затем другой... Разумеется, в случае нескольких печатных форм на документ, наступает очередь "сортировщика" (человек должен рассортировать по комплектам/Документам распечатки)...
Да и поиск связанных документов отсутствует. Например по Накладной не распечатать СчетаФактуры.
19. Епрст (Ёпрст) 11.07.12 09:50
(18) это всё есть в моей поделке - для каждого вида настраивается полный комплект внешних печатных форм, они разом печатаются.
+ все настройки запоминаются
20. Епрст (Ёпрст) 11.07.12 09:52
>>>Например по Накладной не распечатать СчетаФактуры.

еще как распечатать, достаточно сделать внешнюю форму счет фактуры и "привязать" её сразу к 2-м документам - к реализации и к счетфактуре (у нас так сделано давно).
И печатать из документа реализация сразу весь комплект.
21. Gimalaj Gimalaev (gimalaj) 11.07.12 19:11
(14), (20)
Я понимаю, что Ёпрст - чувак авторитетный (без иронии ;)), и что ваши обработки функциональней моей и готовы к использованию сразу после скачивания. Cел я за нее потому, что знал, что с Инфостарта просто так (без $m) файлы не скачать. Возможность бесплатного скачивания обработки от Ёпрст я обнаружил только после публикации статьи. Поэтому публикация может служить руководством к действию прежде всего тем, у кого нет возможности качать файлы отсюда.
22. Вадим Никонов (V.Nikonov) 11.07.12 19:17
(21) gimalaj, Это скорее идеи для дальнейшего развития.
Лично у меня не доходят руки до универсальной внешней ПечатнойФормы (под 7.7). Такой, что бы считала имеющиеся Печ.Формы, позволила отобрать из них нужный комплект (в т.ч. Подцепила формы подчинённых документов, СчФактуру), затем печатала отобраный комплект при вызове обычной печати.
23. Gimalaj Gimalaev (gimalaj) 11.07.12 19:19
(1) Ёпрст,
"- Наиболее подходящая для этих целей обработка от Ёпрст (Печать внешних форм документов для 7.7) не выводит печатную форму на экран

- Еще как выводит, там даже галка есть - выводить на просмотр. "

Запустил я твою обработку, чтобы посмотреть, как выводит. Она выводит кучу портянок, содержащих по одному документу. Для этого можно было вообще не заморачиваться с классами, а просто в цикле вызывать ВПФ. Я и сел-то за нее для того, чтобы выводить на экран одну портянку, содержащую все документы.

(15) V.Nikonov,
Она выводит кучу печ.форм в которых содержится по одному документу. У меня выводится одна портянка со всеми документами.
Арчибальд; +1 Ответить 1
24. Gimalaj Gimalaev (gimalaj) 13.07.12 13:10
Товарищи комментаторы, ухожу в отпуск, две недели отвечать на ваши комментарии не буду.
25. Епрст (Ёпрст) 13.07.12 13:49
(23) а смысл в "одной" общей таблице ?
Как печатать комплект ?
Правильно - никак.
26. Епрст (Ёпрст) 13.07.12 13:50
Да и на экране никто смотреть ЭТО не будет.. максимум - показ одного документа, а когда их 100 и больше - всё отправляется на печать и привет.