Вертикальное меню в 1С 8.3: от панели разделов до кода на форме

· 9 мин

Содержание

Вертикальное меню в 1С делают тремя способами. Панель разделов переносят к левому краю окна в настройках интерфейса. На форме собирают группу кнопок с вертикальной группировкой. А если пунктов много или они зависят от пользователя, меню строят программно. Какой путь выбрать, определяет задача: переставить готовую навигацию или нарисовать своё меню внутри формы.

Ниже все три варианта по порядку, с кодом для платформы 8.3 и интерфейса «Такси». Если вы просто хотите, чтобы разделы стояли слева, хватит первого раздела, без конфигуратора.

Какое меню вам нужно: выбор по задаче

Слово «меню» в 1С означает разные вещи. Прежде чем что-то делать, определите, о чём речь.

ЗадачаСпособНужен конфигуратор
Разделы программы столбиком слеваНастройка панелей в интерфейсеНет
Свои кнопки в столбик на формеГруппа формы с вертикальной группировкойДа
Пункты зависят от прав или данныхПрограммное создание элементов формыДа
Оформленное меню со своей вёрсткойПоле HTML-документаДа

Короткое правило выбора:

  • нужно только переставить разделы под себя, делайте это через настройку панелей;
  • нужна навигация для всех пользователей конфигурации, собирайте группу кнопок на форме начальной страницы или в отдельной обработке;
  • меню зависит от прав, данных или настроек, стройте его кодом;
  • решает внешний вид, а стандартных элементов не хватает, берите поле HTML-документа.

Чем проще способ, тем меньше он ломается при обновлении платформы и конфигурации. Поэтому начинайте с первого и переходите к следующему, только когда упёрлись в ограничение.

💡 Для обычного пользователя первый вариант решает задачу за минуту. Остальные нужны разработчику.

Панель разделов слева в интерфейсе Такси

В «Такси» панель разделов по умолчанию лежит сверху. Её можно перенести к левому краю, и разделы выстроятся вертикально.

Как переместить панель разделов

  1. Откройте главное меню программы (кнопка со стрелкой в левом верхнем углу).
  2. Перейдите в пункт Вид.
  3. Выберите Настройка панелей.
  4. В открывшемся окне перетащите панель разделов к левому краю или выберите положение слева в списке расположения.
  5. Нажмите ОК.

Настройка хранится в профиле пользователя, а не в конфигурации. Другие пользователи этой базы свою расстановку сохранят.

Что ещё меняется в окне настройки

Там же настраивают панель инструментов и панель открытых окон. Подряд идущие панели можно разнести по разным краям, например разделы слева, а открытые окна снизу.

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

Если пункта Настройка панелей в вашем окне нет, администратор мог ограничить доступ к настройке интерфейса или конфигурация работает в другом режиме интерфейса.

Навигация в обычном приложении и режим совместимости

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

Что делать, если нужно вертикальное:

  • переключить клиентское приложение конфигурации на управляемое и пользоваться «Такси»;
  • либо собрать собственную навигацию на форме, как показано в следующих разделах.

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

Для типовых конфигураций менять интерфейс не нужно: он выбран разработчиком, и вмешательство сломается при обновлении.

Вертикальная группа кнопок на управляемой форме

Самый частый ответ на вопрос «как сделать вертикальное меню» для разработчика: группа кнопок, подчинённые элементы которой идут друг под другом.

Пошаговая настройка в конфигураторе

  1. Откройте форму в редакторе и перейдите на закладку Элементы.
  2. Добавьте элемент типа Группа (обычная группа, не командная панель).
  3. В свойствах группы найдите Группировка и выберите значение Вертикальная.
  4. Добавьте внутрь группы команды формы или кнопки и свяжите их с командами.
  5. Для широких подписей задайте у кнопок растягивание по горизонтали, чтобы они заняли одинаковую ширину.

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

Как оформить столбик

  • Заголовок группы можно скрыть (Отображение заголовка), если он не нужен.
  • Отступы задают через ширину и высоту элементов, а промежутки заполняют пустыми декорациями.
  • Подписи пунктов делайте короткими: длинный текст в столбике переносится и ломает ритм.

💡 Для визуального разделения групп пунктов используйте несколько вертикальных групп внутри одной горизонтальной: получится меню с колонками.

Программное создание меню на форме

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

Пример: создаём группу и кнопки

Код выполняется в обработчике ПриСозданииНаСервере:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

	Группа = Элементы.Добавить("МенюВертикальное", Тип("ГруппаФормы"), Элементы.Форма);
	Группа.Вид = ВидГруппыФормы.ОбычнаяГруппа;
	Группа.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;
	Группа.ОтображатьЗаголовок = Ложь;

	ИмяСписка = "Продажи,Покупки,Склад";
	Пункты = СтрРазделить(ИмяСписка, ",");

	Для Каждого Пункт Из Пункты Цикл
		ИмяКоманды = "Команда" + Пункт;
		Команда = Команды.Добавить(ИмяКоманды);
		Команда.Действие = "ОткрытьПункт";
		Команда.Заголовок = Пункт;

		Кнопка = Элементы.Добавить("Кнопка" + Пункт, Тип("КнопкаФормы"), Группа);
		Кнопка.ИмяКоманды = ИмяКоманды;
	КонецЦикла;

КонецПроцедуры

Единый обработчик для всех динамических команд пишут на клиенте:

&НаКлиенте
Процедура ОткрытьПункт(Команда)
	// Имя команды содержит название пункта
	Сообщить("Выбран пункт: " + Команда.Имя);
КонецПроцедуры

Здесь обработчик один на всех, а по Команда.Имя вы узнаёте, какой пункт нажат. В реальной задаче вместо Сообщить открывайте нужную форму или отчёт.

Типичные нюансы

  • Элементы добавляются на сервере, а действие команды обрабатывается на клиенте: не перепутайте директивы &НаСервере и &НаКлиенте.
  • Имя элемента и команды должно быть уникальным и начинаться с буквы. Пробелы и точки недопустимы.
  • Если форма в режиме просмотра конфигурации не меняется, изменения не видны: перезапустите 1С:Предприятие.

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

Панель команд и кнопки: как собрать меню из команд

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

Что даёт командная панель:

  • кнопки автоматически получают стандартные подписи и пиктограммы;
  • команды можно показывать подменю, если они не помещаются в строку;
  • права доступа к командам учитываются сами.

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

Ещё один вариант: добавить в форму выпадающее меню (группа вида Подменю). Оно раскрывается вниз, и пункты стоят друг под другом, как в обычном меню. Для пользователя это самый привычный вид вертикального списка команд.

ЭлементРаскладкаКогда брать
Обычная группа, вертикальнаяВсегда видна, столбикПостоянная навигация
ПодменюРаскрывается по кликуМного команд, мало места
Командная панельСтрока, при нехватке места подменюДействия над списком или документом

Меню на поле HTML-документа

Если нужен нестандартный вид (цвета, иконки, раскрывающиеся ветки), меню рисуют в поле HTML-документа. Вёрстка остаётся обычной, а нажатия пользователя перехватывает форма.

Как это устроено

  1. На форме создайте реквизит типа Строка и добавьте на форму поле вида Поле HTML-документа.
  2. Привяжите поле к реквизиту: в нём будет лежать разметка.
  3. В реквизит запишите HTML со списком ссылок: тегами <ul>, <li> и <a href="...">.
  4. Для столбика достаточно стандартного списка без стилей, элементы <li> идут друг под другом.
  5. В обработчике нажатия поля проверьте, по какой ссылке кликнули, и выполните действие.

Пример простой разметки:

<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С.
  • Веб-клиент и тонкий клиент ведут себя по-разному: проверяйте оба.

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

Показ пунктов по правам и ролям

Динамическое меню полезно прежде всего тем, что показывает пользователю только доступное. Один и тот же код строит разный столбик для бухгалтера и для кладовщика.

Схема простая:

  1. Составьте список пунктов вместе с условием показа: например, пара «название пункта — нужная роль».
  2. В цикле проверяйте условие и создавайте кнопку только для подходящих пунктов.
  3. Для проверки прав используйте метод РольДоступна("ИмяРоли") или ПравоДоступа(...) для конкретного объекта.

Пример проверки внутри цикла:

Если Не РольДоступна("Бухгалтер") И Пункт = "Продажи" Тогда
	Продолжить;
КонецЕсли;

Скрывать кнопку можно и не удаляя: свойство Видимость у элемента меняют на Ложь. Для навигации чище не создавать лишнее, чем потом прятать.

💡 Не полагайтесь на меню как на защиту. Скрытая кнопка не запрещает действие: права на объекты настраивайте в ролях, а меню оставьте удобством.

Как не потерять меню при обновлении

Самодельное меню в типовой форме легко потерять. Типовую форму меняет каждый релиз, а ваши правки при обновлении придётся сопоставлять вручную.

Рабочие варианты, от лучшего к худшему:

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

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

Ошибки и что проверить, если меню не получается

Пройдитесь по списку, если результат не такой, как ожидали:

  • Элементы идут в строку, а не в столбик. Проверьте свойство Группировка у группы: должно стоять Вертикальная. Командная панель внутри неё тоже может держать кнопки в строку.
  • Кнопки разной ширины. Включите растягивание по горизонтали и задайте одинаковую ширину.
  • Кнопка нажимается, но ничего не происходит. Убедитесь, что у команды указано Действие, а процедура с этим именем есть в модуле формы с директивой &НаКлиенте.
  • Динамические элементы пропали после повторного открытия. Они создаются при каждом создании формы. Если код в условии, проверьте, что условие выполняется.
  • Панель разделов не переезжает влево. Настройка хранится в профиле. Если профиль сбрасывается политикой администратора, настройка не сохранится.

Частые вопросы

Можно ли поставить разделы слева в типовой конфигурации без доработки?
Да. Через главное меню: Вид → Настройка панелей. Конфигурацию менять не нужно, настройка применяется к вашему профилю.
Работает ли вертикальное меню в веб-клиенте?
Группы кнопок и подменю работают. Поле HTML-документа отображается, но вёрстка может отличаться от тонкого клиента, поэтому проверьте в обоих.
Нужна ли отдельная команда на каждый пункт при программном создании?
Нет. Достаточно одного обработчика, который различает пункты по имени команды. Команды и кнопки создаются в цикле.
Сломается ли самодельное меню при обновлении типовой конфигурации?
Если вы изменили типовую форму, обновление потребует объединения изменений. Безопаснее выносить меню в расширение конфигурации.
Чем отличаются подменю и вертикальная группа?
Подменю раскрывается по клику и экономит место. Вертикальная группа всегда на виду и подходит для постоянной навигации.