Как сгруппировать команды во внешних печатных формах 1С

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

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

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

Почему в БСП нельзя создать группы команд штатными средствами

Проанализируем техническую сторону вопроса. Механизм регистрации внешних обработок в современных конфигурациях (ERP, КА, УТ 11, БП 3.0) опирается на функцию СведенияОВнешнейОбработке. В этой функции мы заполняем таблицу команд. Однако структура этой таблицы и логика её обработки в БСП не предусматривают иерархии. Каждая строка — это отдельный элемент в выпадающем списке кнопки «Печать». В качестве базового шаблона регистрации и кода обработки можно использовать пример внешней печатной формы на актуальной версии БСП.

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

Решение 1: Использование формы-посредника и динамического меню

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

Для реализации этого метода выполним следующие шаги:

  1. В функции СведенияОВнешнейОбработке укажем тип вызова ОткрытиеФормы вместо стандартного ВызовСерверногоМетода.
  2. Создадим в обработке форму и в процедуре ПриОткрытии (или по нажатию основной кнопки) вызовем метод ПоказатьВыборИзМеню().
  3. На основании выбора пользователя запустим формирование конкретного макета.

Разберем пример кода для вызова меню выбора на клиенте:


&НаКлиенте
Процедура ВыбратьВариантПечати()
    СписокВариантов = Новый СписокЗначений;
    СписокВариантов.Добавить("ТН_Гор", "Транспортная накладная (Горизонтальная)");
    СписокВариантов.Добавить("ТН_Вер", "Транспортная накладная (Вертикальная)");
    
    Оповещение = Новый ОписаниеОповещения("ПослеВыбораВарианта", ЭтотОбъект);
    ПоказатьВыборИзМеню(Оповещение, СписокВариантов);
КонецПроцедуры

&НаКлиенте
Процедура ПослеВыбораВарианта(ВыбранныйЭлемент, Параметры) Экспорт
    Если ВыбранныйЭлемент <> Неопределено Тогда
        // Код для формирования печатной формы на основании ВыбранныйЭлемент.Значение
    КонецЕсли;
КонецПроцедуры

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

Решение 2: Использование расширения конфигурации

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

Выясним, как это работает. В БСП существует программная точка расширения — общий модуль УправлениеПечатьюПереопределяемый. Мы можем использовать процедуру ПередДобавлениемКомандПечати. Рассмотрим алгоритм действий:

  1. Создаем расширение и добавляем в него процедуру-перехватчик &После("ПередДобавлениемКомандПечати").
  2. Внутри процедуры анализируем коллекцию КомандыПечати.
  3. Находим команды, принадлежащие нашей внешней обработке (их можно идентифицировать по именам или префиксам).
  4. Программно создаем новую группу кнопок с типом ГруппаКнопок (Подменю).
  5. Для найденных команд устанавливаем свойство ИмяГруппы, равное имени созданного подменю.

Примерный фрагмент кода в расширении:


&После("ПередДобавлениемКомандПечати")
Процедура Расш_ПередДобавлениемКомандПечати(КомандыПечати)
    // Создаем подменю
    ИмяПодменю = "ГруппаПечатиТН";
    НоваяГруппа = КомандыПечати.Добавить();
    НоваяГруппа.Имя = ИмяПодменю;
    НоваяГруппа.Представление = "Спец. формы ТН/ТТН";
    НоваяГруппа.ТипКоманды = "Группа";

    // Переносим наши команды в эту группу
    Для Каждого Команда Из КомандыПечати Цикл
        Если Найти(Команда.Имя, "МояВнешняяТН") > 0 Тогда
            Команда.ИмяГруппы = ИмяПодменю;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

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

Решение 3: Визуальная группировка с помощью префиксов

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

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

Использование квадратных скобок или дефисов позволяет пользователю быстрее ориентироваться в плоском списке. Это не создает настоящего выпадающего меню, но значительно снижает когнитивную нагрузку на бухгалтера или оператора склада при выборе формы.

Подводим итоги и рекомендации

Выбор конкретного метода зависит от ваших бизнес-задач. Проанализируем ситуации:

1. Если вам нужна максимальная эстетика и полноценные подменю — используйте расширение (Решение 2). Это единственный способ изменить поведение системного меню «Печать» без изменения основной конфигурации. Для оптимизации списка также подойдёт расширение для управления видимостью команд печати по условиям.

2. Если вам нужно быстрое решение без изменения кода системы и вы не планируете использовать эти формы в автоматических «Комплектах документов» — используйте форму-посредник (Решение 1). Это позволит скрыть сложность выбора за одной кнопкой.

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

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

← На главную