В процессе разработки и сопровождения конфигураций на платформе 1С:Предприятие 8.3 часто возникает желание максимально автоматизировать рутинные операции. Одной из таких задач является динамическое управление интерфейсом, а именно — включение новых объектов (документов, справочников, отчетов) в существующие или новые подсистемы без ручного вмешательства в конфигуратор. Разберем подробно, насколько это осуществимо и какие инструменты предлагает платформа для решения подобных задач.
Для начала проанализируем архитектуру метаданных 1С. Платформа жестко разделяет процессы проектирования системы и её эксплуатации. Все, что касается структуры метаданных, определяется в конфигураторе и фиксируется в момент обновления конфигурации базы данных. К этой структуре относятся и подсистемы.
Если мы обратимся к синтакс-помощнику и исследуем объект ОбъектМетаданныхКонфигурация, а именно его свойство Подсистемы, мы увидим следующее:
// Пример обращения к коллекции подсистем
ВсеПодсистемы = Метаданные.Подсистемы;
Для Каждого Подсистема Из ВсеПодсистемы Цикл
Сообщить(Подсистема.Имя);
КонецЦикла;
Важный нюанс заключается в том, что свойство Подсистемы имеет тип КоллекцияОбъектовМетаданных и доступно только для чтения. Это означает, что в режиме «1С:Предприятие» (в рантайме) мы можем прочитать состав подсистемы, узнать, какие документы в нее входят, но не можем вызвать метод типа Добавить() или изменить свойство Состав.
Платформа гарантирует целостность базы данных: состав подсистем влияет на права доступа, командный интерфейс и структуру навигации, которые компилируются при запуске сеанса пользователя. Динамическое изменение этих структур «на лету» противоречило бы принципам работы платформы.
Рассмотрим ситуацию, описанную автором вопроса: «упростить себе жизнь при обновлении». Если ваша цель — добавить документ в типовую конфигурацию так, чтобы при обновлении основной конфигурации не приходилось заново настраивать его принадлежность к подсистемам, то расширения конфигурации — это идеальный инструмент.
Разберем, как это работает шаг за шагом:
В результате при обновлении основной конфигурации (поставщика) расширение останется неизменным. Платформа автоматически «склеивает» состав подсистемы из основной конфигурации и расширения, и ваш документ будет отображаться в интерфейсе. Это современный и безопасный метод кастомизации типовых решений.
Если задача стоит в том, чтобы документ появлялся или исчезал в подсистеме в зависимости от каких-либо условий (например, настроек программы), мы можем использовать механизм Функциональных опций. Хотя это не добавляет объект в состав подсистемы программно, это позволяет программно управлять его присутствием в интерфейсе.
Рассмотрим алгоритм реализации:
Константу (например, ИспользоватьМойНовыйДокумент) с типом Булево.Функциональная опция, привязываем её к этой константе.Теперь мы можем программно управлять видимостью документа во всех подсистемах с помощью простого кода:
// Включение отображения документа в интерфейсе
Константы.ИспользоватьМойНовыйДокумент.Установить(Истина);
// Отключение отображения (документ исчезнет из всех меню)
Константы.ИспользоватьМойНовыйДокумент.Установить(Ложь);
Этот метод позволяет добиться эффекта «динамического интерфейса», не нарушая структуру метаданных.
Иногда требуется добавить команду перехода к списку документов не в общую панель разделов, а в конкретную форму (например, в «Рабочее место менеджера»). В этом случае мы можем полностью отказаться от использования стандартного механизма подсистем для этого объекта и воспользоваться программным формированием команд.
Проанализируем пример добавления кнопки в форму программно:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Создаем новую команду формы
МояКоманда = Команды.Добавить("ОткрытьСписокДокументов");
МояКоманда.Действие = "Подключаемый_ОткрытьСписок";
МояКоманда.Заголовок = "Мои новые документы";
// Создаем кнопку и привязываем её к команде
НоваяКнопка = Элементы.Добавить("КнопкаОткрытьСписок", Тип("КнопкаФормы"), Элементы.ГруппаКоманднаяПанель);
НоваяКнопка.ИмяКоманды = "ОткрытьСписокДокументов";
КонецПроцедуры
Такой подход позволяет выстроить сколь угодно сложную логику навигации, которая вообще не будет зависеть от того, в какую подсистему включен объект в конфигураторе.
Если же ваша задача — автоматизировать добавление сотен объектов в подсистемы в процессе разработки (например, при сборке собственного продукта), стоит обратить внимание на механизмы выгрузки конфигурации в файлы XML.
Выясним, как это можно реализовать вне режима пользователя:
/DumpConfigToFiles.ЧтениеXML и ЗаписьXML в 1С или любой другой инструмент) добавляем в узел <Content> ссылку на ваш документ./LoadConfigFromFiles.Это единственный способ действительно «программно» изменить состав метаданных, но он выполняется на этапе подготовки системы, а не в процессе работы пользователей.
Подведем итоги нашего анализа. Напрямую добавить документ в подсистему кодом в режиме предприятия невозможно из-за ограничений архитектуры 1С (свойство Метаданные.Подсистемы доступно только для чтения).
Однако, в зависимости от конечной цели, мы можем использовать следующие эффективные альтернативы:
Каждый из этих методов является легитимным и позволяет решать задачу кастомизации интерфейса, сохраняя при этом систему стабильной и пригодной для дальнейшей поддержки.