Как добавить внешнюю печатную форму сразу в несколько документов 1С:ERP

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

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

Настройка функции СведенияОВнешнейОбработке

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

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


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

В данном примере мы используем метод Добавить() для расширения списка целевых документов. Важно указывать полное имя метаданных объекта в формате Документ.ИмяОбъекта.

Реализация логики печати для разных типов объектов

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

Рассмотрим пример типизации объектов внутри процедуры печати:


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

Использование проверки Ссылка.Метаданные() или функции ТипЗнч(Ссылка) позволяет избежать ошибок при обращении к реквизитам, которые есть в одном документе, но отсутствуют в другом.

Почему команда не появляется в документе?

Часто программисты сталкиваются с ситуацией: в код МассивНазначений добавлены новые документы, файл обновлен в справочнике "Дополнительные отчеты и обработки", но кнопка печати в новых документах так и не появилась. Разберем основные причины этой проблемы.

  1. Кэширование настроек размещения. При первом подключении обработки БСП считывает данные из СведенияОВнешнейОбработке и записывает их в табличную часть "Размещение" карточки обработки. При простом обновлении файла (кнопка "Обновить из файла") система не всегда принудительно перезаписывает настройки размещения. Чтобы исправить это, необходимо зайти в карточку обработки, перейти в раздел "Размещение" и вручную проверить/обновить список документов.
  2. Интеграция с подсистемой печати. Проанализируем сам документ. Чтобы внешняя печатная форма отобразилась в меню "Печать", документ должен быть "подключен" к БСП. В модуле менеджера документа обязательно должна быть процедура ДобавитьКомандыПечати(КомандыПечати). Если документ не поддерживает стандартную подсистему печати, внешняя обработка в нем не появится автоматически.
  3. Определяемые типы. В некоторых версиях конфигураций требуется, чтобы документ был включен в определяемый тип ОбъектСКомандамиПечати.

Создание нескольких уникальных команд

Если вам требуется, чтобы для одного документа кнопка называлась "Печать акта", а для другого — "Печать накладной", при этом используя одну обработку, мы можем зарегистрировать несколько команд в ТаблицаКоманд.

Посмотрим на пример формирования двух разных кнопок:


// В функции СведенияОВнешнейОбработке
ДобавитьКоманду(ТаблицаКоманд, "Печать акта", "КомандаАкт", "ВызовСерверногоМетода", Истина);
ДобавитьКоманду(ТаблицаКоманд, "Печать накладной", "КомандаНакладная", "ВызовСерверногоМетода", Истина);

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

Важные нюансы регистрации

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

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

← На главную