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

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

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

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

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

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

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

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

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

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

26 Comments

  1. Ёпрст

    Наиболее подходящая для этих целей обработка от Ёпрст (Печать внешних форм документов для 7.7) не выводит печатную форму на экран

    Вранье!

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

    Reply
  2. Ёпрст

    Ну и в догонку минусы:

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

    -печать только 1 вида документа

    -печать сразу на конкретный принтёр не предусмотрена.

    ЗЫ:

    В моей поделке, печатать можно комплект печатных форм (который у каждого вида документов свой)

    +печать на конкретный выбранный принтёр + предварительный просмотр на экран, при желании

    +запись в файло при желании + МФ

    + писать руктями ничего не надо.

    Reply
  3. gimalaj

    (1) Ёпрст,

    Тогда извини, не увидел.

    Reply
  4. gimalaj

    (2) Ёпрст,

    Цель этой статьи — не засунуть печать всех документов в одну обработку, а показать еще один способ, как это можно сделать. Перечисленные минусы — это минусы конкретной реализации, а не самой идеи. При желании все указанное можно добавить в обработку.

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

    -печать только 1 вида документа

    Тут уже ваша неправда, все это добавляется как указано в статье. Да и в самом примере включено два документа и две печатных формы на документ.

    Reply
  5. Ёпрст

    (4) не верю.

    Из скриншота видно, что выбрать можно только один вид документа и только одну печатную форму у этого вида документа.

    Reply
  6. gimalaj

    (5) Я изложил идею, а обработку можно доработать. Если вы так настойчивы, я доработаю…

    Reply
  7. Ёпрст

    (6) идея не очень..Слишком много переделок, бухи не оценят.

    ЗЫ: я всего лишь прокомментил скриншот к обработке.

    Reply
  8. Ёпрст

    +7 сами классы то где хранить собираешься ? В мд ? Во внешних файлах ?..

    Reply
  9. gimalaj

    (7) Форум-то не для бухов, а для программистов. Бухи печатать будут, а не оценивать )

    (8) Класс — это копия файла внешней печатной формы, у меня — в отдельной папке.

    Reply
  10. Ёпрст

    (9) кодеры тем более не оценят — никакой универсальности + все формы переделывать.

    Reply
  11. gimalaj

    (10) Переделывать нужно не все, а только нужные, и сама переделка занимает несколько минут.

    Reply
  12. Ёпрст

    (11) как ты будешь оценивать «нужность» печатной формы ?

    Нужные, это какие ?

    По определению — все печатные формы документа.

    А бухам главное — печать комплекта документов.. т.е на один документ чтоб сразу печаталось ттн,торг12,счетфактура, приложения, справки ,счет и т.д..

    +отбор

    Reply
  13. gimalaj

    (12)

    — как ты будешь оценивать «нужность» печатной формы ?

    Да никак не буду. Буду исходить из поставленной задачи: какую форму нужно будет — ту и подцеплю.

    — бухам главное — печать комплекта документов.. т.е на один документ чтоб сразу печаталось ттн,торг12,счетфактура, приложения, справки ,счет и т.д..

    Далеко не всегда. Зачастую бывает нужно именно один какой-то вид перепечатать (ошибка закралась и т.п.)

    Reply
  14. Арчибальд

    Слушай Ёпрста! (с) Арчибальд.

    В самом деле, если под каждый чих начинать программировать… пусть даже это пара строчек… а уж классы заводить… Это умножение сущности без необходимости.

    Кроме упомянутой печати от Ёпрста есть еще и http://infostart.ru/public/78895/ и http://infostart.ru/public/78036/.

    Reply
  15. V.Nikonov

    К тому же, в ТиС_7.7 «ГрупповаяОбработкаСправочниковДокументов» без проблем печатает документы (форма по умолчанию). Доработать такую функцию под аналогичную обработку из других конфигураций не составит особых проблем…

    Reply
  16. V.Nikonov

    Более ценными является внешняя печатная форма документа сособная отпечатать комплект форм! Например, к реализации напечатать Складскую форму и две Торг12. Еще лучше, если можно добавлять подчинённые документы, например, Счет-Фактуру…

    Разумеется настройка комплекта должна быть гибкой и универсальной!

    Reply
  17. Ёпрст

    (16) это всё есть в моей поделке

    Reply
  18. V.Nikonov

    (17) Ёпрст, уточню: Пользователь настраивает комплект под вид документа, затем печатает сформированный список комплектом. Причем настроеный набор комплекта поминится до следующей перенастройки.

    В Вашем случае сначала печатается один набор, затем другой… Разумеется, в случае нескольких печатных форм на документ, наступает очередь «сортировщика» (человек должен рассортировать по комплектам/Документам распечатки)…

    Да и поиск связанных документов отсутствует. Например по Накладной не распечатать СчетаФактуры.

    Reply
  19. Ёпрст

    (18) это всё есть в моей поделке — для каждого вида настраивается полный комплект внешних печатных форм, они разом печатаются.

    + все настройки запоминаются

    Reply
  20. Ёпрст

    >>>Например по Накладной не распечатать СчетаФактуры.

    еще как распечатать, достаточно сделать внешнюю форму счет фактуры и «привязать» её сразу к 2-м документам — к реализации и к счетфактуре (у нас так сделано давно).

    И печатать из документа реализация сразу весь комплект.

    Reply
  21. gimalaj

    (14), (20)

    Я понимаю, что Ёпрст — чувак авторитетный (без иронии ;)), и что ваши обработки функциональней моей и готовы к использованию сразу после скачивания. Cел я за нее потому, что знал, что с Инфостарта просто так (без $m) файлы не скачать. Возможность бесплатного скачивания обработки от Ёпрст я обнаружил только после публикации статьи. Поэтому публикация может служить руководством к действию прежде всего тем, у кого нет возможности качать файлы отсюда.

    Reply
  22. V.Nikonov

    (21) Это скорее идеи для дальнейшего развития.

    Лично у меня не доходят руки до универсальной внешней ПечатнойФормы (под 7.7). Такой, что бы считала имеющиеся Печ.Формы, позволила отобрать из них нужный комплект (в т.ч. Подцепила формы подчинённых документов, СчФактуру), затем печатала отобраный комплект при вызове обычной печати.

    Reply
  23. gimalaj

    (1) Ёпрст,

    «- Наиболее подходящая для этих целей обработка от Ёпрст (Печать внешних форм документов для 7.7) не выводит печатную форму на экран

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

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

    (15) V.Nikonov,

    Она выводит кучу печ.форм в которых содержится по одному документу. У меня выводится одна портянка со всеми документами.

    Reply
  24. gimalaj

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

    Reply
  25. Ёпрст

    (23) а смысл в «одной» общей таблице ?

    Как печатать комплект ?

    Правильно — никак.

    Reply
  26. Ёпрст

    Да и на экране никто смотреть ЭТО не будет.. максимум — показ одного документа, а когда их 100 и больше — всё отправляется на печать и привет.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *