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