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

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

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

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

Способ 1. Использование модуля менеджера (Управляемое приложение)

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

Рассмотрим, как реализовать этот метод. Мы проанализируем параметры, передаваемые в процедуру, и укажем системе, какую именно форму нужно вернуть.


Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)
    
    // Проверяем, что запрашивается именно форма объекта (форма документа)
    Если ВидФормы = "ФормаОбъекта" Тогда
        
        // Если это существующий документ, анализируем его реквизиты через ссылку
        Если Параметры.Свойство("Ключ") Тогда
            ТипДокумента = Параметры.Ключ.ТипДокумента;
            
            Если ТипДокумента = Перечисления.ВидыДокументов.РКО Тогда
                ВыбраннаяФорма = "Документ.Накладная.Форма.ФормаРКО";
                СтандартнаяОбработка = Ложь;
            ИначеЕсли ТипДокумента = Перечисления.ВидыДокументов.ПКО Тогда
                ВыбраннаяФорма = "Документ.Накладная.Форма.ФормаПКО";
                СтандартнаяОбработка = Ложь;
            КонецЕсли;
        КонецЕсли;
        
    КонецЕсли;
    
КонецПроцедуры

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

Способ 2. Перехват события выбора в списке (Обычные и управляемые формы)

Если по каким-то причинам вы не можете использовать модуль менеджера или работаете в старом интерфейсе, можно программно обработать действие пользователя в форме списка или журнала. Главная ошибка здесь — забыть отключить стандартную обработку, из-за чего система сначала откроет вашу форму, а затем — основную форму, назначенную в конфигураторе.

Разберем алгоритм действий в форме списка:

  1. Создадим обработчик события Выбор для табличного поля списка.
  2. Установим параметр СтандартнаяОбработка в значение Ложь.
  3. Определим тип документа и откроем нужную форму программно.

Посмотрим на пример кода:


Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    
    // Останавливаем стандартный механизм открытия
    СтандартнаяОбработка = Ложь;
    
    // Получаем данные текущей строки
    ТекДанные = Элемент.ТекущиеДанные;
    Если ТекДанные = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    // Формируем структуру параметров (для управляемых форм)
    ПараметрыФормы = Новый Структура("Ключ", ТекДанные.Ссылка);
    
    // Выбираем имя формы в зависимости от реквизита
    Если ТекДанные.ТипДокумента = Перечисления.ВидыДокументов.РКО Тогда
        ИмяФормы = "Документ.Накладная.Форма.ФормаРКО";
    Иначе
        ИмяФормы = "Документ.Накладная.Форма.ФормаПКО";
    КонецЕсли;
    
    // Открываем форму
    ОткрытьФорму(ИмяФормы, ПараметрыФормы);
    
КонецПроцедуры

Способ 3. Предотвращение двойного открытия через «Отказ»

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

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

Способ 4. Ключ назначения формы (Assignment Key)

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

Проанализируем пример вызова с использованием ключа назначения:


ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Ключ", СсылкаНаДокумент);

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

Это особенно полезно, когда форма технически одна, но её визуальное представление должно существенно меняться программно при открытии. Указывая уникальный КлючНазначения, вы гарантируете, что настройки пользователя для «РКО» не «переползут» на форму «ПКО».

Резюме и рекомендации

Подведем итог нашему анализу:

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

← На главную