Как использовать форму внешней обработки в качестве начальной страницы

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

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

Программная настройка состава начальной страницы

Для начала рассмотрим стандартный механизм платформы 1С 8.3, который позволяет управлять рабочим столом пользователя через программный код. Это полезно, когда состав начальной страницы должен зависеть от роли пользователя или определенных настроек системы. Для этих целей используются объекты СоставФормНачальнойСтраницы и НастройкиНачальнойСтраницы.

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


СоставФорм = Новый СоставФормНачальнойСтраницы; 

// Добавляем форму общей формы из расширения
СоставФорм.ЛеваяКолонка.Добавить("ОбщаяФорма.Расш1_Форма"); 

// Добавляем форму обработки, которая находится в расширении
СоставФорм.ЛеваяКолонка.Добавить("Обработка.Расш1_Обработка1.Форма.Форма"); 

ВременныеНастройки = Новый НастройкиНачальнойСтраницы; 
ВременныеНастройки.УстановитьСоставФорм(СоставФорм); 

// Сохраняем настройки в системное хранилище
ХранилищеСистемныхНастроек.Сохранить("Общее/НастройкиНачальнойСтраницы", , ВременныеНастройки);

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

Почему нельзя напрямую указать внешнюю обработку

Многие разработчики пытаются использовать метод ПодключитьВнешнююОбработку из состава БСП (Библиотеки Стандартных Подсистем) и подставить полученное имя в настройки начальной страницы. Однако, проанализировав поведение платформы, мы увидим, что метод УстановитьСоставФорм() игнорирует любые строки, которые не соответствуют статическим именам метаданных.

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

Решение проблемы: Использование формы-контейнера (Прокси-формы)

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

Разберем реализацию этого метода по шагам:

  1. Создание формы в расширении: Создадим общую форму с именем Расш_НачальнаяСтраницаКонтейнер. Именно эту форму мы укажем в коде настройки начальной страницы, так как платформа ее "знает" и пропустит.
  2. Настройка автозапуска в контейнере: В коде этой формы нам нужно прописать логику получения внешней обработки из справочника.

Рассмотрим пример кода в модуле нашей формы-контейнера (в обработчике ПриСозданииНаСервере):


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // 1. Находим ссылку на нужную внешнюю обработку в справочнике БСП
    // Можно искать по ГУИДу или уникальному коду/имени
    СсылкаНаОбработку = Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию("МойРабочийСтол");
    
    Если СсылкаНаОбработку.Пустая() Тогда
        Возврат;
    КонецЕсли;

    // 2. Подключаем обработку через стандартный механизм БСП
    ИмяОбработки = ДополнительныеОтчетыИОбработки.ПодключитьВнешнююОбработку(СсылкаНаОбработку);
    
    // 3. Сохраняем путь к форме внешней обработки в реквизит формы для открытия на клиенте
    ПутьКФорме = "ВнешняяОбработка." + ИмяОбработки + ".Форма.Форма";
    
КонецПроцедуры

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


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    
    Если ЗначениеЗаполнено(ПутьКФорме) Тогда
        // Открываем форму внешней обработки
        ПараметрыФормы = Новый Структура;
        ОткрытьФорму(ПутьКФорме, ПараметрыФормы, ЭтаФорма);
        
        // Саму форму-контейнер можно закрыть или оставить прозрачной
        // В режиме "Такси" лучше оставить её как подложку
    КонецЕсли;
    
КонецПроцедуры

Преимущества данного подхода

Использование связки "Форма расширения -> Внешняя обработка" дает разработчику несколько ключевых преимуществ:

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

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

← На главную