Вертикальное меню в 1С 8.3: от панели разделов до кода на форме
Содержание
Вертикальное меню в 1С делают тремя способами. Панель разделов переносят к левому краю окна в настройках интерфейса. На форме собирают группу кнопок с вертикальной группировкой. А если пунктов много или они зависят от пользователя, меню строят программно. Какой путь выбрать, определяет задача: переставить готовую навигацию или нарисовать своё меню внутри формы.
Ниже все три варианта по порядку, с кодом для платформы 8.3 и интерфейса «Такси». Если вы просто хотите, чтобы разделы стояли слева, хватит первого раздела, без конфигуратора.
Какое меню вам нужно: выбор по задаче
Слово «меню» в 1С означает разные вещи. Прежде чем что-то делать, определите, о чём речь.
| Задача | Способ | Нужен конфигуратор |
|---|---|---|
| Разделы программы столбиком слева | Настройка панелей в интерфейсе | Нет |
| Свои кнопки в столбик на форме | Группа формы с вертикальной группировкой | Да |
| Пункты зависят от прав или данных | Программное создание элементов формы | Да |
| Оформленное меню со своей вёрсткой | Поле HTML-документа | Да |
Короткое правило выбора:
- нужно только переставить разделы под себя, делайте это через настройку панелей;
- нужна навигация для всех пользователей конфигурации, собирайте группу кнопок на форме начальной страницы или в отдельной обработке;
- меню зависит от прав, данных или настроек, стройте его кодом;
- решает внешний вид, а стандартных элементов не хватает, берите поле HTML-документа.
Чем проще способ, тем меньше он ломается при обновлении платформы и конфигурации. Поэтому начинайте с первого и переходите к следующему, только когда упёрлись в ограничение.
💡 Для обычного пользователя первый вариант решает задачу за минуту. Остальные нужны разработчику.
Панель разделов слева в интерфейсе Такси
В «Такси» панель разделов по умолчанию лежит сверху. Её можно перенести к левому краю, и разделы выстроятся вертикально.
Как переместить панель разделов
- Откройте главное меню программы (кнопка со стрелкой в левом верхнем углу).
- Перейдите в пункт
Вид. - Выберите
Настройка панелей. - В открывшемся окне перетащите панель разделов к левому краю или выберите положение слева в списке расположения.
- Нажмите
ОК.
Настройка хранится в профиле пользователя, а не в конфигурации. Другие пользователи этой базы свою расстановку сохранят.
Что ещё меняется в окне настройки
Там же настраивают панель инструментов и панель открытых окон. Подряд идущие панели можно разнести по разным краям, например разделы слева, а открытые окна снизу.
Ограничение: на левой панели умещаются только заголовки разделов. Подпункты открываются в панели навигации и в командном интерфейсе раздела. Если нужно дерево из десятков пунктов, это уже задача для формы.
Если пункта Настройка панелей в вашем окне нет, администратор мог ограничить доступ к настройке интерфейса или конфигурация работает в другом режиме интерфейса.
Навигация в обычном приложении и режим совместимости
Режим «Обычное приложение» нужен конфигурациям на обычных формах. Раздельной панели разделов, как в «Такси», там нет, а привычное меню построено горизонтально: пункты Файл, Правка, Операции, Сервис и далее.
Что делать, если нужно вертикальное:
- переключить клиентское приложение конфигурации на управляемое и пользоваться «Такси»;
- либо собрать собственную навигацию на форме, как показано в следующих разделах.
Режим интерфейса задаётся в свойствах конфигурации, в поле, где выбирают версию интерфейса: «Версия 8.2», «Такси» или «Версия 8.2 и Такси». В последнем случае пользователь переключает вид в параметрах программы.
Для типовых конфигураций менять интерфейс не нужно: он выбран разработчиком, и вмешательство сломается при обновлении.
Вертикальная группа кнопок на управляемой форме
Самый частый ответ на вопрос «как сделать вертикальное меню» для разработчика: группа кнопок, подчинённые элементы которой идут друг под другом.
Пошаговая настройка в конфигураторе
- Откройте форму в редакторе и перейдите на закладку
Элементы. - Добавьте элемент типа
Группа(обычная группа, не командная панель). - В свойствах группы найдите
Группировкаи выберите значениеВертикальная. - Добавьте внутрь группы команды формы или кнопки и свяжите их с командами.
- Для широких подписей задайте у кнопок растягивание по горизонтали, чтобы они заняли одинаковую ширину.
Порядок кнопок в столбике совпадает с порядком элементов в дереве формы. Двигайте элементы вверх и вниз, пока не получите нужную последовательность.
Как оформить столбик
- Заголовок группы можно скрыть (
Отображение заголовка), если он не нужен. - Отступы задают через ширину и высоту элементов, а промежутки заполняют пустыми декорациями.
- Подписи пунктов делайте короткими: длинный текст в столбике переносится и ломает ритм.
💡 Для визуального разделения групп пунктов используйте несколько вертикальных групп внутри одной горизонтальной: получится меню с колонками.
Программное создание меню на форме
Когда пункты нельзя перечислить заранее, их добавляют из кода при открытии формы. Это частый приём: меню строится по справочнику, правам или настройкам пользователя.
Пример: создаём группу и кнопки
Код выполняется в обработчике ПриСозданииНаСервере:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Группа = Элементы.Добавить("МенюВертикальное", Тип("ГруппаФормы"), Элементы.Форма);
Группа.Вид = ВидГруппыФормы.ОбычнаяГруппа;
Группа.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;
Группа.ОтображатьЗаголовок = Ложь;
ИмяСписка = "Продажи,Покупки,Склад";
Пункты = СтрРазделить(ИмяСписка, ",");
Для Каждого Пункт Из Пункты Цикл
ИмяКоманды = "Команда" + Пункт;
Команда = Команды.Добавить(ИмяКоманды);
Команда.Действие = "ОткрытьПункт";
Команда.Заголовок = Пункт;
Кнопка = Элементы.Добавить("Кнопка" + Пункт, Тип("КнопкаФормы"), Группа);
Кнопка.ИмяКоманды = ИмяКоманды;
КонецЦикла;
КонецПроцедуры
Единый обработчик для всех динамических команд пишут на клиенте:
&НаКлиенте
Процедура ОткрытьПункт(Команда)
// Имя команды содержит название пункта
Сообщить("Выбран пункт: " + Команда.Имя);
КонецПроцедуры
Здесь обработчик один на всех, а по Команда.Имя вы узнаёте, какой пункт нажат. В реальной задаче вместо Сообщить открывайте нужную форму или отчёт.
Типичные нюансы
- Элементы добавляются на сервере, а действие команды обрабатывается на клиенте: не перепутайте директивы
&НаСервереи&НаКлиенте. - Имя элемента и команды должно быть уникальным и начинаться с буквы. Пробелы и точки недопустимы.
- Если форма в режиме просмотра конфигурации не меняется, изменения не видны: перезапустите 1С:Предприятие.
Меню собирайте при создании формы, в ПриСозданииНаСервере. Менять состав элементов у уже открытой формы можно, но код сложнее, и для навигации это почти никогда не нужно.
Панель команд и кнопки: как собрать меню из команд
Если в меню должны быть действия над объектом, лучше использовать не обычную группу, а командную панель и существующие команды.
Что даёт командная панель:
- кнопки автоматически получают стандартные подписи и пиктограммы;
- команды можно показывать подменю, если они не помещаются в строку;
- права доступа к командам учитываются сами.
Чтобы получить вертикальную раскладку, положите командную панель внутрь вертикальной группы. Сама панель по умолчанию горизонтальна, поэтому нужен промежуточный контейнер.
Ещё один вариант: добавить в форму выпадающее меню (группа вида Подменю). Оно раскрывается вниз, и пункты стоят друг под другом, как в обычном меню. Для пользователя это самый привычный вид вертикального списка команд.
| Элемент | Раскладка | Когда брать |
|---|---|---|
| Обычная группа, вертикальная | Всегда видна, столбик | Постоянная навигация |
| Подменю | Раскрывается по клику | Много команд, мало места |
| Командная панель | Строка, при нехватке места подменю | Действия над списком или документом |
Меню на поле HTML-документа
Если нужен нестандартный вид (цвета, иконки, раскрывающиеся ветки), меню рисуют в поле HTML-документа. Вёрстка остаётся обычной, а нажатия пользователя перехватывает форма.
Как это устроено
- На форме создайте реквизит типа
Строкаи добавьте на форму поле видаПоле HTML-документа. - Привяжите поле к реквизиту: в нём будет лежать разметка.
- В реквизит запишите HTML со списком ссылок: тегами
<ul>,<li>и<a href="...">. - Для столбика достаточно стандартного списка без стилей, элементы
<li>идут друг под другом. - В обработчике нажатия поля проверьте, по какой ссылке кликнули, и выполните действие.
Пример простой разметки:
<ul style="list-style:none;padding:0;margin:0;font-family:Arial">
<li><a href="menu:sales">Продажи</a></li>
<li><a href="menu:buy">Покупки</a></li>
<li><a href="menu:stock">Склад</a></li>
</ul>
Обработчик события нажатия получает данные события. По ссылке (ДанныеСобытия.Href) определяют пункт и обрабатывают его, а стандартную обработку отключают, чтобы поле не пыталось перейти по адресу menu:....
Ограничения
- Движок отображения HTML зависит от компьютера пользователя. На разных клиентах (Windows, веб-клиент) вёрстка может отличаться.
- Скрипты в поле работают не везде. Для надёжности используйте простую вёрстку и стили, а логику держите в 1С.
- Веб-клиент и тонкий клиент ведут себя по-разному: проверяйте оба.
Этот способ тяжелее остальных. Берите его, когда стандартных элементов не хватает по дизайну.
Показ пунктов по правам и ролям
Динамическое меню полезно прежде всего тем, что показывает пользователю только доступное. Один и тот же код строит разный столбик для бухгалтера и для кладовщика.
Схема простая:
- Составьте список пунктов вместе с условием показа: например, пара «название пункта — нужная роль».
- В цикле проверяйте условие и создавайте кнопку только для подходящих пунктов.
- Для проверки прав используйте метод
РольДоступна("ИмяРоли")илиПравоДоступа(...)для конкретного объекта.
Пример проверки внутри цикла:
Если Не РольДоступна("Бухгалтер") И Пункт = "Продажи" Тогда
Продолжить;
КонецЕсли;
Скрывать кнопку можно и не удаляя: свойство Видимость у элемента меняют на Ложь. Для навигации чище не создавать лишнее, чем потом прятать.
💡 Не полагайтесь на меню как на защиту. Скрытая кнопка не запрещает действие: права на объекты настраивайте в ролях, а меню оставьте удобством.
Как не потерять меню при обновлении
Самодельное меню в типовой форме легко потерять. Типовую форму меняет каждый релиз, а ваши правки при обновлении придётся сопоставлять вручную.
Рабочие варианты, от лучшего к худшему:
- Расширение конфигурации . Меню живёт в расширении и не затрагивает типовой код. Это основной способ для доработок на поддержке.
- Отдельная обработка или собственная форма. Меню открывается как самостоятельный объект и не зависит от обновлений типовой формы.
- Правка типовой формы. Рабочий, но неудобный путь: после каждого обновления проверяйте результат объединения.
Расширения доступны начиная с платформы 8.3.6. Загрузка расширения и применение его к базе данных выполняются отдельными шагами: сначала расширение подключают, затем обновляют конфигурацию базы данных.
Ошибки и что проверить, если меню не получается
Пройдитесь по списку, если результат не такой, как ожидали:
- Элементы идут в строку, а не в столбик. Проверьте свойство
Группировкау группы: должно стоятьВертикальная. Командная панель внутри неё тоже может держать кнопки в строку. - Кнопки разной ширины. Включите растягивание по горизонтали и задайте одинаковую ширину.
- Кнопка нажимается, но ничего не происходит. Убедитесь, что у команды указано
Действие, а процедура с этим именем есть в модуле формы с директивой&НаКлиенте. - Динамические элементы пропали после повторного открытия. Они создаются при каждом создании формы. Если код в условии, проверьте, что условие выполняется.
- Панель разделов не переезжает влево. Настройка хранится в профиле. Если профиль сбрасывается политикой администратора, настройка не сохранится.
Частые вопросы
Можно ли поставить разделы слева в типовой конфигурации без доработки?
Вид → Настройка панелей. Конфигурацию менять не нужно, настройка применяется к вашему профилю.