Разработчики типовых решений на платформе «1С:Предприятие 8» часто сталкиваются с ситуацией, когда клиенту требуется индивидуальная настройка интерфейса. Одно из наиболее частых пожеланий — кастомизация раздела «Главное». Пользователи хотят видеть там определенный набор документов, отчетов и обработок (например, сократить всё до 8–10 ключевых пунктов), чтобы не блуждать по многочисленным стандартным разделам конфигурации.
Однако при первом же обновлении типовой конфигурации разработчик сталкивается с проблемой: внесенные вручную изменения в командный интерфейс основного раздела могут затереться стандартными настройками нового релиза. В этой статье мы подробно рассмотрим, как решить эту задачу «культурно», сохранив индивидуальные настройки клиента и минимизировав трудозатраты при последующих обновлениях системы. Мы разберем как интерактивные методы, так и полностью программные альтернативы, которые можно реализовать без использования расширений или с ними.
Если меню «Главное» уже было настроено вручную непосредственно в конфигураторе основной базы, его необязательно пересобирать заново при каждом накатывании нового релиза. Платформа «1С:Предприятие» позволяет гибко управлять объединением свойств интерфейса.
Проанализируем по шагам процесс обновления в этом случае:
cf-файл) откройте окно «Сравнение и объединение конфигураций».Важный нюанс: при использовании этого метода необходимо вручную проверять, не появились ли в новом релизе поставщика критически важные стандартные команды в разделе «Главное». Если такие команды появились и они нужны пользователю, их придется добавить в интерфейс вручную после завершения обновления.
Использование расширений — наиболее «чистый» способ кастомизации интерфейса, не требующий изменения основной конфигурации. Это позволяет оставить основную конфигурацию полностью на замке (на поддержке без возможности изменения), что значительно упрощает и удешевляет процесс обновления.
Разберем, как кастомизировать главное меню с помощью расширения:
Если необходимо полностью скрыть стандартные разделы и оставить только ваше кастомное меню, это также можно сделать через расширение, настроив роли или отключив видимость стандартных разделов для конкретных профилей пользователей.
Платформа 1С на уровне встроенного языка не позволяет напрямую динамически добавлять новые команды в стандартный командный интерфейс основного раздела во время работы системы. Если клиент категорически отказывается от использования расширений (например, из-за устаревшей версии платформы или нежелания администрировать дополнительные компоненты), отличным решением станет создание собственной Начальной страницы (Рабочего стола).
Выясним, как реализовать этот механизм программно:
РабочийСтолПользователя) и добавьте в нее управляемую форму.Рассмотрим пример кода, который считывает настройки интерфейса из регистра сведений и программно строит меню на форме в процедуре ПриСозданииНаСервере:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Считаем настройки меню для текущего пользователя
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| НастройкиИнтерфейса.ИмяКоманды КАК ИмяКоманды,
| НастройкиИнтерфейса.Заголовок КАК Заголовок,
| НастройкиИнтерфейса.НавигационнаяСсылка КАК НавигационнаяСсылка
|ИЗ
| РегистрСведений.НастройкиИнтерфейсаПользователей КАК НастройкиИнтерфейса
|ГДЕ
| НастройкиИнтерфейса.Пользователь = &ТекущийПользователь";
Запрос.УстановитьПараметр("ТекущийПользователь", ПользователиИнформационнойБазы.ТекущийПользователь());
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
// Создаем группу для размещения кнопок меню
ГруппаМеню = Элементы.Добавить("ГруппаКастомноеМеню", Тип("ГруппаФормы"), ЭтаФорма);
ГруппаМеню.Вид = ВидГруппыФормы.ОбычнаяГруппа;
ГруппаМеню.Отображение = ОтображениеОбычнойГруппы.Нет;
ГруппаМеню.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;
Пока Выборка.Следующий() Цикл
// Программно создаем кнопку на форме для каждого пункта меню
ИмяКнопки = "Кнопка_" + Выборка.ИмяКоманды;
НоваяКнопка = Элементы.Добавить(ИмяКнопки, Тип("КнопкаФормы"), ГруппаМеню);
НоваяКнопка.Заголовок = Выборка.Заголовок;
НоваяКнопка.ИмяКоманды = "ВыполнитьПереход";
// Сохраняем навигационную ссылку во внутренний массив для последующего перехода
// (можно использовать параметры кнопки или структуру на сервере)
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Такой подход обеспечивает 100% независимость от обновлений конфигурации поставщика: ваша обработка и регистр сведений являются новыми объектами, которые никогда не затрутся при обновлении. Интерфейс при этом выглядит современно и полностью управляется в режиме «1С:Предприятие».
Если все 8 пунктов меню, которые хочет видеть клиент в разделе «Главное», соответствуют стандартным объектам конфигурации, мы можем управлять их видимостью с помощью механизма Функциональных опций. Этот метод позволяет программно скрывать лишнее и показывать только нужное.
Проанализируем ситуацию и настроим этот механизм:
ОтображатьИндивидуальноеМеню). В качестве хранилища параметров ФО можно использовать константу или ресурс регистра сведений.ПриНачалеРаботыСистемы) программно устанавливайте значение этой функциональной опции в зависимости от текущего пользователя.После изменения параметров функциональной опции в коде обязательно вызовите обновление интерфейса клиента:
// Установка значения функциональной опции для текущего сеанса
ПараметрыФО = Новый Структура("Пользователь", Пользователи.ТекущийПользователь());
УстановитьПараметрыФункциональныхОпцийИнтерфейса(ПараметрыФО);
// Принудительное обновление командного интерфейса на клиенте
ОбновитьИнтерфейс();
Платформа автоматически перестроит меню «Главное», скрыв все элементы, для которых функциональная опция вернула ложное значение. Конфигурация при этом практически не затрагивается, а логика работы остается чистой и понятной.
Еще один профессиональный способ «придавить» лишние разделы и настроить состав главного меню под конкретного пользователя без изменения метаданных — использование объекта НастройкиИнтерфейсаКлиентскогоПриложения.
Посмотрим на пример кода, который позволяет программно сформировать структуру панелей и разделов интерфейса для конкретного пользователя и сохранить ее непосредственно в системное хранилище:
Процедура НастроитьИнтерфейсПользователя(ИмяПользователя) Экспорт
Настройки = Новый НастройкиИнтерфейсаКлиентскогоПриложения;
// Здесь мы можем программно определить состав видимых разделов,
// отключить отображение ненужных стандартных панелей
// и оставить для пользователя только раздел "Главное".
// Сохраняем настройки в системное хранилище для конкретного пользователя
ХранилищеСистемныхНастроек.Сохранить(
"Общее/НастройкиИнтерфейсаКлиентскогоПриложения",
"",
Настройки,
,
ИмяПользователя
);
КонецПроцедуры
Этот код можно запускать один раз администратором при создании нового пользователя или назначении ему прав. Метод хорош тем, что он вообще не требует изменения объектов конфигурации и работает исключительно на уровне платформенных механизмов управления настройками пользователей.
Мы подробно разобрали пять различных подходов к решению проблемы кастомизации меню «Главное». Какой из них выбрать?