Как упорядочить печатные формы в выпадающем меню кнопки "Печать" в 1С:ЗУП?

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

При работе в программах на платформе 1С:Предприятие 8, в частности в 1С:Зарплата и Управление Персоналом (ЗУП), мы часто сталкиваемся с необходимостью управления печатными формами, доступными по кнопке "Печать" в документах и справочниках. Одним из частых вопросов является принцип их упорядочивания в выпадающем списке. Давайте подробно рассмотрим, по какому принципу и где происходит упорядочивание этих форм, а также какие существуют способы повлиять на их порядок.

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

Принцип упорядочивания встроенных печатных форм

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

  1. Свойство Порядок: Каждая команда печати может иметь это свойство, представляющее собой числовое значение в диапазоне от 1 до 100. Это значение указывает на желаемый порядок размещения команды в меню.

  2. Значение по умолчанию: Если свойство Порядок не указано явно, для команды используется значение по умолчанию — 50. Это означает, что большинство стандартных печатных форм, для которых не задан особый порядок, будут располагаться примерно в середине списка.

  3. Логика сортировки: Сортировка команд в меню "Печать" осуществляется в два этапа:

    1. По полю Порядок: Сначала команды сортируются по возрастанию значения свойства Порядок. Чем меньше число, тем выше в списке будет располагаться команда. Так, команды с Порядок = 1 появятся первыми, затем с Порядок = 2 и так далее.
    2. По представлению (названию): Если несколько команд имеют одинаковое значение свойства Порядок, то внутри этой группы они дополнительно сортируются по их представлению, то есть по названию, которое отображается пользователю в меню. Эта сортировка происходит в алфавитном порядке.
  4. Место определения Порядка: Встроенные команды печати обычно добавляются в процедуре ДобавитьКомандыПечати, которая находится в модуле менеджера соответствующего объекта (например, документа или справочника). Именно здесь для каждой команды печати разработчик конфигурации может явно задать свойство Порядок. Например, если нам нужно, чтобы комплекты документов или наиболее часто используемые формы всегда были в начале списка, им может быть присвоен Порядок, равный 1, 2 или другое низкое число.

    
    // Пример фрагмента кода из модуля менеджера документа
    Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
        НоваяКоманда = КомандыПечати.Добавить();
        НоваяКоманда.Идентификатор = "СправкаОДоходах";
        НоваяКоманда.Представление = НСтр("ru = 'Справка о доходах'");
        НоваяКоманда.МенеджерПечати = "Документы.ДокументОснование";
        НоваяКоманда.Порядок = 10; // Эта команда будет выше тех, у кого Порядок > 10
    
        НоваяКоманда = КомандыПечати.Добавить();
        НоваяКоманда.Идентификатор = "КомплектДокументов";
        НоваяКоманда.Представление = НСтр("ru = 'Комплект документов'");
        НоваяКоманда.МенеджерПечати = "Документы.ДокументОснование";
        НоваяКоманда.Порядок = 1; // Эта команда будет одной из первых
    КонецПроцедуры
    

    Таким образом, мы видим, что встроенные команды печати имеют достаточно гибкий механизм для управления их позицией в выпадающем меню.

Особенности упорядочивания внешних печатных форм (ВПФ)

Внешние печатные формы (ВПФ) — это мощный инструмент для расширения функционала программы без изменения основной конфигурации. Однако их упорядочивание имеет свои особенности, которые могут отличаться от поведения встроенных форм.

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

  2. Игнорирование свойства Порядок в модуле ВПФ: Одна из наиболее частых проблем и вопросов касается свойства Порядок, которое разработчики могут попытаться указать непосредственно в модуле внешней печатной формы. Практика показывает, что это свойство, указанное в теле ВПФ, зачастую игнорируется платформой или БСП. Для ВПФ система может устанавливать Порядок = 0. Если же Порядок равен 0, то система управления печатью в БСП по умолчанию может установить его в 50, что приводит к размещению ВПФ среди обычных форм, но без возможности явного управления их порядком относительно друг друга через это свойство.

    
    // Пример кода из модуля внешней печатной формы, где Порядок может быть проигнорирован
    Функция СведенияОВнешнейОбработке() Экспорт
        ПараметрыРегистрации = Новый Структура;
        ПараметрыРегистрации.Вставить("Вид", "ДополнительныйОтчет");
        ПараметрыРегистрации.Вставить("Наименование", "МояВнешняяПечатнаяФорма");
        ПараметрыРегистрации.Вставить("Версия", "1.0");
        ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина);
        ПараметрыРегистрации.Вставить("Информация", "Демонстрационная внешняя печатная форма.");
        ПараметрыРегистрации.Вставить("Порядок", 5); // Это свойство часто игнорируется для ВПФ
    
        Команды = Новый ТаблицаЗначений;
        Команды.Колонки.Добавить("Представление");
        Команды.Колонки.Добавить("Идентификатор");
        Команды.Колонки.Добавить("Использование");
        Команды.Колонки.Добавить("Порядок"); // Здесь Порядок также может быть проигнорирован
    
        НоваяКоманда = Команды.Добавить();
        НоваяКоманда.Представление = "Печать акта (ВПФ)";
        НоваяКоманда.Идентификатор = "ПечатьАктаВПФ";
        НоваяКоманда.Использование = "Печать";
        НоваяКоманда.Порядок = 1; // Скорее всего, будет проигнорировано
    
        ПараметрыРегистрации.Вставить("Команды", Команды);
        Возврат ПараметрыРегистрации;
    КонецФункции
    

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

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

Способы влияния на порядок и управление печатными формами

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

1. Использование расширений конфигурации и подключаемых команд

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

  1. Принцип работы: Через расширение мы можем "подхватить" стандартный механизм БСП для добавления команд печати. В расширении мы создаем свой модуль менеджера для того же объекта (например, документа), для которого хотим добавить ВПФ, и в этом модуле переопределяем или дополняем процедуру ДобавитьКомандыПечати.

  2. Как это сделать:

    1. Создаем новое расширение конфигурации.
    2. В расширении добавляем ссылку на тот объект, для которого подключаем ВПФ (например, документ "Реализация товаров и услуг").
    3. Создаем модуль менеджера для этого объекта в расширении.
    4. В модуле менеджера пишем процедуру ДобавитьКомандыПечати, которая будет вызывать стандартную процедуру из основной конфигурации, а затем добавлять наши ВПФ с явно указанным Порядком.
  3. Преимущества:

    • Управление Порядком: Внешняя печатная форма, подключенная через расширение, может получить заданный Порядок, что позволяет точно контролировать ее позицию в списке. Это позволяет разместить ВПФ как среди встроенных форм, так и в определенной последовательности относительно других ВПФ.
    • Гибкость: Механизм подключаемых команд в БСП позволяет гибко настраивать, какие команды печати будут отображаться для конкретных форм документа, в зависимости от условий или настроек.
    • Сохранение типовой конфигурации: Расширение не изменяет основную конфигурацию, что значительно упрощает обновления и поддержку.

Пример кода (может отличаться в зависимости от версии БСП и конфигурации):


// В модуле менеджера документа расширения
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
    // Вызываем стандартную процедуру, чтобы получить встроенные команды
    Документы.ДокументОснование.ДобавитьКомандыПечати(КомандыПечати);

    // Добавляем команду для внешней печатной формы
    НоваяКоманда = КомандыПечати.Добавить();
    НоваяКоманда.Идентификатор = "МояВПФ_АктСверки"; // Уникальный идентификатор
    НоваяКоманда.Представление = "Акт сверки (пользовательский)"; // Название в меню
    НоваяКоманда.Обработчик = "ДрайверПечати.ВыполнитьКомандуПечатиПоИдентификатору"; // Стандартный обработчик БСП
    НоваяКоманда.Параметры.Вставить("ИдентификаторПечатнойФормы", "МояВПФ_АктСверки"); // Идентификатор, под которым ВПФ зарегистрирована
    НоваяКоманда.Параметры.Вставить("ИмяВнешнейОбработки", "ВнешняяПечатнаяФормаАктСверки"); // Имя ВПФ из справочника "Дополнительные отчеты и обработки"
    НоваяКоманда.Порядок = 20; // Устанавливаем желаемый порядок. Будет между 1 и 50.

    НоваяКоманда = КомандыПечати.Добавить();
    НоваяКоманда.Идентификатор = "МояВПФ_Договор";
    НоваяКоманда.Представление = "Договор с клиентом (расширенный)";
    НоваяКоманда.Обработчик = "ДрайверПечати.ВыполнитьКомандуПечатиПоИдентификатору";
    НоваяКоманда.Параметры.Вставить("ИдентификаторПечатнойФормы", "МояВПФ_Договор");
    НоваяКоманда.Параметры.Вставить("ИмяВнешнейОбработки", "ВнешняяПечатнаяФормаДоговор");
    НоваяКоманда.Порядок = 25; // Будет после "Акт сверки"
КонецПроцедуры

Таким образом, мы видим, что, используя расширения, мы можем эффективно "встроить" наши внешние печатные формы в общий механизм БСП и управлять их порядком наравне со встроенными.

2. Настройка видимости в разделе "Дополнительные отчеты и обработки"

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

  1. Местонахождение: Мы можем найти этот раздел в программе, перейдя в "Администрирование" – "Печатные формы, отчеты и обработки". Здесь представлен список всех подключенных дополнительных отчетов и обработок, включая внешние печатные формы.

  2. Настройка видимости: В этом разделе для каждой внешней печатной формы мы можем настроить ее видимость для различных объектов (документов, справочников). Для этого достаточно отметить галочками только те объекты, для которых данная печатная форма должна быть доступна.

  3. Назначение: Этот механизм позволяет сократить список доступных печатных форм в конкретном документе или справочнике, отображая только актуальные. Хотя это не решает проблему внутреннего упорядочивания ВПФ между собой, это значительно улучшает пользовательский опыт, убирая лишние пункты меню.

3. Создание собственной кнопки печати с выпадающим списком

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

  1. Когда это актуально: Этот подход подходит для документов, которые имеют большое количество печатных форм, требующих не только особой сортировки (например, по длине наименования, по группам), но и, возможно, дополнительной логики перед печатью.

  2. Как реализовать:

    1. Добавление кнопки: Мы добавляем на форму документа собственную кнопку "Печать".
    2. Формирование выпадающего списка: При открытии формы или по требованию (например, при нажатии на кнопку), мы программно формируем выпадающий список для этой кнопки. В этом списке мы можем собрать все нужные печатные формы (как встроенные, так и внешние), отсортировав их по любой желаемой логике (по алфавиту, по группам, по приоритету, заданному в отдельном справочнике настроек).
    3. Обработка выбора: При выборе элемента из выпадающего списка, мы вызываем соответствующую процедуру печати. Для встроенных форм это будет вызов их стандартных обработчиков, для ВПФ — их вызов через стандартные функции БСП.
  3. Преимущества: Полный контроль над сортировкой, группировкой и логикой печати. Возможность реализовать любой, даже самый сложный, сценарий.

  4. Недостатки: Требует значительных доработок конфигурации (или расширения) и поддержки этого механизма. Усложняет код формы документа.

Пример (упрощенный) добавления своей кнопки и программного формирования меню:


// В модуле формы документа
&НаКлиенте
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // ... стандартный код ...

    // Добавляем свою кнопку на командную панель
    Элемент = Элементы.Добавить("МояКнопкаПечать", Тип("Кнопка"), Элементы.КоманднаяПанельФормы);
    Элемент.Заголовок = "Печать (своя)";
    Элемент.ВидКнопки = ВидКнопкиКоманднойПанели.ВыпадающаяКнопка;
    Элемент.Расположение = РасположениеЭлементаНаФорме.КоманднаяПанель;
    Элемент.Порядок = 10; // Можем задать порядок своей кнопки

    // Создаем команды для выпадающего списка
    СоздатьКомандыДляМоейКнопкиПечать();
КонецПроцедуры

&НаКлиенте
Процедура СоздатьКомандыДляМоейКнопкиПечать()
    СписокКоманд = Элементы.МояКнопкаПечать.Кнопки; // Получаем коллекцию кнопок выпадающего списка

    // Очищаем существующие команды, если они есть
    СписокКоманд.Очистить();

    // Добавляем свои команды с нужной сортировкой
    // Предположим, мы получаем их с сервера уже отсортированными
    КомандыПечати = ПолучитьМоиКомандыПечатиНаСервере();

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

&НаСервере
Функция ПолучитьМоиКомандыПечатиНаСервере()
    Команды = Новый СписокЗначений;

    // Здесь формируем список команд, включая ВПФ и встроенные,
    // и сортируем их по нашей логике
    // Пример:
    // Команда1 = Новый Структура("Идентификатор, Представление, ТипФормы, ИмяОбработки");
    // Команда1.Идентификатор = "СобственныйАкт";
    // Команда1.Представление = "Акт по моей форме";
    // Команда1.ТипФормы = "ВПФ";
    // Команда1.ИмяОбработки = "МояВнешняяОбработкаАкт";
    // Команды.Добавить(Команда1);

    // Команда2 = Новый Структура("Идентификатор, Представление, ТипФормы, ИмяОбработки");
    // Команда2.Идентификатор = "СтандартныйДоговор";
    // Команда2.Представление = "Договор (стандарт)";
    // Команда2.ТипФормы = "Встроенная";
    // Команда2.ИмяОбработки = "ДоговорНаОсновеДокумента"; // Условное имя
    // Команды.Добавить(Команда2);

    // После формирования - сортируем
    // Команды.Сортировать("Представление Возр"); // Пример сортировки

    Возврат Команды;
КонецФункции

&НаКлиенте
Процедура ВыполнитьМоюКомандуПечати(Команда)
    // Здесь обрабатываем выбор пользователя
    ИдентификаторКоманды = Команда.Идентификатор;
    // ... вызываем нужную функцию печати в зависимости от ИдентификаторКоманды
    // Например:
    // Если Команда.Параметры.ТипФормы = "ВПФ" Тогда
    //     УправлениеПечатью.ВыполнитьКомандуПечатиВнешнейОбработки(...);
    // ИначеЕсли Команда.Параметры.ТипФормы = "Встроенная" Тогда
    //     УправлениеПечатью.ВыполнитьКомандуПечати(...);
    // КонецЕсли;
КонецПроцедуры

4. Пользовательское редактирование макетов печатных форм

Этот механизм напрямую не относится к упорядочиванию команд в меню, но является важной функцией управления печатными формами в целом, особенно в 1С:ЗУП. Начиная с определенных релизов версии 3.1 (и особенно в версиях КОРП), появилась возможность настройки и изменения макетов печатных форм приказов и других документов прямо в пользовательском режиме.

  1. Возможности: Мы можем вносить косметические изменения, такие как замена сокращенного наименования организации на полное, изменение шрифтов, добавление дополнительного текста, удаление определенных данных или перестановка блоков информации.

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

  3. Конструктор офисных документов: Также появилась возможность создавать печатные формы офисных документов (например, в формате Microsoft Word) с помощью встроенного конструктора, что расширяет возможности по созданию уникальных и сложных макетов.

  4. Местонахождение: Обычно это функционал доступен через меню "Еще" в форме документа, где есть пункт "Изменить макет печати" или подобный. Также общие настройки макетов могут быть доступны в разделе "Администрирование" – "Печатные формы, отчеты и обработки".

Ограничения и важные моменты

При работе с печатными формами и их упорядочиванием нам следует учитывать некоторые ограничения и важные особенности:

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

  2. Сложная сортировка: Стандартный механизм свойства Порядок (число от 1 до 100) может быть недостаточным, если нам требуется очень сложная или динамическая сортировка, например, по длине наименования товара, по определенным группам ВПФ, или с учетом прав пользователя. В таких случаях потребуется реализация специальной логики сортировки в коде самой печатной формы (если это ВПФ) или, что предпочтительнее, при ее формировании списка команд, например, через описанный выше механизм собственной кнопки или через расширения, где мы можем запрограммировать любую логику.

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

Таким образом, мы видим, что управление порядком печатных форм в 1С:ЗУП, особенно внешних, требует понимания принципов работы БСП. Наиболее эффективным и современным подходом является использование расширений конфигурации, которые позволяют интегрировать ВПФ в стандартный механизм БСП и управлять их порядком наравне со встроенными формами. Для специфических и сложных сценариев всегда остается возможность реализации полностью собственного механизма формирования меню печати.

← На главную