Как программно закрыть форму документа в 1С 8.3 после нажатия кнопки печати?

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

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

Метод 1: Использование собственной команды печати

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

При нажатии на кнопку вызывается клиентский метод. В этом методе мы должны сначала выполнить формирование печатной формы (вызвать серверный метод или процедуру печати), а затем вызвать метод Закрыть() для текущей формы. Проанализируем пример кода:


&НаКлиенте
Процедура КомандаПечать(Команда)
    
    // Сначала вызываем логику формирования печатной формы (включая генерацию QR и штрихкодов)
    // Например, открытие окна предварительного просмотра или отправку на принтер
    СформироватьПечатнуюФорму();
    
    // Теперь закрываем форму, так как действие завершено
    ЭтаФорма.Закрыть();
    
КонецПроцедуры

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

Метод 2: Модификация поведения стандартных команд БСП

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

Стандартные команды печати обычно не закрывают форму владельца. Чтобы изменить это поведение, мы можем воспользоваться механизмом расширений. Рассмотрим вариант перехвата события завершения печати. Однако, более надежным способом будет создание «обертки» над стандартной командой.

Выясним причину, почему простое переопределение может не сработать. Дело в том, что БСП использует общие модули для формирования коллекций печатных форм. Проанализируем ситуацию: нам нужно, чтобы после выполнения метода УправлениеПечатьюКлиент.ВыполнитьКомандуПечати форма прекратила свое существование.


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

Метод 3: Использование обработчика ожидания для отложенного закрытия

Иногда прямое закрытие формы сразу после команды печати может привести к конфликтам, если принтер или подсистема формирования табличного документа требуют активного контекста формы. В таких случаях мы можем применить небольшую хитрость — отложенное закрытие через ПодключитьОбработчикОжидания.

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

  1. В процедуре печати вместо прямого вызова закрытия мы подключаем однократный обработчик.
  2. В самом обработчике выполняем закрытие.

&НаКлиенте
Процедура ПечатьИЗакрыть(Команда)
    
    // Запуск стандартной печати
    ВыполнитьПечатьНаСервере();
    
    // Подключаем обработчик, который сработает через 0.1 секунды
    ПодключитьОбработчикОжидания("ИсполнитьЗакрытиеФормы", 0.1, Истина);
    
КонецПроцедуры

&НаКлиенте
Процедура ИсполнитьЗакрытиеФормы()
    Если ЭтаФорма.Открыта() Тогда
        ЭтаФорма.Закрыть();
    КонецЕсли;
КонецПроцедуры

Использование паузы в 0.1 секунды визуально незаметно для пользователя, но позволяет платформе корректно завершить все потоки отрисовки печатной формы перед тем, как объект УправляемаяФорма будет уничтожен.

Метод 4: Закрытие через Оповещение (Notification)

Разберем ситуацию, когда печать инициируется из внешней обработки или другой формы. В этом случае полезно использовать механизм оповещений. Форма документа может «подписаться» на определенное событие, и при получении сигнала о том, что печать успешно запущена, закрыться самостоятельно.

В модуле формы документа пропишем обработку оповещения:


&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
    
    Если ИмяСобытия = "ДокументРаспечатан" И Источник = ЭтаФорма.Объект.Ссылка Тогда
        ЭтаФорма.Закрыть();
    КонецЕсли;
    
КонецПроцедуры

А в коде, который отвечает за печать (например, в общей форме печати), добавим вызов:

Оповестить("ДокументРаспечатан", , СсылкаНаДокумент);

Важные нюансы при программном закрытии

При реализации автоматического закрытия форм следует учитывать несколько критически важных моментов:

Подводя итог, выбор метода зависит от архитектуры вашей конфигурации. Для простых самописных решений идеально подходит Метод 1. Для сложных систем на базе БСП лучше ориентироваться на расширения и перехват событий через Метод 2 или Метод 3. Проанализируйте потребности ваших пользователей: иногда мгновенное закрытие может их дезориентировать, поэтому всегда полезно оставлять возможность настройки этого поведения через параметры пользователя или константы.

← На главную