Программирование печати внешних форм в 1С 8.3
Ранее мною была рассмотрена печать внешних форм из управляемых форм в 1С. Но теперь я хочу рассмотреть программирование печати внешних форм в непривычной для меня среде – 1С:УПП редакции 1.3. Это стало возможным, благодаря функционалу отображения управляемых форм в обычном режиме. Продолжим нашу работу над нашей внутренней внешней обработкой печати документов в виде списком. Приступаем к добавлению в нее функционала печати документов.
Настройка печати внешних форм
Начнем с малого – настроим кнопку печати на форме списка документов. Напомню, что в стандартной поставке УПП нет раздельного функционала печати документов, поэтому наилучшим выходом является создание внешней печатной формы. Внешнюю печатную форму будем наименовать стандартно – ″ПечатьДокумента″.
Далее, переходим к коду формы. Необходимо добавить несколько строк кода.
nНаКлиенте
Процедура КнопкаПечать(Команда)
Сообщить(″Hello world!″);
ФайлПечати ПолучитьИмяВременногоФайла;
Если ПечатьДокумента.Напечатать(ФайлПечати) Тогда
РаспечататьФайл(ФайлПечати);
КонецЕсли;
КонецПроцедуры
Собственно, данная процедура вызывается при нажатии на кнопку ″Печать″ в форме списка документов. При печати документа вызывается внешняя печатная форма ″ПечатьДокумента″.
В свою очередь, модуль внешней печатной формы должен быть следующим.
nНаКлиенте
Функция Напечатать(ИмяФайла) Экспорт
ФайлПечати Новый Файл(ИмяФайла);
Макет Новый МакетКомпоновкиДанных;
Макет.Параметры.Вставить(″Организация″, Организация);
Макет.Параметры.Вставить(″ДокументСсылка″, ДокументСсылка);
Макет.ИсточникДанных.УстановитьПустуюСтруктуру(″ДокументПечать″);
Макет.Заполнить(Структура(″ДокументПечать″, ДокументСсылка));
ДокументПечать Макет.Выгрузить;
ДокументПечать.Записать(ФайлПечати);
ФайлПечати.Закрыть;
Возврат Истина;
КонецФункции
Теперь немного о пользовательском интерфейсе. В свойствах формы списка необходимо включить признак ″Отображать панель действий форм″. После этого, в нижней части формы будет создана панель действий. На нее необходимо перенести кнопку печати. Ее свойства должны быть такими:
– Команда: КнопкаПечать;
– Подменю: Печать;
– Видимость: Истина.
Данная настройка позволяет пользователю в какой угодно момент вызвать печать документа, потому что кнопка печати всегда находится в поле его видимости, независимо от того, какие элементы формы он в настоящий момент использует.
События форм
Следующий этап нашей работы будет связан с тем, как мы будем заполнять наш макет компоновки. Сегодня мы рассмотрим, как это делать программно и с использованием событий форм.
Перенесемся немного назад, к коду формы списка. В данном примере, мы будем предполагать, что при печати документа был выбран определенный документ (выбор будет произведен в шапке формы списка). Для примера создадим следующую процедуру в модуле формы списка.
nНаКлиенте
Процедура КнопкаПечать(Команда)
Если ДокументСписок.ТекущаяСтрока Неопределено Тогда
ТекущийДокумент ДокументСписок.ТекущаяСтрока.Документ;
Сообщить(″Hello world!″);
ФайлПечати ПолучитьИмяВременногоФайла;
Если ПечатьДокумента.Напечатать(ФайлПечати, ТекущийДокумент) Тогда
РаспечататьФайл(ФайлПечати);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Как мы видим, в процедуру ″КнопкаПечать″ был добавлен один параметр – ″ТекущийДокумент″. Данный параметр будет содержать ссылку на документ, который мы собираемся печатать. Внешняя печатная форма должна быть доработана аналогичным образом.
В данном случае мы в клиентской процедуре ″Напечатать″ внешней печатной формы получим данные следующим образом.
nНаКлиенте
Функция Напечатать(ИмяФайла, Документ) Экспорт
ФайлПечати Новый Файл(ИмяФайла);
Макет Новый МакетКомпоновкиДанных;
Макет.Параметры.Вставить(″Организация″, Организация);
Макет.Параметры.Вставить(″ДокументСсылка″, Документ);
Макет.ИсточникДанных.УстановитьПустуюСтруктуру(″ДокументПечать″);
Макет.Заполнить(Структура(″ДокументПечать″, Документ));
ДокументПечать Макет.Выгрузить;
ДокументПечать.Записать(ФайлПечати);
ФайлПечати.Закрыть;
Возврат Истина;
КонецФункции
Как мы видим, в клиентскую процедуру ″Напечатать″ был добавлен второй параметр – ″Документ″. Теперь при вызове внешней печатной формы мы можем передавать ссылку на документ, который собираемся печатать.
В итоге, наша кнопка печати будет срабатывать при выборе строки в форме списка и выполнять печать того документа, который был выбран в форме списка. Это более правильно, чем просто выводить на печать первый документ из списка.
Партионная печать
Наверное, рано или поздно возникает вопрос – как распечатать несколько (или все) документов из формы списка? В стандартной УПП нет такой возможности, поэтому реализуем ее самостоятельно.
Для реализации партионной печати потребуется внести некоторые изменения в код формы списка.
Прежде всего необходимо добавить новую кнопку на форму списка. В данном примере ее назовем ″Печать списка″. Свойства кнопки должны быть следующие:
– Команда: КнопкаПечатьСписка;
– Подменю: Печать;
– Группа: Дополнительные действия;
– Видимость: Истина.
После этого необходимо добавить в модуль формы следующий код.
nНаКлиенте
Процедура КнопкаПечатьСписка(Команда)
СписокДляПечати СоздатьОбъект(″СписокЗначений″);
КоличествоВыделенныхСтрок ДокументСписок.КоличествоВыделенныхСтрок;
Для Каждой Строка Из ДокументСписок.ВыделенныеСтроки Цикл
СписокДляПечати.Добавить(Строка.Документ);
КонецЦикла;
ФайлПечати ПолучитьИмяВременногоФайла;
Если ПечатьДокументов.Напечатать(ФайлПечати, СписокДляПечати) Тогда
РаспечататьФайл(ФайлПечати);
КонецЕсли;
КонецПроцедуры
Вначале мы создаем список значений для хранения ссылок на документы, которые необходимо распечатать. Затем заполняем этот список ссылками на документы из выделенных строк в форме списка. В результате, при нажатии на кнопку ″Печать списка″ будет сформирован и распечатан общий список документов.
Далее, нам необходимо создать внешнюю печатную форму ″ПечатьДокументов″. В данной внешней печатной форме мы обойдемся без пользовательского интерфейса (хотя при желании его можно добавить), поэтому в модуле формы оставим только модуль объекта.
nНаКлиенте
Функция Напечатать(ИмяФайла, Документы)
ФайлПечати Новый Файл(ИмяФайла);
Для Каждого Документ Из Документы Цикл
Макет Новый МакетКомпоновкиДанных;
Макет.Параметры.Вставить(″Организация″, Организация);
Макет.Параметры.Вставить(″ДокументСсылка″, Документ);
Макет.ИсточникДанных.УстановитьПустуюСтруктуру(″ДокументПечать″);
Макет.Заполнить(Структура(″ДокументПечать″, Документ));
ДокументПечать Макет.Выгрузить;
ДокументПечать.Записать(ФайлПечати);
КонецЦикла;
ФайлПечати.Закрыть;
Возврат Истина;
КонецФункции
Данная функция внешней печатной формы обойдет все документы из переданного ей списка и сформирует и запишет в поток вывода документы.
В результате, мы научились в нашей внешней печатной форме выводить на печать либо один документ, либо список документов в зависимости от выбранного нами режима вывода.
Модификация управляемых форм
В некоторых случаях для реализации печати внешних форм из формы списка требуется внести некоторые изменения в конфигурацию, а именно изменить управляемую форму формы списка. Рассмотрим, как это можно сделать на примере формы списка ″Реализация товаров и услуг″.
Для редактирования формы необходимо перейти в конфигуратор, открыть в дереве конфигурации форму списка ″Реализация товаров и услуг″ и переключиться в режим управляемого приложения. Далее, необходимо добавить команду печати в нижнюю панель действий формы. Для этого воспользуемся кнопкой ″Добавить″ на панели управления. В качестве элемента формы выберем ″Команда формы″ и назовем ее ″Печать″.
После этого необходимо добавить код в событие ″ПриНажатии″ для созданной команды формы. Данный код должен вызывать процедуру на сервере (в модуле формы). Код для события ″ПриНажатии″ будет следующим.
nНаКлиенте
Процедура КомандаПечатьНажатие(Команда)
ВызватьСерверныйМетод(″Печать″, НачальнаяФорма);
КонецПроцедуры
Теперь необходимо создать соответствующую серверную процедуру ″Печать″. Код процедуры будет следующим.
nНаСервере
Процедура Печать(НачальнаяФорма)
ОткрытьФорму(″Обработка.ПечатьВнешнихФорм.Форма.ФормаСписка″, НачальнаяФорма);
КонецПроцедуры
Данная процедура открывает внешнюю обработку печати внешних форм в режиме управляемого приложения.
Далее вернемся к управляемой форме. Рассмотрим вариант отложенного открытия обработчика печати внешних форм. Это может потребоваться в том случае, если форма списка открывается в фоновом режиме. В этом случае событие ″ПриНажатии″ для кнопки печати может срабатывать раньше, чем форма будет полностью загружена. Поэтому отложенное открытие обработчика печати внешних форм позволит избежать возможных ошибок. Код процедуры ″КомандаПечатьНажатие″ будет следующим.
nНаКлиенте
Процедура КомандаПечатьНажатие(Команда)
Попытка
ЗапуститьФоновоеЗадание(Модуль(ИмяФормы).Печать, НачальнаяФорма);
Исключение
Сообщить(ОписаниеОшибки);
КонецПопытки;
КонецПроцедуры
Теперь обработчик печати внешних форм будет открываться в задании фонового процесса, что позволит избежать ошибок, связанных с неполной загрузкой формы списка.
Контроль печати
Печать является неотъемлемым компонентом работы с документами в 1С, и бывает важно контролировать процесс печати. Это может использоваться для создания гибких механизмов разграничения прав доступа к печати, ведения истории печати документов и для других целей.
Рассмотрим, как проконтролировать процесс печати документов в нашей внешней обработке с помощью типовых средств 1С. Для этого нам понадобится следующая информация:
– Пользователь, который инициировал печать документа.
– Документ, который необходимо распечатать.
– Дата и время печати документа.
Вся эта информация может быть получена в момент открытия внешней обработки. Так как печать документов происходит в отдельном задании фонового процесса, то и контроль печати также будет организован в данном задании. Код следующей процедуры будет добавлен в серверную процедуру ″Печать″ внешней обработки. цикла
nНаСервере
Процедура Печать(НачальнаяФорма)
ПользовательПечати ИнформацияПользователя;
ДокументПечати НачальнаяФорма.ДокументПечати;
ДатаВремяПечати ТекущаяДата;
ЗаписатьЖурналРегистрации(ПользовательПечати, ДокументПечати, ДатаВремяПечати);
ОткрытьФорму(″Обработка.ПечатьВнешнихФорм.Форма.ФормаСписка″, НачальнаяФорма);
КонецПроцедуры
Как мы видим, код серверной процедуры ″Печать″ был дополнен чтением информации о пользователе, документе и дате и времени печати, и следующим вызовом новой процедуры ″ЗаписатьЖурналРегистрации″. Код этой процедуры будет следующим.
nНаСервере
Процедура ЗаписатьЖурналРегистрации(Пользователь, Документ, ДатаВремя)
НовыйРегистрЗаписи.ЖурналРегистрацииПечати.НоваяЗапись;
НовыйРегистрЗаписи.ЖурналРегистрацииПечати.Пользователь Пользователь;
НовыйРегистрЗаписи.ЖурналРегистрацииПечати.Документ Документ;
НовыйРегистрЗаписи.ЖурналРегистрацииПечати.Время ДатаВремя;
НовыйРегистрЗаписи.ЖурналРегистрацииПечати.Записать;
КонецПроцедуры
Данная процедура сохраняет переданную ей информацию в регистр накопления ″Журнал регистрации печати″, который был создан нами ранее. Теперь, при необходимости, мы можем проанализировать информацию о печати документов за любой период времени.
| Назначение | Действие | Где реализовано |
|—|—|—|
| Настройка печати внешних форм | Добавление команды печати на форму списка документов. | Внешняя обработка печати внешних форм, модуль формы списка документов. |
| События форм | Получение данных документа для печати из формы списка документов. | Внешняя печатная форма, клиентская процедура ″Напечатать″. |
| Партионная печать | Печать нескольких или всех документов из формы списка. | Внешняя обработка печати внешних форм, модуль формы списка документов, внешняя печатная форма для партионной печати. |
| Модификация управляемых форм | Добавление команды печати в управляемую форму списка документов. | Форма списка документов в конфигураторе. |
| Контроль печати | Сохранение информации о печати документов в регистр накопления. | Внешняя обработка печати внешних форм, серверная процедура ″Печать″. |
| Характеристика | Типовые конфигурации | Внешние печатные формы |
|—|—|—|
| Настройка печати | Не предусмотрена | Гибкая настройка печати для любых документов |
| Тесты на печать | Невозможно выполнить | Возможность выполнения тестов на печать перед печатью реальных документов |
| Настройка печати | Невозможна | Возможность настройки параметров печати для каждого документа |
| События форм | Не используются | Возможность использования событий форм для получения дополнительных данных для печати |
| Партионная печать | Не предусмотрена | Возможность печати нескольких или всех документов из формы списка |
| Модификация УФ | Не требуется | Может потребоваться для добавления команды печати в управляемую форму списка |
| Печать на принтер | Непосредственная печать | Необходимость сохранения документа перед печатью |
| Программирование печати | Не требуется | Необходимо программно формировать данные для печати |
| Контроль печати | Не предусмотрен | Возможность ведения истории печати документов |
| Нестандартные печатные формы | Невозможны | Возможность использования нестандартных печатных форм |
FAQ
Вопрос: Каковы основные преимущества использования внешних печатных форм?
Ответ: Использование внешних печатных форм в 1С 8.3 предоставляет ряд преимуществ по сравнению со стандартными средствами печати:
– Гибкая настройка. Внешние печатные формы позволяют настроить печать под конкретные требования пользователя или организации. Можно изменять макет печатной формы, добавлять и удалять поля, настраивать параметры печати и т.д.
– Возможность использования нестандартных печатных форм. Типовые конфигурации 1С не всегда предоставляют возможность печати документов в необходимом формате. Внешние печатные формы позволяют создавать и использовать нестандартные печатные формы для любых документов.
– Возможность программирования печати. Внешние печатные формы дают возможность программно управлять процессом печати. Можно реализовать сложную логику печати, использовать дополнительные данные из базы данных или внешних источников, контролировать и управлять печатью документов.
– Печать на принтер. Внешние печатные формы позволяют печатать документы напрямую на принтер, минуя стадию сохранения документа в файл. Это экономит время и повышает удобство использования.
Вопрос: В каких случаях целесообразно использовать внешние печатные формы?
Ответ: Использование внешних печатных форм целесообразно в следующих случаях:
– Необходимость печати документов в нестандартном формате.
– Необходимость настройки параметров печати под конкретные требования.
– Необходимость использования дополнительных данных для печати.
– Необходимость программирования сложной логики печати.
– Необходимость печати документов напрямую на принтер.
Вопрос: Как создать внешнюю печатную форму?
Ответ: Для создания внешней печатной формы необходимо:
Создать новую внешнюю обработку в конфигураторе 1С 8.3.
В модуле внешней обработки создать функцию ″Напечатать″, которая будет содержать код для формирования и выгрузки макета печатной формы.
В модуле формы списка документов добавить код для вызова внешней печатной формы и передачи ей необходимых данных.
Разместить внешнюю обработку в каталоге расширений или на сервере 1С и подключить ее к информационной базе.
Вопрос: Как настроить параметры печати внешней печатной формы?
Ответ: Настройка параметров печати внешней печатной формы осуществляется в модуле внешней обработки в функции ″Напечатать″. Для настройки параметров используются методы объекта ″НастройкиПечати″, такие как ″УстановитьПринтер″, ″УстановитьКоличествоЭкземпляров″, ″УстановитьДиапазонСтраниц″ и т.д.
Вопрос: Как выполнить тест на печать внешней печатной формы?
Ответ: Для выполнения теста на печать внешней печатной формы необходимо в коде модуля внешней обработки после формирования макета печатной формы добавить код для сохранения макета в файл в формате XML. Затем открыть сохраненный файл в программе просмотра XML и проверить правильность сформированного макета.