Как прервать формирование внешней печатной формы в 1С 8.3?

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

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

Вариант 1. Использование оператора Возврат в серверном методе

Если ваша внешняя печатная форма зарегистрирована с типом "Вызов серверного метода" (для создания которой удобно использовать шаблон дополнительной обработки), основная логика сосредоточена в модуле объекта обработки в процедуре Печать. Рассмотрим ситуацию, когда нам нужно проверить заполнение данных перед тем, как формировать табличный документ.

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


Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
    
    Для Каждого СсылкаНаОбъект Из МассивОбъектов Цикл
        
        // Проверяем условие (например, заполнено ли поле "Склад")
        Если Не ЗначениеЗаполнено(СсылкаНаОбъект.Склад) Тогда
            
            // Выводим сообщение пользователю
            ТекстСообщения = СтрШаблон("Документ %1 не заполнен: укажите склад!", СсылкаНаОбъект);
            ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения, СсылкаНаОбъект);
            
            // Прерываем формирование текущего объекта
            Продолжить; 
            
        КонецЕсли;
        
        // Если все проверки пройдены, формируем макет
        ТабДок = СформироватьПечатнуюФорму(СсылкаНаОбъект);
        
        // Добавляем в коллекцию только если макет сформирован
        УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, "ИмяМакета", "Заголовок", ТабДок);
        
    КонецЦикла;

    // Если в коллекции нет ни одной формы, БСП не откроет окно печати
КонецПроцедуры

Важный нюанс: Если мы используем Возврат или Продолжить, не заполнив коллекцию, пользователь увидит сообщения внизу экрана, но окно предварительного просмотра не откроется. Это наиболее корректный и "тихий" способ прерывания.

Вариант 2. Использование исключений (ВызватьИсключение)

Иногда требуется жестко остановить выполнение кода, чтобы предотвратить дальнейшие действия системы. Для этого можно использовать метод ВызватьИсключение. Рассмотрим, как это работает на практике:


Если Не ПроверкаУсловийПрошла Тогда
    ВызватьИсключение "Печать невозможна: обнаружены критические ошибки в данных документа.";
КонецЕсли;

Однако, как справедливо отмечают разработчики, этот метод не очень дружелюбен к пользователю. При возникновении исключения 1С выдает стандартное диалоговое окно с кнопкой "Подробно". Это может напугать обычного сотрудника, так как выглядит как программная ошибка (баг), а не как штатное уведомление системы. Поэтому использовать исключения стоит только в самых крайних случаях.

Вариант 3. Переход на клиентский метод вызова (самый гибкий вариант)

Если вам необходимо реализовать сложную логику, например, задать вопрос пользователю ("Документ не проведен, все равно печатать?") или вызвать стандартные механизмы проверки БСП, серверного метода будет недостаточно. В серверной процедуре Печать нельзя использовать интерактивные методы (Вопрос, Предупреждение, ОткрытьФорму).

В этом случае при регистрации внешней обработки в функции СведенияОВнешнейОбработке необходимо указать тип запуска: "Вызов клиентского метода".

Рассмотрим алгоритм реализации этого подхода:

  1. Создаем форму во внешней обработке (например, "ФормаОбработки").
  2. В модуле формы прописываем экспортную процедуру Печать с директивой &НаКлиенте.
  3. В этой процедуре выполняем необходимые проверки и, если все в порядке, вызываем печать.

Давайте проанализируем пример кода в модуле формы:


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

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

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

Сводная таблица методов прерывания

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

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

← На главную