Как открывать разные формы документа в зависимости от даты в 1С?

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

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

Понимание механизма ОбработкаПолученияФормы

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

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

Пошаговая реализация логики подмены формы

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

  1. Проверяем, что открывается именно форма объекта.
  2. Проверяем наличие ключа (ссылки) в параметрах.
  3. Анализируем дату объекта и присваиваем нужную форму в параметр ВыбраннаяФорма.
  4. Устанавливаем СтандартнаяОбработка = Ложь, чтобы отменить открытие формы по умолчанию.

Пример правильного кода для модуля менеджера

Рассмотрим конкретный пример. Допустим, нам нужно, чтобы для документов, созданных после 10 октября 2021 года, открывалась специальная форма ФормаДокумента1, а для всех остальных — стандартная.


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

КонецПроцедуры

Почему возникают ошибки «Поле Ключ не найдено»?

Разберем, почему возникает описанная пользователем ошибка при нажатии кнопки «Показать все». Когда пользователь нажимает кнопку выбора, система вызывает ОбработкаПолученияФормы для ВидФормы.ФормаВыбора. В этот момент в параметрах открытия ключ может отсутствовать вовсе, либо содержать пустую ссылку.

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

Рекомендации по оптимизации

При работе с ОбработкаПолученияФормы учитывайте следующие моменты:

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

← На главную