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

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия
← К списку

При работе с типовыми конфигурациями 1С, такими как "Бухгалтерия предприятия 3.0", часто возникает необходимость тонкой настройки интерфейса и доступности отчетов. Стандартные механизмы позволяют размещать отчеты в различных разделах, но иногда требуется программно управлять их расположением, например, добавлять варианты отчетов в новые или нестандартные подсистемы. Давайте вместе разберем, как это сделать, используя возможности платформы 1С:Предприятие 8.3 и Библиотеки стандартных подсистем (БСП).

Понимание механизма размещения вариантов отчетов

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

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

Рассмотрим подробнее параметры процедуры НастроитьВариантыОтчетов. Она принимает один параметр:

  1. Настройки – это коллекция, содержащая текущие настройки всех отчетов и вариантов отчетов конфигурации. Именно с этой коллекцией мы будем работать, чтобы изменить или добавить размещение.

Для работы с этой коллекцией БСП предоставляет ряд вспомогательных функций и процедур, расположенных в общем модуле ВариантыОтчетов. Наиболее важные для нашей задачи:

Пошаговое решение: Программное добавление варианта отчета в подсистему

Наша задача – взять существующий (или только что созданный) вариант УниверсальногоОтчета и программно разместить его в определенной подсистеме. Разберем этот процесс по шагам.

  1. Определяем целевой вариант отчета.

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

    • Настройки: Коллекция настроек, которую мы получаем в процедуре НастроитьВариантыОтчетов.
    • Отчет: Объект метаданных отчета, к которому относится вариант. В нашем случае это Метаданные.Отчеты.УниверсальныйОтчет.
    • ИмяВарианта: Строковое имя варианта отчета. Это то имя, которое вы задали при сохранении варианта (например, "Движение ЦБ без цены").

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

    
    НастройкиВарианта = ВариантыОтчетов.ОписаниеВарианта(Настройки, Метаданные.Отчеты.УниверсальныйОтчет, "Движение ЦБ без цены");
    

    Важный момент: если вариант с таким именем не найден, функция вернет Неопределено. Всегда проверяйте это перед дальнейшими действиями.

  2. Указываем подсистему для размещения.

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

    Для добавления используем метод Вставить() коллекции Размещение. В качестве параметра методу Вставить() мы передаем объект метаданных нужной подсистемы. Путь к подсистеме формируется через Метаданные.Подсистемы, указывая иерархию, если подсистема вложена.

    Например, если у нас есть подсистема "МоиОтчеты", вложенная в раздел "Администрирование", путь будет выглядеть так: Метаданные.Подсистемы.Администрирование.Подсистемы.МоиОтчеты.

    
    Если НастройкиВарианта <> Неопределено Тогда
        НастройкиВарианта.Размещение.Вставить(Метаданные.Подсистемы.ИмяРаздела.Подсистемы.ИмяПодсистемы); // Замените на вашу конкретную подсистему
    КонецЕсли;
    
  3. Важность и режим вывода (дополнительно).

    После добавления элемента в коллекцию Размещение, вы также можете настроить его свойства, такие как Важный или СмТакже. Эти свойства влияют на то, как отчет будет отображаться в панели отчетов (например, в группе "Важные отчеты" или "См. также").

    
    Если НастройкиВарианта <> Неопределено Тогда
        // Предполагаем, что мы только что добавили элемент, и он последний в коллекции
        НовыйЭлементРазмещения = НастройкиВарианта.Размещение[НастройкиВарианта.Размещение.Количество() - 1];
        НовыйЭлементРазмещения.Важный = Истина; // Сделать вариант "Важным"
        НовыйЭлементРазмещения.СмТакже = Ложь; // Не помещать в "См. также"
    КонецЕсли;
    

Пример кода для Универсального отчета

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


Процедура НастроитьВариантыОтчетов(Настройки) Экспорт
    // Здесь могут быть другие стандартные или пользовательские настройки отчетов

    // 1. Определяем целевой вариант Универсального отчета по его имени
    // Предположим, что у нас есть сохраненный вариант с именем "Движение ЦБ без цены"
    НастройкиВарианта = ВариантыОтчетов.ОписаниеВарианта(Настройки, Метаданные.Отчеты.УниверсальныйОтчет, "Движение ЦБ без цены");

    // 2. Проверяем, что вариант найден, прежде чем его настраивать
    Если НастройкиВарианта <> Неопределено Тогда
        // 3. Добавляем вариант в нужную подсистему.
        // Замените "МояНоваяПодсистема" и "МояВложеннаяПодсистема" на реальные имена ваших подсистем.
        // Если подсистема находится на верхнем уровне, используйте только Метаданные.Подсистемы.ИмяПодсистемы.
        НастройкиВарианта.Размещение.Вставить(Метаданные.Подсистемы.МояНоваяПодсистема.Подсистемы.МояВложеннаяПодсистема); 

        // Опционально: можно сделать этот вариант "Важным" в новой подсистеме
        // Если вы добавили только один элемент размещения, он будет последним.
        // Мы можем получить его по индексу или перебрать коллекцию, если добавляем несколько.
        // НовыйЭлементРазмещения = НастройкиВарианта.Размещение[НастройкиВарианта.Размещение.Количество() - 1];
        // НовыйЭлементРазмещения.Важный = Истина;
        // НовыйЭлементРазмещения.СмТакже = Ложь;

        // Если вы хотите отключить вариант отчета из других подсистем, 
        // или совсем его отключить, можно сделать так:
        // НастройкиВарианта.Включен = Ложь; // Отключит вариант полностью
    Иначе
        ЗаписьЖурналаРегистрации(
            НСтр("ru = 'Не найден вариант Универсального отчета ""Движение ЦБ без цены"" для программной настройки размещения.'"),
            УровеньЖурналаРегистрации.Ошибка
        );
    КонецЕсли;

    // Здесь могут быть другие настройки
КонецПроцедуры

Где разместить этот код?

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

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

Общие рекомендации и возможные проблемы

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

  1. Создание подсистемы: Если вы хотите разместить отчет в новой подсистеме, которой еще нет в конфигурации, вам сначала нужно создать ее в дереве метаданных конфигурации (раздел "Общие" -> "Подсистемы"). Только после этого вы сможете обращаться к ней через Метаданные.Подсистемы.ИмяВашейПодсистемы.

  2. Точность имен: Убедитесь, что строковое имя варианта отчета (например, "Движение ЦБ без цены") точно совпадает с тем, что вы указали при его сохранении. Любое несовпадение приведет к тому, что функция ВариантыОтчетов.ОписаниеВарианта вернет Неопределено.

  3. Расширения конфигурации: Для более гибкой и безопасной разработки, особенно если вы не хотите снимать конфигурацию с поддержки, рассмотрите возможность использования расширений. Вы можете добавить свой общий модуль в расширение и вызывать его из переопределяемой процедуры в основной конфигурации, либо использовать механизмы расширения для самой процедуры НастроитьВариантыОтчетов.

  4. Отладка: Если после добавления кода отчет не появляется в нужной подсистеме, воспользуйтесь отладчиком. Установите точку останова в процедуре НастроитьВариантыОтчетов и посмотрите содержимое коллекции Настройки, а также значение переменной НастройкиВарианта после вызова ОписаниеВарианта.

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

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

← К списку