Как реализовать выбор из нескольких макетов печати при нажатии одной кнопки в 1С?

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

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

Способ 1: Использование стандартных команд и групп команд

Проанализируем самый архитектурно правильный способ для управляемого интерфейса — использование объектов метаданных Команда. Этот метод позволяет не перегружать форму лишним кодом и сделать кнопки печати доступными не только из формы документа, но и из списков. Разберем по шагам процесс настройки.

Шаг 1: Создание группы команд

Для того чтобы кнопки печати «схлопывались» в одно выпадающее меню, необходимо создать общую группу команд. В дереве конфигурации перейдем в ветку Общие -> Группы команд. Создадим новую группу, назовем ее, например, ГруппаПечать. В свойствах укажем категорию — Командная панель формы.

Шаг 2: Создание команд печати

Для каждого макета создадим отдельный объект Команда внутри документа (или как общую команду). Рассмотрим настройки такой команды:

  1. Группа: выберем созданную ранее ГруппаПечать.
  2. Тип параметра команды: выберем ссылку на наш документ (например, ДокументСсылка.КонсолидированныйБаланс).
  3. Режим использования параметра: Множественный (это позволит печатать сразу несколько выделенных документов из списка).

Шаг 3: Программная логика в модуле команды

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


&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
    // ПараметрКоманды — это ссылка или массив ссылок на документы
    ТабДок = Новый ТабличныйДокумент;
    
    // Вызываем серверную процедуру для формирования печатной формы
    СформироватьПечатнуюФормуНаСервере(ТабДок, ПараметрКоманды);
    
    // Настраиваем отображение результата
    ТабДок.ОтображатьСетку = Ложь;
    ТабДок.Защита = Ложь;
    ТабДок.ТолькоПросмотр = Истина;
    ТабДок.ОтображатьЗаголовки = Ложь;
    
    // Показываем пользователю
    ТабДок.Показать("Печать отчета");
КонецПроцедуры

&НаСервере
Процедура СформироватьПечатнуюФормуНаСервере(ТабДок, ПараметрКоманды)
    // Обращаемся к экспортной функции в модуле менеджера документа
    Документы.КонсолидированныйБаланс.ПечатьОтчета(ТабДок, ПараметрКоманды);
КонецПроцедуры

Способ 2: Реализация выбора через программное меню (СписокЗначений)

Если по каким-то причинам вы не хотите создавать множество объектов метаданных (команд), можно реализовать выбор макета прямо в коде одной кнопки. Проанализируем ситуацию: на форме документа создана одна кнопка «Печать», при нажатии на которую должно появиться меню.

Выясним причину, почему метод СписокЗначений.ВыбратьЭлемент() считается устаревшим. В современных управляемых формах использование модальных окон (которые блокируют весь интерфейс) не рекомендуется. Вместо этого лучше использовать асинхронный метод ПоказатьВыборИзМеню. Рассмотрим пример кода для клиентской процедуры:


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

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

Логика в модуле менеджера: как правильно подготовить данные

Чтобы код был универсальным и поддерживал печать как одного документа, так и списка, функцию печати в модуле менеджера ManagerModule нужно писать с использованием запроса. Проанализируем пример функции, которая получает данные документа и заполняет области макета:


Функция ПечатьОтчета(ТабДок, СсылкаИлиМассив) Экспорт
    
    Макет = Документы.КонсолидированныйБаланс.ПолучитьМакет("ОтчетБаланс");
    Запрос = Новый Запрос;
    
    // Используем В (&Ссылка), чтобы запрос корректно отрабатывал и для массива
    Запрос.Текст = 
    "ВЫБРАТЬ
    |   КонсолидированныйБаланс.Ссылка КАК Ссылка,
    |   КонсолидированныйБаланс.Номер КАК Номер,
    |   КонсолидированныйБаланс.Дата КАК Дата,
    |   КонсолидированныйБаланс.Организация КАК Предприятие
    |ИЗ
    |   Документ.КонсолидированныйБаланс КАК КонсолидированныйБаланс
    |ГДЕ
    |   КонсолидированныйБаланс.Ссылка В(&Ссылка)";
    
    Запрос.УстановитьПараметр("Ссылка", СсылкаИлиМассив);
    Выборка = Запрос.Выполнить().Выбрать();
    
    ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
    
    Пока Выборка.Следующий() Цикл
        // Если печатаем несколько документов, разделяем их страницами
        Если ТабДок.ВысотаТаблицы > 0 Тогда
            ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
        КонецЕсли;
        
        ОбластьШапка.Параметры.Заполнить(Выборка);
        ТабДок.Вывести(ОбластьШапка);
    КонецЦикла;
    
    Возврат ТабДок;
КонецФункции

Рекомендации по оформлению интерфейса

Рассмотрим несколько советов, которые помогут сделать работу пользователя более комфортной:

  1. Группировка кнопок: Если у вас более трех печатных форм, всегда используйте Группа - подменю. Это не загромождает командную панель и позволяет пользователю быстрее ориентироваться.
  2. Кнопка по умолчанию: Одну, самую часто используемую команду, можно вынести отдельно, а остальные спрятать в подменю. В свойствах группы это настраивается через Режим отображения.
  3. Использование параметров печати: Если разница между макетами незначительна (например, наличие или отсутствие печати организации), лучше не создавать два макета, а передавать в функцию печати структуру ДополнительныеПараметры. Внутри кода можно управлять видимостью строк или колонок макета с помощью метода Область.Видимость.
  4. Подготовка макета: Не забывайте про метод Автомасштаб = Истина для табличного документа. Это гарантирует, что печатная форма корректно впишется в лист формата А4 при печати на разных принтерах.

Таким образом, мы разобрали, что для реализации выбора макетов в 1С 8.3 существует два основных пути: через объекты метаданных (Команды) и через программное создание меню. Первый способ предпочтительнее для типовых задач, так как он лучше интегрируется в стандартный интерфейс управляемых форм 1С:Предприятия.

← На главную