При разработке внешних печатных форм (ВПФ) на базе Библиотеки стандартных подсистем (БСП) программисты часто сталкиваются с архитектурным ограничением платформы. Если мы хотим объединить несколько печатных форм для разных документов в один файл внешней обработки (чтобы не плодить множество .epf файлов), стандартный механизм регистрации ведет себя не совсем так, как ожидается.
Когда в функции СведенияОВнешнейОбработке() мы указываем массив документов в качестве назначения и несколько команд печати, БСП автоматически регистрирует все указанные команды для всех выбранных документов. В результате в меню «Печать» каждого документа появляются лишние, нерелевантные кнопки. Рассмотрим подробнее, почему так происходит, и разберем по шагам несколько эффективных способов решения этой проблемы.
В стандартном механизме БСП регистрационные данные внешней обработки описываются через таблицу значений Команды и массив Назначение. Связующим звеном выступает сам справочник ДополнительныеОтчетыИОбработки. На уровне метаданных БСП не сопоставляет конкретную строку таблицы команд с конкретным элементом массива назначения. Система считает, что если обработка назначена для Документа А и Документа Б, а внутри описаны Команда 1 и Команда 2, то обе команды должны быть доступны в обоих документах. Чтобы обойти это ограничение, мы можем использовать один из четырех проверенных методов.
---
Этот способ является самым простым, так как он не требует написания сложного программного кода контроля видимости или создания расширений конфигурации. Вся настройка выполняется силами администратора системы непосредственно в пользовательском интерфейсе.
Разберем этот процесс по шагам:
СведенияОВнешнейОбработке() мы стандартно регистрируем все необходимые документы-получатели в массиве назначения и все команды печати в таблице команд.Важный нюанс: данный подход отлично работает, но имеет один весомый минус. При последующем обновлении или перезагрузке файла внешней обработки в информационной базе настройки размещения могут сброситься к значениям авторегистрации «по умолчанию». В этом случае администратору базы данных придется выполнять ручную настройку видимости кнопок заново.
---
Если мы хотим полностью автоматизировать процесс, исключить человеческий фактор при обновлениях и сделать решение «коробочным», лучшим вариантом будет совместное использование внешней обработки и небольшого расширения конфигурации. В этом сценарии внешняя обработка хранит в себе макеты и логику формирования печатных форм, а расширение управляет выводом кнопок в интерфейс.
Проанализируем этот алгоритм реализации:
СведенияОВнешнейОбработке() пустым. Это предотвратит автоматический вывод кнопок стандартным механизмом БСП.&После) процедуру ДобавитьКомандыПечати в модуле менеджера.ДополнительныеОтчетыИОбработки (по наименованию или уникальному идентификатору) и вызываем экспортный метод формирования печатной формы.Посмотрим на пример кода в модуле менеджера документа внутри расширения:
&После("ДобавитьКомандыПечати")
Процедура Расш_ДобавитьКомандыПечати(КомандыПечати)
// Добавляем только ту команду, которая предназначена исключительно для этого документа
КомандаПечати = КомандыПечати.Добавить();
КомандаПечати.Идентификатор = "ПечатьСпецифичнойФормы";
КомандаПечати.Представление = НСтр("ru = 'Печать специальной формы (внешняя)'");
КомандаПечати.ПроверкаПроведенияПередПечатью = Истина;
КомандаПечати.ПереключательРежимаПросмотра = Истина;
КонецПроцедуры
При вызове команды система перенаправит выполнение в обработчик печати модуля менеджера документа, откуда мы программно вызываем экспортный метод нашей ВПФ, используя стандартный интерфейс БСП:
// В процедуре печати модуля менеджера документа вызываем внешнюю обработку
СсылкаНаОбработку = Справочники.ДополнительныеОтчетыИОбработки.НайтиПоРеквизиту("ИмяОбъекта", "ИмяНашейВнешнейОбработки");
Если ЗначениеЗаполнено(СсылкаНаОбработку) Тогда
// Вызываем программное формирование через БСП API
ДополнительныеОтчетыИОбработки.ВыполнитьКомандуПечатиВнешнейПечатнойФормы(СсылкаНаОбработку, "ПечатьСпецифичнойФормы", МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
КонецЕсли;
---
Если нам не хочется вмешиваться в модули менеджеров документов и переопределять процедуры печати, мы можем пойти путем динамического управления элементами интерфейса. Этот способ предполагает, что команды зарегистрированы стандартно (и отображаются везде), но при открытии формы документа расширение скрывает ненужные кнопки.
Рассмотрим этот вариант по шагам:
ПриСозданииНаСервере или ПриОткрытии для целевых документов.Видимость = Ложь.Посмотрим на пример реализации логики обхода элементов формы:
&После("ПриСозданииНаСервере")
Процедура Расш_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Перебираем элементы формы в поиске подменю печати
Для Каждого Элемент Из ЭтаФорма.Элементы Цикл
// Имя кнопки ВПФ обычно содержит уникальный префикс БСП и идентификатор команды
Если СтрНайти(Элемент.Имя, "ИдентификаторНежелательнойКоманды") > 0 Тогда
Элемент.Видимость = Ложь;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Этот метод гарантирует, что пользователь никогда не увидит лишнюю кнопку в интерфейсе конкретного документа, несмотря на то, что в БСП команда зарегистрирована глобально для всех объектов.
---
Если в вашей конфигурации уже переопределены или активно кастомизируются общие клиентские модули БСП, можно использовать глобальную точку перехвата команд. Для этого отлично подходит общий модуль ДополнительныеОтчетыИОбработкиКлиентПереопределяемый и его процедура ПередВыполнениемКомандыПечатиВнешнейПечатнойФормы.
Этот метод не скрывает кнопки визуально, но выступает надежным предохранителем от ошибок пользователя:
СтандартнаяОбработка присваивается значение Ложь, что полностью блокирует дальнейшее выполнение некорректной операции печати.Мы проанализировали четыре практических пути обхода архитектурных ограничений БСП. Если вам необходимо быстрое решение без изменения конфигурации и написания кода, используйте Вариант 1 с настройкой в пользовательском режиме. Для создания максимально надежного, отказоустойчивого и профессионального решения, которое перенесет любые обновления системы, мы рекомендуем применять Вариант 2 с использованием механизмов расширения конфигурации.