Как динамически изменять меню разделов в управляемом интерфейсе 1С?

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

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

Вариант 1. Использование функциональных опций с параметрами

Проанализируем самый распространенный метод — управление видимостью через функциональные опции (ФО). Если нам нужно имитировать изменение текста раздела, мы можем создать в дереве метаданных несколько подсистем с разными именами (например, «Продажи (розница)» и «Продажи (опт)»), но с одинаковым составом объектов. Затем мы привязываем каждую подсистему к своей функциональной опции.

Для реализации динамического переключения разберем по шагам работу с параметрами сеанса:

  1. Создадим ПараметрСеанса (например, ТекущийРежимИнтерфейса).
  2. Создадим функциональную опцию, где в качестве источника будет выступать этот параметр сеанса.
  3. В свойствах подсистем укажем соответствующие ФО.

Теперь при изменении значения в параметре сеанса платформа будет автоматически скрывать одну подсистему и показывать другую. Для пользователя это будет выглядеть как «смена названия» или состава раздела. Главный минус — необходимость заранее прописать все возможные варианты в конфигураторе. Если же вы хотите дать пользователю больше свободы, обратите внимание на расширение «Мой интерфейс», позволяющее гибко настраивать разделы.

Вариант 2. Программное управление настройками клиентского приложения

Выясним, как можно управлять интерфейсом через программный интерфейс платформы, не прибегая к созданию лишних метаданных. В 1С существует объект НастройкиИнтерфейсаКлиентскогоПриложения, который можно сохранять и извлекать из ХранилищеОбщихНастроек.

Этот метод позволяет программно переопределять состав панелей для конкретного пользователя. Рассмотрим пример кода, который позволяет манипулировать составом разделов:


// Пример получения и изменения настроек интерфейса
Настройки = ХранилищеОбщихНастроек.Загрузить("Общее/НастройкиИнтерфейсаКлиентскогоПриложения");
Если Настройки = Неопределено Тогда
    Настройки = Новый НастройкиИнтерфейсаКлиентскогоПриложения;
КонецЕсли;

// Здесь можно программно настроить видимость разделов
// Но помните, что текст (синоним) изменить всё равно нельзя
ХранилищеОбщихНастроек.Сохранить("Общее/НастройкиИнтерфейсаКлиентскогоПриложения", "", Настройки);

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

Вариант 3. Полный отказ от стандартной панели (свой менеджер разделов)

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

Вместо неё создается специальная форма (часто она назначается «Рабочим столом»), которая выступает в роли главного меню. Рассмотрим преимущества этого подхода:

  1. Динамическое формирование: Мы можем использовать ДеревоЗначений или СписокГруппировок, данные для которых берутся из справочника.
  2. Произвольные заголовки: Текст пунктов меню — это просто строковые данные, которые можно менять в любой момент.
  3. Индивидуальный дизайн: Мы не ограничены стандартными серыми кнопками 1С.

Для открытия объектов из такого самописного меню используется метод ОткрытьФорму(). При этом можно реализовать изменение цветовой гаммы интерфейса под конкретного пользователя или базу. Например:


&НаКлиенте
Процедура ПриНажатииНаПунктМеню(ИмяФормы)
    ОткрытьФорму(ИмяФормы);
КонецПроцедуры

Вариант 4. Использование HTML-поля для навигации

Проанализируем наиболее современный, но трудозатратный метод — встраивание HTML-документа в форму управляемого приложения. Это позволяет создать «воздушный интерфейс», о котором мечтают многие пользователи.

Разберем, как это работает: На форму помещается поле вида ПолеHTMLДокумента. В него загружается сверстанное на CSS/JS меню. При клике на элемент меню генерируется событие, которое перехватывается в 1С через процедуру-обработчик ПриНажатии (или через механизм ScriptCallback в новых версиях платформы). Таким образом, мы получаем интерфейс, визуально не отличимый от современных веб-сайтов, с полной свободой управления текстами и иерархией.

Вариант 5. Метод «Заглушек» и расширений

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

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

Резюме

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

← На главную