Как в обработчике ОбработкаПолученияФормы проверить, что создается новый документ

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

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

Суть проблемы и анализ ошибки

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

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

Правильный метод проверки через Свойство()

Чтобы избежать аварийного завершения кода, мы должны использовать метод Свойство(), который предназначен для безопасной проверки наличия ключа в структуре. Рассмотрим правильный шаблон кода, который следует использовать в модуле менеджера или в подписке на событие:


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

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

Различие между новым документом и копированием

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

  1. Существующий объект: В структуре Параметры присутствует ключ Ключ, содержащий ссылку на документ.
  2. Новый объект (пустой): Ключ Ключ отсутствует.
  3. Копирование: Ключ Ключ отсутствует, но присутствует свойство ЗначениеКопирования, в котором передается ссылка на оригинал.
  4. Ввод на основании: Ключ Ключ отсутствует, но может присутствовать свойство ЗначенияЗаполнения или специфические параметры, переданные программно.

Таким образом, проверка Параметры.Свойство("Ключ") является универсальным способом отсечь все варианты создания новых объектов от открытия уже записанных в базу данных.

Почему нельзя использовать Объект.Ссылка?

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

Оптимальный алгоритм действий

Подведем итог и составим пошаговый алгоритм для реализации логики в подписке на событие ОбработкаПолученияФормы:

  1. Убеждаемся, что ВидФормы соответствует интересующему нас типу (например, "ФормаОбъекта").
  2. Используем метод Свойство("Ключ") для разделения логики «Открытие» и «Создание».
  3. Если нам нужно программно назначить форму, присваиваем ее имя строкой переменной ВыбраннаяФорма (например, "ФормаЭлементаСпециальная").
  4. Устанавливаем СтандартнаяОбработка = Ложь, чтобы платформа использовала наше значение из ВыбраннаяФорма.
  5. Если это новый документ и нам не нужно ничего менять, просто выходим из процедуры, оставляя СтандартнаяОбработка в значении Истина.

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

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

← На главную