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