Как реализовать динамическое программное меню в 1С:Предприятие 8.3 на управляемых формах?

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

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

Проблема статического интерфейса и функциональных опций

Традиционно для изменения состава меню в 1С используются роли и ФункциональныеОпции. Разберем, почему этот путь не всегда оптимален для динамических задач:

  1. Обновление интерфейса: Метод ОбновитьИнтерфейс() — крайне тяжелая операция. В крупных конфигурациях, таких как ERP или Комплексная автоматизация, вызов этого метода заставляет систему «задуматься» на 5–15 секунд, так как платформа перерисовывает все открытые окна и заново запрашивает параметры с сервера.
  2. Ограниченность иерархии: Стандартная панель разделов не поддерживает глубокую вложенность (деревовидную структуру), что неудобно для систем с сотнями отчетов и документов.
  3. Жесткая привязка к метаданным: Изменить порядок или состав пунктов меню без изменения конфигурации или расширения практически невозможно.

Решение через закрепляемые формы

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

Для начала проанализируем настройки формы. Чтобы форма вела себя как меню, нам необходимо управлять её свойством ВариантПрикрепления. Рассмотрим пример программного открытия такой формы при старте системы:


ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("РежимМеню", Истина);

ФормаМеню = ОткрытьФорму("ОбщаяФорма.МоеДинамическоеМеню", ПараметрыФормы, , "УникальныйКлючМеню");
ФормаМеню.ВариантПрикрепления = ВариантПрикрепленияФормы.Лево;

Важно понимать, что для полной имитации «родного» интерфейса в настройках конфигурации (в разделе «Интерфейс клиентского приложения») следует убрать видимость всех стандартных панелей для целевых пользователей.

Наполнение меню: Дерево значений против HTML

Разберем два основных способа визуализации данных внутри закрепленной формы.

Способ 1: Использование элемента «Дерево значений». Это классический подход 1С. Мы создаем реквизит формы с типом ДеревоЗначений и выводим его на форму. При нажатии на строку дерева мы анализируем данные и открываем нужный объект.


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

Способ 2: Поле HTML-документа. Этот метод позволяет создать «ультра-динамическое» меню. Мы можем использовать CSS и JavaScript для создания современных анимированных меню, которые выглядят как веб-приложения. Для взаимодействия HTML-меню с кодом 1С используем событие ПриНажатии (для старых версий) или механизм СредстваИнтеграцииJavaScript.

Рассмотрим, как пробросить команду из HTML в 1С:


&НаКлиенте
Процедура ПолеHTMLДокументаПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
    // Допустим, в HTML мы передаем ID команды в атрибуте href
    Ссылка = ДанныеСобытия.Anchor.href; 
    Если Найти(Ссылка, "v8action:") > 0 Тогда
        СтандартнаяОбработка = Ложь;
        ИмяКоманды = СтрЗаменить(Ссылка, "v8action:", "");
        ВыполнитьКомандуМеню(ИмяКоманды);
    КонецЕсли;
КонецПроцедуры

Использование метода Navigate() для управления окнами

Проанализируем метод ПерейтиПоНавигационнойСсылке() (или Navigate() в англоязычном варианте). Это ключевой инструмент при создании своего меню. Он позволяет открывать не только формы списков, но и конкретные отчеты с установленными параметрами или записи регистров. Главное преимущество — сохранение истории переходов платформы, что позволяет пользователю использовать стандартные кнопки «Вперед» и «Назад» в заголовке приложения.

Оптимизация производительности: избегаем лишних серверных вызовов

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

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


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

Дополнительные возможности: Индивидуальные АРМ

Создание динамического меню открывает путь к построению полноценных АРМ (Автоматизированных рабочих мест). Мы можем встроить в боковую панель не только ссылки на объекты, но и оперативную информацию:

Посмотрим на пример вывода количества задач в пункт меню. Это делается простым обновлением заголовка элемента дерева или текста в HTML-поле без вызова ОбновитьИнтерфейс().

Подведем итог: реализация динамического меню в управляемых формах 1С — это уже не фантастика, а реальный технический стек. Сочетание закрепляемых форм, метода ПерейтиПоНавигационнойСсылке и, в продвинутых случаях, HTML-полей, позволяет обойти ограничения «галочного» программирования и создать интерфейс, который действительно удобен пользователю и легок в администрировании.

← На главную