Как разместить одну команду и на панели навигации формы, и в командном интерфейсе?

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

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

Проблема заключается в том, что при создании объекта Команда в конфигураторе, в её свойстве «Группа» можно выбрать только одно значение. Это свойство определяет, к какой стандартной группе команд будет относиться наша команда: к навигационной панели формы, к командной панели формы, к командам печати, создания и так далее. Из-за этого ограничения невозможно одной и той же командой «закрыть» сразу две разные по своей природе области интерфейса.

Основное решение: две команды с одним обработчиком

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

Рассмотрим этот процесс по шагам.

  1. Создание общей процедуры в общем модуле.

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

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

    Теперь создадим первую команду в соответствующем объекте конфигурации (например, в справочнике «Пользователи»).

    • Назовем её, например, ОткрытьРегистрИзФормы.
    • В свойстве «Группа» выберем нужное значение, например, Панель навигации формы.Перейти.
    • Тип параметра команды укажем СправочникСсылка.Пользователи, если команда должна быть контекстной.

    В модуле команды пропишем вызов нашей общей процедуры:

    
    // Модуль команды ОткрытьРегистрИзФормы
    
    &НаКлиенте
    Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
    	
        МоиОбщиеПроцедуры.ОткрытьФормуРегистраСведенийПользователя(ПараметрКоманды);
    	
    КонецПроцедуры
    
  3. Создание второй команды для командного интерфейса.

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

    • Назовем её ОткрытьРегистрИзИнтерфейса.
    • В свойстве «Группа» выберем группу командного интерфейса, например, Командная панель раздела.Сервис.

    Обработчик этой команды будет выглядеть точно так же, как и у первой, вызывая ту же самую общую процедуру:

    
    // Модуль команды ОткрытьРегистрИзИнтерфейса
    
    &НаКлиенте
    Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
    	
        // Здесь ПараметрКоманды, скорее всего, будет Неопределено,
        // так как команда вызывается не из контекста формы элемента
        МоиОбщиеПроцедуры.ОткрытьФормуРегистраСведенийПользователя(ПараметрКоманды);
    	
    КонецПроцедуры
    
  4. Настройка видимости.

    Не забудьте настроить видимость глобальной команды (ОткрытьРегистрИзИнтерфейса) в редакторе командного интерфейса для нужных подсистем и ролей пользователей.

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

Что насчет других вариантов?

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

Параметризуемые команды

Параметризуемые команды — это мощный механизм платформы. Вы создаете команду и указываете для нее «Тип параметра команды». Платформа автоматически добавляет эту команду в те формы, где есть данные указанного типа. Например, если указать тип СправочникСсылка.Пользователи, команда появится в формах списка и элемента этого справочника.

Однако этот механизм не решает исходную задачу. Местоположение параметризуемой команды также жестко задается свойством «Группа». Она может появиться во многих формах, но всегда в одной и той же группе (например, всегда в командной панели). Она не может одновременно появиться и в командной панели, и в панели навигации.

Перетаскивание команд в редакторе формы

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

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

← На главную