При разработке собственных печатных форм с помощью конструктора печати разработчики часто сталкиваются с ситуацией, когда сформированный макет открывается во встроенном окне просмотра платформы. В таком окне нет привычной командной панели с кнопками «Печать», «Сохранить» или «Количество копий», из-за чего пользователям приходится вызывать печать через системное меню «Файл — Печать» или сочетание клавиш Ctrl+P.
Разберем причины такого поведения платформы и подробно рассмотрим все способы реализации удобного интерфейса печати для пользователей.
Проанализируем механику работы платформы «1С:Предприятие 8.3». Стандартный метод ТабличныйДокумент.Показать() открывает сформированный документ во встроенном платформенном средстве просмотра как отдельный файл, а не как управляемую форму. В этом режиме командная панель управляемого интерфейса не создается, а доступ к действиям возможен только через системные команды главного меню программы.
В типовых конфигурациях (таких как «1С:Бухгалтерия», «1С:ERP», «1С:Управление торговлей») привычная панель с кнопками печати и выбора принтера реализована не платформой, а специальной общей формой из Библиотеки стандартных подсистем (БСП) — ПечатьДокументов.
Для решения задачи в самописной или нетиповой конфигурации мы можем выбрать один из трех подходов:
Рассмотрим самый гибкий способ для нетиповых конфигураций — создание универсальной управляемой формы, которая будет отображать табличный документ и предоставлять пользователю удобную панель управления.
Разберем по шагам создание такой формы в конфигураторе:
ФормаПросмотраПечатныхФорм.ПечатнаяФорма с типом ТабличныйДокумент.ПечатнаяФорма в элементы формы — платформа создаст элемент типа Поле табличного документа.Истина, чтобы пользователь не мог случайно отредактировать сформированный документ.Печать и СохранитьВФайл.Посмотрим на пример программного кода в модуле созданной формы:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Получаем переданный табличный документ из параметров открытия
Если Параметры.Свойство("ТабличныйДокумент") Тогда
ПечатнаяФорма = Параметры.ТабличныйДокумент;
КонецЕсли;
// Настраиваем параметры отображения
ПечатнаяФорма.ОтображатьСетку = Ложь;
ПечатнаяФорма.ОтображатьЗаголовки = Ложь;
ПечатнаяФорма.Защита = Истина;
ПечатнаяФорма.АвтоМасштаб = Истина;
КонецПроцедуры
&НаКлиенте
Процедура КомандаПечать(Команда)
// Отправляем табличный документ на печать с диалогом выбора принтера
ПечатнаяФорма.Напечатать(РежимИспользованияДиалогаПечати.Использовать);
КонецПроцедуры
&НаКлиенте
Процедура КомандаСохранитьВФайл(Команда)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
Диалог.Заголовок = "Выберите путь для сохранения документа";
Диалог.Фильтр = "Документ PDF (*.pdf)|*.pdf|Таблица Excel (*.xlsx)|*.xlsx";
Оповещение = Новый ОписаниеОповещения("ПослеВыбораФайлаДляСохранения", ЭтотОбъект);
Диалог.Показать(Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораФайлаДляСохранения(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
Если ВыбранныеФайлы <> Неопределено И ВыбранныеФайлы.Количество() > 0 Тогда
ПутьКФайлу = ВыбранныеФайлы[0];
Если СтрЗаканчивается(НРег(ПутьКФайлу), ".pdf") Тогда
ПечатнаяФорма.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.PDF);
Иначе
ПечатнаяФорма.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Теперь в модуле команды документа вместо вызова ТабличныйДокумент.Показать() вызываем открытие нашей формы:
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
ТабДок = СформироватьПечатнуюФормуНаСервере(ПараметрКоманды);
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("ТабличныйДокумент", ТабДок);
ОткрытьФорму("ОбщаяФорма.ФормаПросмотраПечатныхФорм", ПараметрыОткрытия);
КонецПроцедуры
Если для пользователей не требуется предварительный визуальный контроль документа на экране, можно отправить документ сразу на принтер. Для этого на клиенте вызывается метод Напечатать() объекта ТабличныйДокумент.
Метод принимает системное перечисление РежимИспользованияДиалогаПечати:
Рассмотрим пример вызова команды прямой печати:
&НаКлиенте
Процедура ПечатьНаПринтер(ТабличныйДокумент)
ТабличныйДокумент.КоличествоЭкземпляров = 1;
ТабличныйДокумент.АвтоМасштаб = Истина;
ТабличныйДокумент.ИмяПараметровПечати = "ПараметрыПечати_РасходнаяНакладная";
// Вызов диалога печати
ТабличныйДокумент.Напечатать(РежимИспользованияДиалогаПечати.Использовать);
КонецПроцедуры
Обратите внимание: использование свойства ИмяПараметровПечати позволяет платформе запоминать индивидуальные настройки печати конкретного пользователя (выбранный принтер, масштаб, ориентацию листа) в системном хранилище и применять их при последующих вызовах.
Если планируется масштабное развитие конфигурации, целесообразно перенести функционал печати из Библиотеки стандартных подсистем. Подсистема печати БСП включает в себя общую форму ПечатьДокументов, которая содержит полный набор профессиональных инструментов:
Подсистему «Печать» можно перенести автономно даже в работающую базу данных. Для ее работы не обязательно объединять тяжелые справочники конфигурации (такие как «Пользователи» или «Организации») — достаточно перенести только базовые служебные модули подсистем «Базовая функциональность» и «Управление печатью».