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