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

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

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

Почему стандартный метод ОткрытьФорму не решает задачу напрямую

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

Если мы передадим в структуру параметров произвольное свойство, например, ИмяСтраницы, платформа просто передаст его в форму-приёмник. Чтобы это свойство «сработало», в модуле формы-приёмника в процедуре ПриСозданииНаСервере должен быть написан код, который считывает этот параметр и программно активизирует нужный элемент. Если же мы не хотим или не можем менять код приёмника, метод ОткрытьФорму сам по себе не сможет переключить закладку, так как он не «знает» внутреннего устройства элементов формы.

Способ 1: Использование связки ПолучитьФорму и Открыть

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

Посмотрим на пример реализации данного метода:


// Определяем ссылку на объект, который хотим открыть
СсылкаНаЭлемент = Справочники.Номенклатура.НайтиПоКоду("00001");

// Параметры для получения формы (указываем ключ объекта)
ПараметрыФормы = Новый Структура("Ключ", СсылкаНаЭлемент);

// Получаем объект формы, но не открываем её сразу
МояФорма = ПолучитьФорму("Справочник.Номенклатура.ФормаОбъекта", ПараметрыФормы);

// Программная активация нужной страницы
// Предположим, что группа страниц называется "ГруппаСтраницы", 
// а нужная нам закладка — "СтраницаДополнительно"
МояФорма.Элементы.ГруппаСтраницы.ТекущаяСтраница = МояФорма.Элементы.СтраницаДополнительно;

// Теперь открываем уже подготовленную форму
МояФорма.Открыть();

Важные нюансы:

  1. Инкапсуляция: Используя этот метод, вызывающий код должен знать внутреннее имя элементов формы (имя группы страниц и имя конкретной страницы). Если разработчик типового решения изменит имя элемента в будущем, код перестанет работать.
  2. Рекомендации ИТС: Фирма «1С» рекомендует использовать ОткрытьФорму для оптимизации клиент-серверного взаимодействия. Однако использование ПолучитьФорму допустимо в случаях, когда требуется сложная настройка формы перед открытием, которую невозможно передать через стандартные параметры.
  3. Контекст: Данный код должен исполняться на клиенте.

Способ 2: Использование расширений конфигурации (Best Practice)

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

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

  1. Создаем новое расширение или используем существующее.
  2. Добавляем в расширение форму нужного справочника.
  3. В модуле формы расширения создаем процедуру-обертку для серверного события.

Пример кода в модуле формы расширения:


&После("ПриСозданииНаСервере")
Процедура Расш_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Проверяем, передан ли наш специальный параметр
    ИмяНужнойСтраницы = "";
    Если Параметры.Свойство("ИмяАктивнойСтраницы", ИмяНужнойСтраницы) Тогда
        // Пытаемся найти элемент и установить его как текущую страницу
        ЭлементСтраница = Элементы.Найти(ИмяНужнойСтраницы);
        Если ЭлементСтраница <> Неопределено Тогда
            // Обычно страницы вложены в родительскую группу страниц
            ЭлементСтраница.Родитель.ТекущаяСтраница = ЭлементСтраница;
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

Теперь из любого места программы вы можете использовать стандартный и рекомендуемый метод ОткрытьФорму, просто передавая имя страницы в параметрах:


ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("Ключ", СсылкаНаОбъект);
ПараметрыОткрытия.Вставить("ИмяАктивнойСтраницы", "ГруппаДополнительныеСведения");

ОткрытьФорму("Справочник.Контрагенты.ФормаОбъекта", ПараметрыОткрытия);

Сравнение подходов

Проанализируем ситуацию: какой метод выбрать? Если вам нужно разовое решение «здесь и сейчас» и вы пишете внешнюю обработку, то ПолучитьФорму() будет быстрее в реализации. Однако если вы разрабатываете функционал внутри информационной базы, который должен работать надежно, расширение — гораздо более стабильный вариант.

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

Резюме

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

← На главную