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