Можно ли программно добавить документ или справочник в подсистему 1С?

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

В процессе разработки и сопровождения конфигураций на платформе 1С:Предприятие 8.3 часто возникает желание максимально автоматизировать рутинные операции. Одной из таких задач является динамическое управление интерфейсом, а именно — включение новых объектов (документов, справочников, отчетов) в существующие или новые подсистемы без ручного вмешательства в конфигуратор. Разберем подробно, насколько это осуществимо и какие инструменты предлагает платформа для решения подобных задач.

Ограничения платформы: почему нельзя просто «прописать» объект в подсистему

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

Если мы обратимся к синтакс-помощнику и исследуем объект ОбъектМетаданныхКонфигурация, а именно его свойство Подсистемы, мы увидим следующее:


// Пример обращения к коллекции подсистем
ВсеПодсистемы = Метаданные.Подсистемы;
Для Каждого Подсистема Из ВсеПодсистемы Цикл
    Сообщить(Подсистема.Имя);
КонецЦикла;

Важный нюанс заключается в том, что свойство Подсистемы имеет тип КоллекцияОбъектовМетаданных и доступно только для чтения. Это означает, что в режиме «1С:Предприятие» (в рантайме) мы можем прочитать состав подсистемы, узнать, какие документы в нее входят, но не можем вызвать метод типа Добавить() или изменить свойство Состав.

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

Способ 1. Использование расширений конфигурации

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

Разберем, как это работает шаг за шагом:

  1. Создаем новое расширение в базе данных.
  2. Заимствуем нужную нам подсистему из основной конфигурации в расширение.
  3. Создаем новый документ непосредственно внутри расширения.
  4. В свойствах подсистемы (внутри расширения) устанавливаем галочку напротив нашего нового документа.

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

Способ 2. Функциональные опции: программное управление видимостью

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

Рассмотрим алгоритм реализации:

  1. В конфигураторе включаем документ во все необходимые подсистемы.
  2. Создаем новую Константу (например, ИспользоватьМойНовыйДокумент) с типом Булево.
  3. Создаем объект Функциональная опция, привязываем её к этой константе.
  4. В составе функциональной опции указываем наш документ.

Теперь мы можем программно управлять видимостью документа во всех подсистемах с помощью простого кода:


// Включение отображения документа в интерфейсе
Константы.ИспользоватьМойНовыйДокумент.Установить(Истина);

// Отключение отображения (документ исчезнет из всех меню)
Константы.ИспользоватьМойНовыйДокумент.Установить(Ложь);

Этот метод позволяет добиться эффекта «динамического интерфейса», не нарушая структуру метаданных.

Способ 3. Управление командным интерфейсом формы

Иногда требуется добавить команду перехода к списку документов не в общую панель разделов, а в конкретную форму (например, в «Рабочее место менеджера»). В этом случае мы можем полностью отказаться от использования стандартного механизма подсистем для этого объекта и воспользоваться программным формированием команд.

Проанализируем пример добавления кнопки в форму программно:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Создаем новую команду формы
    МояКоманда = Команды.Добавить("ОткрытьСписокДокументов");
    МояКоманда.Действие = "Подключаемый_ОткрытьСписок";
    МояКоманда.Заголовок = "Мои новые документы";
    
    // Создаем кнопку и привязываем её к команде
    НоваяКнопка = Элементы.Добавить("КнопкаОткрытьСписок", Тип("КнопкаФормы"), Элементы.ГруппаКоманднаяПанель);
    НоваяКнопка.ИмяКоманды = "ОткрытьСписокДокументов";
    
КонецПроцедуры

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

Способ 4. Работа с конфигурацией через XML (DevOps-метод)

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

Выясним, как это можно реализовать вне режима пользователя:

  1. Выгружаем конфигурацию в файлы с помощью параметров командной строки: /DumpConfigToFiles.
  2. Находим XML-файл описания нужной подсистемы.
  3. Программно (используя ЧтениеXML и ЗаписьXML в 1С или любой другой инструмент) добавляем в узел <Content> ссылку на ваш документ.
  4. Загружаем измененные файлы обратно: /LoadConfigFromFiles.
  5. Обновляем конфигурацию базы данных.

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

Резюме

Подведем итоги нашего анализа. Напрямую добавить документ в подсистему кодом в режиме предприятия невозможно из-за ограничений архитектуры 1С (свойство Метаданные.Подсистемы доступно только для чтения).

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

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

← На главную