1с программно закрыть печатную форму
Все не раз видели, как в типовых конфигурациях, построенных на основе БСП (Библиотека стандартных подсистем), печатные формы, построенные на основе Табличного документа, выводятся в специальную форму "ПечатьДокументов". Эта форма входит в состав подсистемы "Печать" из БСП. При разработке своих печатных форм, иногда необходимо запросить у пользователя дополнительные данные необходимые для печати. Тут встает вопрос, как в этом случае вывести печатную форму в форму "Печать документа". В этой статье я рассмотрю, как реализовать вывод печатной формы в упомянутую форму из подсистемы "Печать", в случае если мы хотим перед выводом печатной формы запросить у пользователя дополнительные данные. Здесь будут рассмотрены два случая: когда реализуется печатная форма с использованием подсистемы "Дополнительные отчеты и обработки" и когда печатная форма добавляется в конфигурацию в режиме конфигуратора, т.е. вносятся изменения в типовую конфигурацию.
Форма "ПечатьДокументов" предоставляет некоторые дополнительные функции при работе с печатными формами, такие как:
- кнопка печати на принтер, непосредственно в форме;
- указание количества копий, печатной формы;
- редактирование сформированной печатной формы;
- возможность сохранения печатной формы в различные форматы данных(Excel, Word, PDF и др.);
- отправка печатной формы по электронной почте;
- удобная работа с комплектом документов.
Эта форма сейчас используется фирмой 1С во всех типовых конфигурациях для вывода печатных форм документов и элементов справочников. И конечно же нам, при разработке своих печатных форм, чтобы не выходить за рамки принятой практики, следует так же выводить свои печатные формы используя предоставляемые инструменты.
При использовании стандартных методов добавления печатных форм подсистема "Печать" все сделает за нас и выведет печатную форму, как надо. Например:
- При добавлении команды печати в документ с использованием подсистемы "Печать", нам необходимо в процедуре ДобавитьКомандыПечати описать команду печати с указанием менеджера печати, в котором реализована прцоедура Печать;
- При создании Дополнительной обработки, нам необходимо, в модуле объекта обработки в функции СведенияОВнешнейОбработке, описать команду с типом использования Вызов серверного метода и тут же реализовать процедуру Печать, которая определенным образом реализует вызов формирования печатной формы.
В подобных случаях, как я уже сказал, подсистема печать выведет сформированную нами печатную форму сама, как нужно. Подобные способы подразумевают непосредственное формирование печатной формы, т.е. передали объекты для печати в процедуру печать, сформировали табличный документ и вывели на экран.
А что если перед началом формирования табличного документа, необходимо запросить у пользователя какие-то данные? Т.е. нам необходимо показать форму. В этом случае стандартный порядок формирвоания печатной формы нарушается и нам надо думать, как же передать нашу печатную форму в форму "ПечатьДокументов".
- Когда печатная форма создается с изменение конфигурации;
- Когда печатная форма создается без изменения конфигурации, т.е. используетя подсистема "Дополнительные отчеты и обработки".
Создаем печатную форму добавляя её через конфигуратор.
Первый вариат. Через создание обработки с командой.
Этот вариант предусматривает, добавление обработки непосредственно в Объекты метаданных:
Рассмотрим вариант, когда нам необходимо реализовать печатную форму определенного объекта, например, элемента справочника. Для этого нам необходимо поработать в четырех местах обработки:
- Создать команду, которая будет вызывать форму нашей печатной формы;
- Создать саму форму;
- Создать макет печатной формы;
- Внести изменения в модуль менеджера обработки.
- Группу где хотим, чтобы команда отображалась в форме;
- Тип параметра, это как раз тот справочник или документ, печатную форму которого мы делаем;
- Режим использования параметра - Множественный. Чтобы можно было выводить печатных формы, сразу по нескольким выбранным в списке элементам.
В модуле команды открываем форму обработки передавая её выбранные элементы справочника, для которых необходимо сформировать печатные формы. Не будем тут мудровствовать лукаво и слегка подправим типовой код, который подставляется платформой в процедуру обрабокти команды:
Добавим в обработку форму, создадим реквизит формы типа СписокЗначений и необходые для нас реквизиты для ввода дополнительных параметров для печатной формы:
Мой пример, будет чисто демонстрационный, поэтому условно определимся, что моя цель вывести в печатную строку представления выбранного элемента и то количество строк, которое мы выберем в качестве дополнительного параметра на форме.
Определяем процедуру ПриСозданииНаСервере и в ней считываем из параметра, который мы передали из команды при открытии формы, список объектов для которых надо формировать печатную форму.
Создаем в форме команду Печать и пишем её обработчик, в котором вызываем функцию общего модуля УправлениеПечатьюКлиент.ВыполнитьКомандуПечати, задаем необходимые параметры этой функции, а именно:
- Менеджер печати - имя объекта в модуле менеджера, которого определена функция Печать, формирующая нашу печатную форму;
- Идентификатор - идентификатор печатной формы, которую необходимо напечатать. По этому идентификатору, мы будем в функции Печать модуля менеджера выбирать, какую печатную форму необходимо напечатать;
- Объекты печати - это непосредтвенно те объекты для которых формируются печатные формы;
- Владелец формы;
- Параметры печати - сюда мы формируем и передаем структуру с параметрами печати, тут же мы передаем наши дополнительные параметры, которые мы запросили у пользователя в форме обработки.
Собственно, вызывая функцию ВыполнитьКомандуПечати из формы обработки, мы решаем нашу задачу вывода печатной формы в форму "ПечатьДокументов". Дальше подсистема "Печать" выполнит стандартные действия и доведет выполнение до процедуры Печать, которую мы должны определить в модуле менеджере нашей обработки.
Тут все просто, не будем здесь останавливаться. Скажу лишь, что необходимо соблюсти стиль именования макета, предусмотренный подсистемой "Печать": ПФ_MXL_ <Имя печатной формы>- для макетов типа Табличный документ.Имя>
С этого момента мы выполняем стандартные действия по разработки печатных форм с использованием подсистемы "Печать" из БСП.
Второй вариант. Через реализацию команды печати.
Этот вариант, очень похож на первый по реализации печати. Отличие его в способе создания команды, которая будет выводиться в интерфейс и запускать нашу печать.
В этом случае при определении команды печати мы так же задействуем подсистему "Печать" из БСП. Вместо того, чтобы определять команду для открытия обработки в самой обработке, нам необходимо перейти в модуль менеджера, того объекта, в который мы хотим добавить печатную форму, и задать описание команды печати в процедуре ДобавитьКомандыПечати(КомандыПечати):
Здесь мы добавляем на все формы справочника(напоминаю, что мы работаем со справочником контрагенты), команду печати с названием "Печать печатной формы". И вот здесь главный момент, который надо учесть. На форму можно добавить два вида команд:
1. Вызов процедуры Печать из модуля менеджера;
2. Вызов клиентского метода.
Вот именно вызов клиентского метода нам и нужен. Клиентский метод позволит нам вызвать форму обработки, в которой мы перед печатью запросим у пользователя необходимые нам данные.
Чтобы реализовать такой вызов, необходимо при определении команды, задать для неё Обработчик(см. код выше). В Обработчик команды передается строка, содержащая путь к клиентской функции, т.е. путь к Экспортной функции общего модуля на клиенте. Именно эта функция будет вызвана, при нажатии на команду печати, которую мы добавляем на формы.
Как вы понимаете, чтобы это все заработало, необходимо создать этот самый ОбщийМодуль и определить Экспортную функцию. Поэтому пишем в нашем общем модуле следующий код:
Здесь мы делаем тоже самое, что и при первой реализации, открываем форму печатной формы, только теперь наши ДанныеДляПечати, будут содержаться в параметре переданном функции ПараметрыПечати, а точнее в его поле ОбъектыПечати.
После того, как мы открыли форму обработки, все действия аналогичны первому варианту.
Реализацию подобного варианта можно найти в типовых конфигурациях, в механизмах связанных с печатью согласия на обработку персональных данных.
Создаем дополнительную обработку.
В этом случае нам необходимо воспользоватья подсистемой "Дополнительные отчеты и обработки" из БСП.
При таком варианте решения, нам необходимо писать код, только в двух местах и все они находятся в нашей будущей дополнительной обработке:
1. Модуль объекта обработки;
2. Модуль формы обработки.
В модуле объекта пишем следующий код:
Здесь две функции и одна процедура.
Стандартная функция для Дополнительной обработки СведенияОВнешнейОбработке(), без неё система не поймет, что это дополнительная обработка. Здесь важным моментом является, указание того, что команда реализуемая в данной обработке имеет тип Открытие формы. Т.е. мы будем открывать форму, как нам и нужно. Дальше следует определение процедуры Печать и функции, которая непосредственно формирует наш табличный документ.
Тут нужно обратить внимание на то, что команда печать в этом случае должна содержать только 4 параметра, а не 5 как это при привычном определение команды печати в модуле менеджера. В данном случае отсутвует параметр для передачи Параметров печати. Поэтому нам придетя проявить изобретательность, чтобы передать помимо самих объектов, для которых формируется печатная форма, но так же и параметры которые мы запрашиваем у пользователя в форме.
И так мы определили дополнительную обработку, команда из которой будет открывать форму обработк. Поэтому следующим шагом создаем форму обработки.
В этой форме нам необходимо создать три реквизита для сохранения значений, которые нам понадобятся в дальнейшем. Назовем эти реквизиты следующим образом:
ДополнительнаяОбработкаСсылка - тип СправочникСсылка.ДополнительныеОтчетыИОбработки
ИдентификаторКоманды - тип Строка
ОбъектыНазначения - тип СписокЗначений
В модуле этой формы пишем следующий код:
В процедуре ПриСозданииНаСервере, заполняем наши три реквизита, которые мы создали для хранения параметров передаваемых в форму обработки.
Дальше определяем обработчик кнопки печать на форме. В этом обработчике нам необходимо самим открыть форму "Печать документов", для этого необходимо подготовить ПараметрыОткрытия определенной структуры. В этой структуре, как минимум должны быть определены два поля:
ИсточникДанных - ссылка на нашу дополнительную обработку в справочнике Дополнительных обработок и отчетов. Этот параметр мы сохранили из параметров формы, при создании на сервере;
ПараметрыИсточника, которые включают в себя ИдентификаторКоманды и ОбъектыНазначения:
ИдентификаторКоманды - так же сохранили при создании на сервере, это идентификатор, той команды, которая вызвала форму нашей обработки. Поэтому идентификатору, мы будем определять, что нам необходимо печатать в процедуре Печать в модуле объекта.
ОбъектыНазначения - именно в этом поле нам необходимо передать массив объектов, для которых формируется печатная форма, а так же параметры, запрашиваемые у пользователя в форме.
Как я определяю объекты назначения, можно увидеть в функции ПолучитьОбъектыНазначенияИПараметрыПечати. Здесь я копирую наши объекты назначения из реквизита формы, на место элемента массива с индексом 0, я вставляю наши параметры печати.
В дальнейшем массив определенный таким образом будет передан из формы "Печать документов", в качестве первого параметра процедуры Печать модуля объекта, которую мы определили ранее.
Если вернуться к определению модуля объекта обработки и посмотреть на функцию НапечататьМакет, в первых трех строках функции можно увидеть, как я вытаскиваю из переданных данных в процедуру Печать наши параметры и объекты и дальше с ними работаю.
Такие манипуляции с параметром ОбъектыНазначения, обусловленны спецификой вызова процедуры Печать модуля объекта. Вы можете сами отследить, как передаются параметры и выполняются вызовы функций, открыв модуль формы ПечатьДокументов.
Результат.
В итоге таких манипуляций, мы получим три команды на форме, из которой мы хотим выводить печатную форму:
Нумерация команд, соответствует порядку вариантов реализации.
Все эти команды будут выполнять одинаковые действия:
Показывать форму запроса дополнительных параметров
Выводить в форму "Печать документов" сформированные печатные форм . Как раз то, чего мы и добивались:
P.S. В качестве шаблонов, для реализации своих печатных форм с запросом дополнительных параметров, выгружаю обе обработки, которые учавствуют во всех трех способах формирования печатной формы.
Использую функцию модуля документа для получения печатной формы, но она перед возвращением открывает окно просмотра. Это не изменить. Считать как условие задачи. Как программно закрыть это окно без завершения печати ? Т.к. то, что нужно, я уже получил - табличный документ. Спасибо.
Емае . "Закройте мне веки. "(С) И свяжите мне бляруки . Торкнуло меня сегодня на вопросы. Да. Модераторы, будьте добры, исправьте заголовок на "Как программно закрыть окно печати ?" А то у общества когнитивный диссонанс случится )) 1 Стандартная в Альфе авто. РАРУС. 2 Конфу трогать не хочу. Да что там не хочу. БАЮСБЛЯ . ККолдуны писали под грибами . Затянет. 3. Дак я сам иной раз такое заверну, так что . Не суди, как говорится.
Ну, раз п1 и п3 невозможны, придется таки себя как-то пересилить про п2 :) Ибо если нет ссылки на форму и/или она модальная - вариант такой, что вариантов нет.
Чьи методы надо курить ? Печатной формы или формы окна печати ? И что такое вообще за объект метаданных - форма окна предварительного просмотра ?? Чето уже грустнею Как вот не пить то тут .
Я етить кода не могу найти . В итоге после всех переходов к определениям попадаю в общий модуль, где попадаю в функицию, которая вызывает закрытую функцию. И ПЦ ) Черный ящик раруса. Туду только параметры передаются Принтер=ложь - тогда печать с показом и тогда я отлавливаю табличный документ. А если принтер=истина - тогда просто на принтер все повалит. А открывается форма - из общих форм "ПечатнаяФормаДокументов" вот как ее отловить ?
йеетиттьь . Тут к стати на форуме проскакивала тема как определить активные или открытые окнаформы. У меня эта сулема будет сама работать в своем сеансе, так что других открытых форм не будет. как вот все активное позакрывать нах ? И гадать не надо, что конкретно.
Все, камрады, решил проблему через другой дверь. В модуле документа нашел функцию ЭКСПОТНУЮ, она печатала то, что мне нужно. Но не использовал ее потому, что не понимал, какой параметр она просит. И не понимал, как она работала, потому, что ни откуда в модуле докумнета она не вызывалась. Потом допер, что вызывалась она из защищенной функции печати а в нее передавался в качестве параметра просто НОВЫЙ табдичный документ )) потом заполнялся и возвращался. Такая вот немудреная защита у Раруса ) Вапроц закрыт.
1. В конфигураторе 1C Предприятия 8 создаем внешнюю обработку (Файл->Новый->Внешняя обработка), задаем имя.
2. В модуле обработки пишем код. Постараюсь его максимально комментировать. Главное должно быть:
- функция ПечатьВнешнейПечатнойФормы табличного документа - которая выведет данные в макет
- функция Печать - вызывается из конфигурации! в нее передается массив печатаемых объектов
- и функция СведенияОВнешнейОбработке(). Она необходима для регистрации печатной формы в справочнике ДополнительныеОтчетыИОбработки, в ней собирается структура с данными для подключения формы. Эта функция, а также ряд сопутствующих ей, практически одинаковы для всех печатных форм, поэтому их можно просто копировать в новую печатную форму ничего не меняя.
3. Добавляем макет вывода печатной формы:
4. Сохраняем и добавляем в конфигурацию:
Подключается через Администрирование - Печатные формы, отчеты и обработки:
Создаете новую обработку, записывайте и при открытии документа Реализация, нажав на Печать - появляются доступные печатные формы с разными подписывающими.
Похожие FAQ
Как заполнить табличную часть формы программно? 8
Нужно по кнопке Заполнить - сформировать данные для заполнения табличных частей и заполнить их. Форма имеет вид: Рядом с кнопкой Записать и закрыть добавлена кнопка Заполнить документ , код ее команды: // Код заполнения ТЧ НаСервере П 17 правил для составления оптимального ЗАПРОСа к данным базы 1С 44
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ 1C и Google Maps 21
была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во время решения задачи было реш 1C: Enterprise Development Tools 50
И вот случилось долгожданное: Вышел 1C: Enterprise Development Tools - это среда для разработки конфигурации в IDE Eclipse. С сайта 1С: « 1C:Enterprise Development Tools » – это инструмент нового поколения для разработчиков бизнес-приложений систем 1С Предприятие что это? 12
Что такое 1С? 1С — это фирма , у которой одно из направлений деятельности — разработка программного обеспечения для автоматизации бизнес-процессов предприятий. « 1С:Предприятие » - конкретный продукт, который выпускает компания 1С . Что такое Посмотреть все результаты поиска похожих
Часто возникает не совсем правильная, но такая необходимая потребность сфомировать печатную форму непроведенного документа.
- Открыть любую ВПФ.
- Создать пустую форму
- В модуль формы вставить код
- В модуле Объекта "ВызовСерверногоМетода" заменить на "ОткрытиеФормы"
- Доработать экспортную процедуру "Печать"
Специальные предложения
Добрый день. В чем отличия формирования внешней печатной формы для непроведенного и проведенного документа? В том, и то случаю, документ уже записан в базу и имеют ссылку.
(1) Здравствуйте, если документ непроведен, то система не дает сформировать печатную форму без предварительного проведения документа. Это лишние вопросы, движения, время. Эта обработка решает эту задачу. Да данная версия работает, когда документ уже имеет ссылку, надо попробовать печать без существования документа, как было в 1с7 по контексту.
Здравствуйте, если документ непроведен, то система не дает сформировать печатную форму без предварительного проведения документа. Это лишние вопросы, движения, время. Эта обработка решает эту задачу. Да данная версия работает, когда документ уже имеет ссылку, надо попробовать печать без существования документа, как было в 1с7 по контексту.
Добрый день. Не понятно, как это не дает? Какая конфигурация? Какая версия БСП? Проверил на 5 разных конфигурациях (УТ11, Розница 2.2, БП3.0, ЗУП3.1, УСЦ1.6) и все прекрасно работает и выдает печатную форму, даже когда документ не проведен (но записан и есть ссылка).
Вот печать без существования документа (то есть, ссылки еще не существует) довольно интересная задача. А то, что есть у Вас, обычная задача по формированию печатной формы с помощью БСП, "решения" я никакого не вижу. Да и открытие формы необходимо только тогда, когда пользователю надо дать возможность указать дополнительные данные для печати.
Проверил на 5 разных конфигурациях (УТ11, Розница 2.2, БП3.0, ЗУП3.1, УСЦ1.6) и все прекрасно работает и выдает печатную форму, даже когда документ не проведен (но записан и есть ссылка)
вот пример УТ 11.2.3.185, не хочет. без проведения
(6) Про данную конфигурацию согласен. Опять же, в конфигурации "Бухгалтерия предприятия, ред. 3.0" все спокойно печатается. В УТ11 это скорее "атовизм", чем правило, ибо данное правило БСП уже отменили. И кстати, в УТ11.3, которая есть на работе (типовая полностью), печать непроведенных доступна.
Посмотрел у себя в одной из ВПФ -- сделано так же (видимо, источник копипаста имеет общие корни), но вместо "ОткрытияФормы" используется "ВызовКлиентскогоМетода". Это позволяет избавиться от фиктивного использования формы, которая в Вашем случае закрывается сразу же в событии ПриОткрытии(). Код из ПриОткрытии расположен в единственной процедуре Печать() модуля формы.
Зато в Вашем случае, как я понимаю, можно использовать открытую форму (если не закрывать её сразу) для установки каких-то интерактивных параметров перед печатью?
(2) Вы правы, в шапке указан источник, который был взят за основу. Как раз в нем и говорится, как сделать так, чтобы передавать параметры в управляемую форму при открытии, но частенько пользователям этого не нужно, им просто нужна печать непроведенного документа.
Столкнулся с такой же проблемой. Сделал так:
1. В модуле объекта вместо "ОткрытияФормы" прописал "ВызовКлиентскогоМетода";
2. В модуле формы создал экспортную процедуру Печать
3. Добавил серверную процедуру для формирования коллекции печатных форм
4. пришлось еще добавить в форму процедуру ПодготовитьКоллекциюПечатныхФорм т.к. в модуле УправлениеПечатью она не экспортная
Рассмотрим настройку и создание новых печатных форм в системе 1С 8.3.
Создание внешних печатных форм для управляемого приложения рассмотрено в отдельной статье.
Самый простой способ создания печатной формы — с помощью встроенного конструктора печатных форм. Рассмотрим пошаговую инструкцию по созданию и настройке печатной формы на примере создания печатной формы «Счет покупателю».
Создание и настройка печатной формы 1С 8.3
Первый шаг — необходимо зайти в палитру свойств нужного нам документа и выбрать Действия — Конструкторы — Конструктор печати:
Первый вопрос системы — выбор варианта работы конструктора. Настройки аналогичны, если у Вас конфигурация работает в управляемом режиме — выберите его, если нет — выберите обычные формы. Мы рассмотрим создание на обычной форме.
Следующий шаг — выбор названия процедуры для печати. Назовём её «Печать счета».
Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания - попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>
Далее необходимо выбрать реквизиты, которые нужно указать в шапке печатной формы в том порядке, который нам необходим:
После выбора реквизитов шапки печатной формы 1С 8.2 следует сделать выбор данных для табличной части:
Когда и этот шаг сделан, нужно выбрать реквизиты подвала аналогично реквизитам в шапке.
На последней странице можно оставить всё по умолчанию и нажать ОК:
Что получаем в итоге?
Правильно оформленный макет печатной формы:
Процедура, полностью формирующая печатную форму документа:
Которые можно настроить в 1С 8.2, как нужно нам.
Вывод вызова созданной печатной формы 1С
Для вызова созданной печатной формы нужно просто разместить кнопку на форму документа. Это сделать очень просто. Для начала создадим кнопку на форме, назовем её «Печать счета»:
Нажимаем на кнопку «лупы» у действия — мы попадем в модуль формы, где вписываем вызов процедуры печати вновь созданного счета:
Где «ПечатьСчета» — имя нашей процедуры.
Созданная и настроенная печатная форма выглядит так:
Другие статьи по 1С:
В дополнение — наш видеоурок по созданию внешних печатных форм и подключению их на примере конфигурации 1С Бухгалтерии:
Читайте также: