Как программно скрыть подсистему или обработку в 1С:Предприятие 8.3?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Рассмотрим, почему не удается управлять видимостью подсистем "в лоб" через код формы, и разберем проверенные практические способы решения этой задачи.

Ограничения платформы при работе с командным интерфейсом

Попытки обратиться к элементам панели разделов через коллекцию ЭтаФорма.Элементы или командную панель формы не приносят результата. Проанализируем ключевые особенности платформы 1С:

  1. Неизменяемость метаданных: Дерево метаданных (включая объекты типа Подсистема) в режиме исполняемого сеанса доступно только для чтения. Попытка изменить свойства видимости метаданных вызовет ошибку.
  2. Отсутствие прямого API: Панель разделов не является обычным элементом управления конкретной управляемой формы. Объект НастройкиКомандногоИнтерфейса используется платформой для сохранения пользовательских настроек, но не предоставляет программисту прямого API для динамеческой модификации состава подсистем из кода.
  3. Задержка применения прав: Программное назначение ролей пользователю во время активного сеанса не приводит к мгновенной перестройке командного интерфейса — для вступления изменений в силу требуется перезапуск клиентского приложения.

Способ 1. Управление видимостью с помощью функциональных опций

Наиболее правильный и технологичный способ управления составом командного интерфейса в 1С — применение Функциональных опций (ФО).

Разберем по шагам алгоритм с использованием константы:

  1. В конфигураторе создаем новую константу, например, ЭтоРабочаяБаза (тип Булево).
  2. Создаем объект метаданных ФункциональнаяОпция (например, ПоказыватьСервиснуюПодсистему).
  3. В свойстве Хранение функциональной опции указываем созданную константу ЭтоРабочаяБаза.
  4. На вкладке Состав функциональной опции отмечаем галочкой ту подсистему (или конкретные обработки/документы), visibility которых требуется управлять.
  5. В рабочей базе устанавливаем значение константы в значение Истина (или Ложь в зависимости от логики показа).

Если же "рабочесть" базы определяется динамически (например, путем к каталогу информационной базы или именем сервера) и записывать значение в базу данных нежелательно, вместо константы следует использовать Параметр сеанса.

Рассмотрим пример настройки динамического управления через параметр сеанса:

  1. Создаем параметр сеанса РаботаВРабочейБазе с типом Булево.
  2. Привязываем функциональную опцию к данному параметру сеанса.
  3. В модуле сеанса или в обработчике ПриНачалеРаботыСистемы модуля управляемого приложения инициализируем параметр и обновляем интерфейс:

// Пример проверки пути к базе в модуле управляемого приложения
ПутьКБазе = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СтрокаСоединенияИнформационнойБазы(), ";");
// Выполняем проверку условий (например, анализ пути к каталогу ИБ)
ПараметрыСеанса.РаботаВРабочейБазе = ЭтоПродуктивнаяБаза(СтрокаСоединенияИнформационнойБазы());

// Для мгновенного применения изменений интерфейса на клиенте вызовем метод платформы:
ОбновитьИнтерфейс();

Способ 2. Использование штатных механизмов БСП

Если ваша конфигурация разработана на основе Библиотеки Стандартных Подсистем (БСП), в ней уже присутствует встроенный механизм защиты от выполнения критичных операций в копиях баз.

В БСП предусмотрена константа РаботаСВнешнимиРесурсамиЗаблокирована и подсистема "Защита подключения к внешним ресурсам". При смене пути к базе данных или имени сервера БСП при старте автоматически определяет, что запущена копия, и запрашивает подтверждение пользователя ("Информационная база перемещена или восстановлена из резервной копии"). К этой константе или параметрам функциональных опций БСП можно привязать видимость пользовательских подсистем разработки.

Альтернативные варианты индикации тестовой базы

Если единственная цель создания отдельной подсистемы — информирование разработчиков и пользователей о том, что они работают в копии, можно использовать более простые и наглядные решения:

  1. Динамический заголовок системы: Вызовем процедуру УстановитьЗаголовокСистемы() при старте приложения:
    
    Процедура ПриНачалеРаботыСистемы()
        Если ЭтоТестоваяБаза() Тогда
            УстановитьЗаголовокСистемы("[ТЕСТОВАЯ КОПИЯ] " + КраткаяИнформацияСистемы());
        КонецЕсли;
    КонецПроцедуры
    
  2. Информационный баннер на начальной странице: Добавим на рабочий стол элемент формы типа ДекорацияНадпись с ярким фоном и предупреждающим текстом. В событии формы ПриСозданииНаСервере будем управлять свойством Видимость данного элемента в зависимости от режима базы.
← На главную