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