Как подключить внешнюю обработку в кнопку "Печать" документа в 1С?

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

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

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

Шаг 1. Ключевое отличие: Дополнительная обработка vs. Печатная форма

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

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

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


// НЕПРАВИЛЬНО для печатной формы
Функция СведенияОВнешнейОбработке() Экспорт
    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке();
    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка;
    // ... остальной код
    Возврат ПараметрыРегистрации;
КонецФункции

Здесь указан вид ВидОбработкиДополнительнаяОбработка. Такие обработки предназначены для выполнения произвольных действий и обычно вызываются из раздела "Сервис" или "Дополнительные обработки", но не из меню "Печать".

Правильное решение — указать вид ПечатнаяФорма.


// ПРАВИЛЬНО
Функция СведенияОВнешнейОбработке() Экспорт
    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке();
    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма;
    // ... остальной код
    Возврат ПараметрыРегистрации;
КонецФункции

Либо можно использовать строковое представление, как в более старых версиях БСП:

ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма");

Это первое и самое важное изменение, без которого система не поймет, что вашу обработку нужно встраивать в подменю "Печать".

Шаг 2. Заполняем "паспорт" — функция СведенияОВнешнейОбработке

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

  1. Назначение. Здесь мы указываем, к каким документам (или другим объектам конфигурации) будет привязана наша печатная форма. Это массив, поэтому можно указать несколько объектов.

    ПараметрыРегистрации.Назначение.Добавить("Документ.ЗаказПокупателя");
  2. Команды. Этот параметр описывает, какие пункты меню будут добавлены и как они будут себя вести. Для каждой печатной формы создается хотя бы одна команда.

Разберем свойства команды подробнее:

Посмотрим на полный и корректный пример функции СведенияОВнешнейОбработке():


Функция СведенияОВнешнейОбработке() Экспорт
    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.5.8.207"); // Рекомендуется указывать версию БСП

    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма;
    ПараметрыРегистрации.Версия = "1.1";
    ПараметрыРегистрации.Наименование = "Внешняя печатная форма для Сменного задания"; // Имя в списке доп. обработок
    ПараметрыРегистрации.Информация = "Выводит на печать сменное задание с дополнительной колонкой 'Выход'";
    ПараметрыРегистрации.БезопасныйРежим = Ложь; // Устанавливайте в Ложь, если нужны привилегированные операции

    // Привязываем к документу "СменноеЗадание"
    ПараметрыРегистрации.Назначение.Добавить("Документ.СменноеЗадание");

    // Добавляем команду печати
    НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
    НоваяКоманда.Представление = НСтр("ru = 'Сменное задание (с колонкой Выход)'"); // Текст в меню "Печать"
    НоваяКоманда.Идентификатор = "СменноеЗаданиеВнешняя"; // Уникальный идентификатор
    НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода;
    НоваяКоманда.ПоказыватьОповещение = Истина;
    НоваяКоманда.Модификатор = "ПечатьMXL";

    Возврат ПараметрыРегистрации;
КонецФункции

Шаг 3. Решение частых проблем

Как удалить старую, неверно зарегистрированную обработку?

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

  1. Перейдите в раздел "Администрирование" – "Печатные формы, отчеты и обработки".
  2. Откройте ссылку "Дополнительные отчеты и обработки". Вы увидите список всех зарегистрированных в системе внешних компонентов.
  3. Найдите в списке вашу старую обработку по наименованию, которое вы задавали в ПараметрыРегистрации.Наименование.
  4. Выделите ее и удалите стандартным способом (клавишей Del или через меню "Еще" - "Удалить").

После этого можно заново добавлять исправленную версию из файла.

Конфликт имен

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

Шаг 4. Получение данных и формирование печатной формы

Итак, мы правильно зарегистрировали нашу печатную форму. Теперь главный вопрос: как получить ссылку на документ, из которого ее вызвали, и запустить формирование макета?

Для этого в модуле объекта вашей обработки необходимо создать экспортную процедуру с именем Печать. Система вызовет ее автоматически и передаст все необходимые параметры.

Вам не нужно создавать поле выбора документа или использовать обработчики выбора! Ссылка на документ уже передается в первом параметре процедуры.

Рассмотрим структуру процедуры Печать():


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

КонецПроцедуры

Ключевой параметр здесь — МассивОбъектов. Это массив ссылок на объекты, для которых вызвана печать. Если пользователь выбрал в списке 5 документов и нажал "Печать", в массиве будет 5 элементов. Если печать вызвана из формы одного документа — в массиве будет одна ссылка.

Теперь посмотрим на функцию, которая непосредственно формирует табличный документ:


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

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

КонецФункции

Таким образом, весь механизм работает автоматически. Ваша задача — правильно описать обработку в СведенияОВнешнейОбработке() и реализовать логику формирования макета внутри процедуры Печать() и связанных с ней функций, используя переданный массив ссылок на объекты.

← На главную