Стандартная панель навигации в 1С:Предприятие 8.3 обладает рядом жестких ограничений: разработчик не может произвольно менять шрифты, добавлять сложные категории, использовать произвольные иконки или настраивать анимацию переходов. В этой статье мы разберем, как создать собственную панель навигации, которая будет выглядеть современно и обладать гибкостью, недоступной типовым средствам платформы.
Проанализируем основные претензии к штатному механизму. Как справедливо замечено в обсуждении, в стандартной панели «почти ничего нельзя»: нельзя добавить свою категорию программно в рантайме с нужным оформлением, нельзя изменить шрифт кнопки или визуально выделить активный раздел нестандартным способом. Более того, стандартная панель привязана к метаданным, что ограничивает возможности динамического построения интерфейса под конкретного пользователя.
Рассмотрим наиболее надежный способ реализации «сквозной» навигации. Вместо того чтобы заставлять пользователя открывать десятки независимых окон, мы создадим одну главную форму, которая будет выступать в роли рабочего пространства.
Пошаговый алгоритм реализации:
РабочийСтолРазработчика.ГруппаСтраницы. Важный момент: установим свойство ОтображениеЗакладок в значение Не отображать.ПриНажатии.В обработчике мы будем программно переключать видимость страниц в правой части. Проанализируем пример кода для переключения разделов:
&НаКлиенте
Процедура ПанельНавигацииПриНажатии(Элемент)
// Определяем, какую страницу показать
ИмяСтраницы = "Страница_" + Элемент.Имя;
Элементы.ГруппаКонтент.ТекущаяСтраница = Элементы[ИмяСтраницы];
// Визуально выделяем активную "кнопку"
ПодсветитьАктивныйПункт(Элемент.Имя);
КонецПроцедуры
Этот метод решает проблему, озвученную в сообщении №4: левая часть остается неизменной, пока меняется содержимое правой. Однако у этого метода есть минус — если в правой части нужно открывать полноценные формы справочников или документов, их придется предварительно «внедрять» в структуру страниц.
Если нам нужна по-настоящему красивая панель с анимацией, выпадающими меню и SVG-иконками, мы обратимся к механизму ПолеHTMLДокумента. Это самый мощный инструмент кастомизации интерфейса в 1С.
Выясним, как это работает. Мы создаем строку HTML, описывающую дизайн нашей панели, и загружаем ее в элемент формы. Для взаимодействия HTML-панели с кодом 1С используем событие ПриНажатии (для старых версий) или механизм window.external.
Рассмотрим пример формирования структуры меню:
&НаСервере
Функция СформироватьМенюHTML()
ТекстHTML = "<html><body style='background-color: #f0f0f0;'>";
ТекстHTML = ТекстHTML + "<div class='menu-item' onclick='sendTo1C(\"OpenSales\")'>Продажи</div>";
ТекстHTML = ТекстHTML + "<div class='menu-item' onclick='sendTo1C(\"OpenStock\")'>Склад</div>";
ТекстHTML = ТекстHTML + "</body></html>";
Возврат ТекстHTML;
КонецФункции
Преимущество этого метода в том, что вы можете использовать любой CSS-фреймворк. Весь дизайн навигации отделен от логики 1С, что позволяет достичь уровня визуализации, недоступного стандартным элементам управления.
Разберем ситуацию, когда нам нужно встроить одну форму в другую динамически. В новых версиях платформы появилась долгожданная возможность. Теперь мы можем создать форму программно и поместить ее в группу на родительской форме.
Проанализируем техническую реализацию:
Для этого используется возможность расширения формы через программное создание элементов. Мы создаем форму нужного нам объекта (например, справочника «Контрагенты») и указываем в качестве владельца нашу главную панель.
// Пример логики открытия формы внутри контейнера
ПараметрыФормы = Новый Структура("Ключ", СсылкаНаОбъект);
НоваяФорма = ПолучитьФорму("Справочник.Контрагенты.ФормаОбъекта", ПараметрыФормы, Элементы.ГруппаДляВстраивания);
НоваяФорма.Открыть();
Это решает проблему «формы в форме», которая долгое время была камнем преткновения для разработчиков 1С.
В сообщении №11 упоминается проблема: при попытке сложной загрузки форм сбивается работа с основным реквизитом (например, Объект для документа). Посмотрим, как это обойти.
При использовании самодельных панелей навигации важно корректно передавать контекст данных. Если ваша панель должна управлять данными конкретного документа, используйте методы преобразования данных:
ДанныеФормыВЗначение(), чтобы получить объект из контекста формы и произвести с ним манипуляции на сервере.ЗначениеВДанныеФормы(), чтобы обновить отображение в вашей кастомной панели.Это гарантирует, что 1С будет правильно отслеживать модифицированность данных (звездочка в заголовке окна) и отрабатывать стандартные подписки на события, даже если форма открыта внутри вашего кастомного интерфейса.
Чтобы ваша панель навигации не выглядела «чужеродной», придерживайтесь следующих правил:
Подводя итог, можно сказать, что создание собственной панели навигации в 1С — задача трудоемкая, но выполнимая. Выбор метода зависит от ваших целей: для простого переключения между отчетами подойдет метод «Одной формы», а для создания уникального интерфейса лучше использовать HTML-поле или современные механизмы встраивания форм.