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