Как отловить нажатие кнопки Печать в 1С

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

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

Анализ проблемы и системные ограничения

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

Решение 1: Использование механизмов БСП и расширений

Если ваша конфигурация построена на базе БСП (например, УТ 11, ERP 2, БП 3.0), то печать документов обычно проходит через общие модули управления печатью. Хотя саму кнопку в окне предпросмотра мы не перехватим, мы можем зафиксировать момент формирования печатной формы или нажатия кнопки печати в форме самого документа. Рассмотрим, как это сделать через расширение.

Нам необходимо создать расширение и применить механизм &После для процедуры печати. Чаще всего целевой процедурой является УправлениеПечатьюКлиент.ВыполнитьКомандуПечати. Проанализируем пример кода для расширения:


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

Этот метод хорош тем, что он фиксирует само намерение пользователя напечатать документ. Однако, если пользователь просто открыл форму предпросмотра и закрыл её, не нажав на «принтер», событие все равно сработает. Если требуется более строгий контроль, перейдем к следующему методу.

Решение 2: Подмена стандартного окна предпросмотра (Собственная форма)

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

Разберем алгоритм реализации по шагам:

  1. Создаем новую произвольную форму в конфигурации (или в расширении).
  2. Размещаем на форме реквизит с типом ТабличныйДокумент и выносим его на форму как поле табличного документа.
  3. Добавляем команду формы «НапечататьИЗафиксировать».
  4. В коде команды прописываем логику выполнения действий в базе данных и последующий вызов метода Напечатать().

Пример кода для кнопки на вашей форме:


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

Решение 3: Управление доступностью через свойство Вывод

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

Рассмотрим логику: мы можем выводить документ в режиме «Только просмотр» без права печати, пока пользователь не нажмет специальную кнопку «Утвердить и распечатать». Проанализируем фрагмент кода:


ТабДок = Новый ТабличныйДокумент;
// Заполняем ТабДок данными...

// Если документ еще не прошел стадию фиксации в базе:
Если Не ДокументЗафиксирован Тогда
    ТабДок.Вывод = ИспользованиеВывода.Запретить;
    // Пользователь увидит документ на экране, но кнопка Печать будет заблокирована платформой
Иначе
    ТабДок.Вывод = ИспользованиеВывода.Разрешить;
КонецЕсли;

ТабДок.Показать("Предварительный просмотр");

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

Решение 4: Использование замера производительности для поиска точек входа

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

Резюме по архитектурному подходу

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

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

← На главную