Как добавить новый подпункт меню в интерфейс обычных форм через расширение 1С 8.3?

Программист 1С v8.3 (Обычные формы)
← На главную

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

Начнем с анализа ситуации. У нас есть конфигурация на платформе 1С:Предприятие 8.3 (например, 8.3.24.1342) с обычными формами и установленным режимом совместимости интерфейса 8.2. Мы уже перенесли часть объектов основной конфигурации в расширение и теперь хотим добавить новый пункт меню, который будет вызывать нашу новую обработку. Возникает вопрос: как это сделать без переноса всей конфигурации в расширение?

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

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

Итак, давайте рассмотрим подробнее подходы к добавлению подпункта меню к интерфейсу в расширении для обычных форм.

Подход 1: Добавление команд через командный интерфейс формы расширения

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

Разберем по шагам, как это можно реализовать:

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

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

Подход 2: Программное добавление команд (при использовании БСП)

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

Рассмотрим шаги для этого подхода:

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

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

Особенности и ограничения, о которых следует помнить

При работе с расширениями и обычными формами в режиме совместимости 8.2, мы сталкиваемся с рядом нюансов:

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

Мы выяснили, что даже при кажущихся ограничениях обычных форм и расширений, платформа 1С предоставляет инструменты для решения этой задачи. Главное – правильно выбрать подход и учесть все особенности режима совместимости и работы с расширениями.

← На главную