Как открыть печатную форму в 1С в новом окне с кнопками управления?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке конфигураций в среде 1С часто возникает задача: вместо простого вывода печатной формы на экран через стандартный метод Показать(), предоставить пользователю полноценное отдельное окно. В этом окне должны быть не только сами данные, но и удобные кнопки управления — например, для прямой отправки на принтер, сохранения в файл формата PDF или Excel, а также настройки масштаба.

Особенно часто с этой проблемой сталкиваются разработчики при использовании стандартного «Конструктора печати», который по умолчанию генерирует простейший код вывода. В этой статье мы подробно разберем, как решить эту задачу двумя способами: через создание собственной универсальной формы (для полностью самописных конфигураций) и с помощью готовых механизмов Библиотеки стандартных подсистем (БСП) для типовых решений.

Вариант 1. Создание собственной формы просмотра и печати (без БСП)

Если вы работаете в базе данных, созданной с нуля, в ней нет готовых стандартных библиотек. В этом случае мы спроектируем собственную универсальную форму просмотра. Чтобы передать сложный объект типа ТабличныйДокумент с сервера на клиент без ошибок сериализации, мы задействуем механизм временного хранилища. Проанализируем этот процесс по шагам.

Шаг 1. Создание общей формы в конфигураторе

Сначала нам необходимо подготовить интерфейс нашего будущего окна печати:

  1. Откроем конфигуратор, перейдем в дерево метаданных и найдем ветку Общие -> Общие формы.
  2. Добавим новую форму и назовем ее, к примеру, ФП_ПросмотрПечатнойФормы.
  3. Перейдем на вкладку Реквизиты формы (в правой части редактора) и добавим новый реквизит:
    • Имя: ПечатныйДокумент
    • Тип: ТабличныйДокумент
  4. Перетащим этот реквизит мышкой на панель элементов формы (в левую часть экрана). Платформа автоматически создаст элемент управления типа Поле табличного документа.
  5. Настроим свойства созданного элемента на панели свойств для удобства пользователя:
    • Установим флаг Только просмотр в значение Да (чтобы пользователь случайно не стер важные данные).
    • Снимем флаг Отображать сетку (по желанию, для более чистого внешнего вида).
    • Снимем флаг Отображать заголовки (это скроет координатную сетку со строками 1, 2, 3... и колонками А, Б, В...).
  6. На вкладке Параметры формы создадим новый параметр:
    • Имя: АдресХранилища
    • Тип: Строка

Шаг 2. Программная инициализация формы

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	// Проверим, передан ли адрес временного хранилища в параметрах формы
	Если Параметры.Свойство("АдресХранилища") И ЗначениеЗаполнено(Параметры.АдресХранилища) Тогда
		// Извлекаем табличный документ и присваиваем его реквизиту формы
		ЭтотОбъект.ПечатныйДокумент = ПолучитьИзВременногоХранилища(Параметры.АдресХранилища);
	КонецЕсли;
	
КонецПроцедуры

Шаг 3. Добавление кнопок управления на форму

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


&НаКлиенте
Процедура Печать(Команда)
	// Данный метод инициализирует системное окно отправки документа на принтер
	Элементы.ПечатныйДокумент.Напечатать(РежимИспользованияДиалогаПечати.Использовать);
КонецПроцедуры

&НаКлиенте
Процедура Сохранить(Команда)
	// Метод открывает диалог выбора пути для сохранения документа на жесткий диск
	Элементы.ПечатныйДокумент.ПоказатьЗаписать("Выберите путь для сохранения файла");
КонецПроцедуры

Шаг 4. Настройка вызова из исходного документа

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


&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
	
	// 1. Формируем табличный документ на сервере
	ТабДок = СформироватьПечатнуюФормуНаСервере(ПараметрКоманды);
	
	// 2. Помещаем готовый макет во временное хранилище, чтобы передать на клиент
	АдресХранилища = ПоместитьВоВременноеХранилищеНаСервере(ТабДок);
	
	// 3. Подготавливаем параметры для открытия нашей общей формы
	ПараметрыОткрытия = Новый Структура;
	ПараметрыОткрытия.Вставить("АдресХранилища", АдресХранилища);
	
	// 4. Открываем общую форму, передавая параметры
	ОткрытьФорму("ОбщаяФорма.ФП_ПросмотрПечатнойФормы", ПараметрыОткрытия);
	
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПоместитьВоВременноеХранилищеНаСервере(ТабДок)
	// Метод сохраняет табличный документ во временную память текущей сессии
	Возврат ПоместитьВоВременноеХранилище(ТабДок);
КонецФункции

Вариант 2. Использование готового механизма БСП

Если вы работаете в типовой конфигурации 1С (такой как 1С:Управление нашей фирмой, 1С:Бухгалтерия или 1С:ERP), то в вашей системе уже развернута Библиотека стандартных подсистем (БСП). Разработчики БСП создали мощную общую форму печати документов, которая предоставляет пользователю готовые инструменты сохранения, отправки по почте и масштабирования. Нам не нужно изобретать велосипед — достаточно правильно передать туда наш документ.

Для этого мы воспользуемся общим модулем УправлениеПечатьюКлиент и процедурой ПечатьДокументов. Посмотрим на примере, как реализовать этот вызов:


&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
	
	// 1. Получаем сформированный табличный документ с сервера
	ТабДок = ПолучитьТабличныйДокументНаСервере(ПараметрКоманды);
	
	// 2. Создаем стандартную коллекцию печатных форм БСП
	КоллекцияПечатныхФорм = УправлениеПечатьюКлиент.НоваяКоллекцияПечатныхФорм("УчебныйДень");
	
	// 3. Настраиваем структуру коллекции и привязываем наш табличный документ
	СтрокаПечатнойФормы = КоллекцияПечатныхФорм[0];
	СтрокаПечатнойФормы.ТабличныйДокумент = ТабДок;
	СтрокаПечатнойФормы.СинонимМакета     = "Расписание на учебный день"; // Имя вкладки формы
	
	// 4. Передаем коллекцию в стандартное окно БСП
	УправлениеПечатьюКлиент.ПечатьДокументов(КоллекцияПечатныхФорм);
	
КонецПроцедуры

Этот способ является наиболее предпочтительным для типовых конфигураций. Он экономит время разработчика и предоставляет пользователям привычный интерфейс, соответствующий общим стандартам юзабилити программных продуктов фирмы «1С».

← На главную