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