Как в 1С настроить разные внешние печатные формы для разных документов в одной обработке БСП

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

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

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

Выясняем причину: почему БСП связывает все команды со всеми объектами?

В стандартном механизме БСП регистрационные данные внешней обработки описываются через таблицу значений Команды и массив Назначение. Связующим звеном выступает сам справочник ДополнительныеОтчетыИОбработки. На уровне метаданных БСП не сопоставляет конкретную строку таблицы команд с конкретным элементом массива назначения. Система считает, что если обработка назначена для Документа А и Документа Б, а внутри описаны Команда 1 и Команда 2, то обе команды должны быть доступны в обоих документах. Чтобы обойти это ограничение, мы можем использовать один из четырех проверенных методов.

---

Вариант 1. Индивидуальная настройка видимости в режиме «1С:Предприятие»

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

Разберем этот процесс по шагам:

  1. В модуле внешней обработки в функции СведенияОВнешнейОбработке() мы стандартно регистрируем все необходимые документы-получатели в массиве назначения и все команды печати в таблице команд.
  2. Загружаем готовую обработку в справочник «Дополнительные отчеты и обработки».
  3. Открываем карточку загруженной обработки. В табличной части «Команды» (или через специальную форму настройки размещения в зависимости от версии БСП) для каждой отдельной команды вручную указываем, в каких именно документах она должна отображаться.
  4. Снимаем флажки видимости команд для тех объектов назначения, где они не требуются.

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

---

Вариант 2. Программный вызов ВПФ через расширение конфигурации (Рекомендуемый метод)

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

Проанализируем этот алгоритм реализации:

  1. Регистрируем внешнюю печатную форму в справочнике дополнительных обработок, но при этом оставляем список назначений в функции СведенияОВнешнейОбработке() пустым. Это предотвратит автоматический вывод кнопок стандартным механизмом БСП.
  2. В расширении конфигурации для каждого нужного документа переопределяем (через аннотацию &После) процедуру ДобавитьКомандыПечати в модуле менеджера.
  3. Для каждого документа добавляем строго его команду печати. Например, для Документа А добавляем команду «Печать формы А», а для Документа Б — «Печать формы Б».
  4. В процедуре печати модуля менеджера каждого документа в расширении прописываем программный вызов кода нашей внешней обработки. Для этого мы находим ссылку на обработку в справочнике ДополнительныеОтчетыИОбработки (по наименованию или уникальному идентификатору) и вызываем экспортный метод формирования печатной формы.

Посмотрим на пример кода в модуле менеджера документа внутри расширения:


&После("ДобавитьКомандыПечати")
Процедура Расш_ДобавитьКомандыПечати(КомандыПечати)
    
    // Добавляем только ту команду, которая предназначена исключительно для этого документа
    КомандаПечати = КомандыПечати.Добавить();
    КомандаПечати.Идентификатор = "ПечатьСпецифичнойФормы";
    КомандаПечати.Представление = НСтр("ru = 'Печать специальной формы (внешняя)'");
    КомандаПечати.ПроверкаПроведенияПередПечатью = Истина;
    КомандаПечати.ПереключательРежимаПросмотра = Истина;
    
КонецПроцедуры

При вызове команды система перенаправит выполнение в обработчик печати модуля менеджера документа, откуда мы программно вызываем экспортный метод нашей ВПФ, используя стандартный интерфейс БСП:


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

---

Вариант 3. Программная фильтрация видимости кнопок на форме

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

Рассмотрим этот вариант по шагам:

  1. Создаем расширение конфигурации и перехватываем событие формы документа ПриСозданииНаСервере или ПриОткрытии для целевых документов.
  2. В коде обработчика выполняем обход коллекции элементов управления на форме. Нас интересуют кнопки, расположенные в подменю «Печать».
  3. БСП формирует имена элементов меню печати по определенному шаблону, в который входит идентификатор команды внешней обработки. Мы можем легко определить «чужую» команду с помощью анализа имени элемента.
  4. Для «чужой» команды устанавливаем свойство кнопки Видимость = Ложь.

Посмотрим на пример реализации логики обхода элементов формы:


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

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

---

Вариант 4. Перехват выполнения через общий модуль «ДополнительныеОтчетыИОбработкиКлиентПереопределяемый»

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

Этот метод не скрывает кнопки визуально, но выступает надежным предохранителем от ошибок пользователя:

Резюме

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

← На главную