В процессе разработки и сопровождения конфигураций на базе 1С:Предприятие часто возникает задача упорядочивания списка печатных форм. Когда в подменю Печать накапливается большое количество команд (как встроенных, так и внешних), пользователям становится неудобно искать нужный документ. В этой статье мы подробно разберем, как управлять позиционированием команд печати, используя механизмы Библиотеки стандартных подсистем (БСП).
Для встроенных печатных форм, которые описываются непосредственно в конфигурации, управление сортировкой осуществляется через модуль менеджера объекта. Рассмотрим ситуацию, когда нам необходимо задать очередность вывода команд в процедуре ДобавитьКомандыПечати. Проанализируем, как это работает на практике.
Каждая команда, добавляемая в таблицу команд печати, имеет структуру, в которой присутствует поле Порядок. По умолчанию БСП может присваивать это значение автоматически, но мы можем переопределить его вручную.
Разберем пример кода в модуле менеджера документа:
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
// Добавляем первую команду, которую хотим видеть в самом верху
НоваяКоманда = КомандыПечати.Добавить();
НоваяКоманда.Представление = НСтр("ru = 'Счет на оплату (основной)'");
НоваяКоманда.Идентификатор = "СчетНаОплату";
НоваяКоманда.Порядок = 10; // Указываем меньшее число для поднятия вверх
// Добавляем вторую команду, которая должна быть ниже
НоваяКоманда = КомандыПечати.Добавить();
НоваяКоманда.Представление = НСтр("ru = 'Товарная накладная'");
НоваяКоманда.Идентификатор = "ТОРГ12";
НоваяКоманда.Порядок = 100; // Большее число опустит команду ниже
КонецПроцедуры
Важный нюанс: если вы хотите, чтобы ваша форма гарантированно оказалась выше всех стандартных форм, можно использовать отрицательные значения, например, -10 или -100. Система сортирует список по возрастанию значения в колонке Порядок. Если значения одинаковы, вступает в силу алфавитная сортировка по наименованию (представлению) команды.
Ситуация с внешними печатными формами несколько сложнее. Часто разработчики пытаются задать порядок в функции СведенияОВнешнейОбработке, однако изменения не всегда отражаются в интерфейсе мгновенно. Рассмотрим, почему это происходит и как правильно настроить внешнюю обработку.
В модуле объекта внешней обработки в таблице команд также предусмотрена колонка Порядок. Посмотрим на пример формирования этой таблицы:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.ПараметрыРегистрацииВнешнейОбработки();
// ... заполнение общих параметров ...
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = "Моя внешняя форма";
НоваяКоманда.Идентификатор = "ВнешняяПечать1";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
НоваяКоманда.Порядок = 1; // Попытка задать приоритет
Возврат ПараметрыРегистрации;
КонецФункции
Выясним причину, по которой это может не сработать. БСП кэширует сведения о внешних обработках в справочнике Дополнительные отчеты и обработки. Если вы просто изменили код внутри .epf файла, система об этом не узнает. Чтобы изменения вступили в силу, необходимо зайти в справочник, открыть карточку обработки и нажать кнопку Обновить из файла. Только после этого новые значения из колонки Порядок попадут в базу данных и будут использованы при формировании меню.
В современных версиях 1С (начиная с БСП 3.0) пользователям предоставлен мощный инструмент самостоятельной настройки. Разберем, как им воспользоваться без написания кода. В подменю Печать любого документа присутствует пункт Настройка... (часто обозначается иконкой шестеренки).
Проанализируем возможности этого окна и недокументированные способы использования стандартных форм:
Если ваша задача — быстро скрыть лишнее или передвинуть формы для конкретного отдела, этот метод будет наиболее предпочтительным, так как он не требует внесения изменений в конфигурацию.
Рассмотрим продвинутый способ для программистов — прямое управление элементами формы. Этот метод выручает, когда стандартные свойства БСП игнорируются или когда логика сортировки должна быть динамической (зависеть от реквизитов документа).
Команды печати в управляемых формах обычно размещаются в группе, создаваемой программно. Мы можем вмешаться в этот процесс в процедуре ПриСозданииНаСервере модуля формы документа.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Вызов стандартного механизма БСП
ПодключаемыйКомандыПечати.ПриСозданииНаСервере(ЭтотОбъект);
// Теперь найдем наше подменю печати. Обычно оно называется "ПодменюПечать"
// Попробуем переместить конкретную команду в самое начало
Попытка
ЭлементКоманда = Элементы.Найти("ПодменюПечатьСчетНаОплату"); // Имя формируется по шаблону
ГруппаПечать = Элементы.ПодменюПечать;
// Метод Переместить(Элемент, Родитель, ПередКакимЭлементом)
// Если третий параметр пустой, элемент перемещается в начало
Элементы.Переместить(ЭлементКоманда, ГруппаПечать, ГруппаПечать.ПодчиненныеЭлементы[0]);
Исключение
// Обработка ситуации, если команда не найдена
КонецПопытки;
КонецПроцедуры
Здесь мы используем метод Элементы.Переместить(). Это "силовой" метод, который позволяет выстроить иерархию элементов управления формы вопреки тому, как их расположил автоматический построитель БСП.
Если список печатных форм все равно остается слишком длинным, проанализируем возможность создания подгрупп. В БСП можно указать родительскую группу для команды печати. Вместо огромного плоского списка мы получим логически разделенное меню.
Для этого в структуре КомандаПечати используется свойство ДополнительныеПараметры или создание отдельных групп команд. Посмотрим, как создать вложенное меню:
// В модуле менеджера
НоваяКоманда = КомандыПечати.Добавить();
НоваяКоманда.Представление = "Архивная справка";
НоваяКоманда.Идентификатор = "Архив";
НоваяКоманда.СписокПутейКПанелям = "ПодменюПечать.ГруппаАрхивныеДокументы";
Использование групп (подменю второго уровня) автоматически решает проблему сортировки в основном списке, так как несколько команд "прячутся" в один узел.
Подведем итоги нашего исследования. Используя справочник по методам БСП, придерживайтесь следующего алгоритма:
Порядок в модуле менеджера. Помните о возможности использования отрицательных чисел для приоритетных задач.Элементы.Переместить() в коде управляемой формы.Используя эти инструменты, мы сможем сделать работу пользователя с программой гораздо комфортнее и эффективнее.