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