Почему в 1С вместо новой формы из расширения открывается типовая форма документа?

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

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

Причина 1. Несоответствие режима совместимости расширения и основной конфигурации

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

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

  1. Откроем свойства корневого узла основной конфигурации и посмотрим значение свойства Режим совместимости (например, Версия 8.3.14 или Не использовать).
  2. Откроем свойства корневого узла нашего расширения в дереве метаданных.
  3. Установим в свойстве Режим совместимости расширения в точности такое же значение, какое задано в основной конфигурации.
  4. Обновим конфигурацию базы данных и перезапустим сеанс «1С:Предприятие».
  5. Проверим состояние подключения расширения через меню Функции для технического специалиста (или Все функции) — Управление расширениями конфигурации. Если расширение активно и подключено без предупреждений об ошибках совместимости, изменения вступят в силу.

Причина 2. Переопределение формы в обработчике ОбработкаПолученияФормы модуля менеджера

Рассмотрим более сложный случай, характерный для типовых решений («1С:Управление торговлей», «1С:ERP Управление предприятием», «1С:Комплексная автоматизация»). Даже если режим совместимости настроен верно, а в свойствах документа в расширении указана новая форма как основная, платформа все равно может открывать типовую форму. Причина кроется в программном переопределении.

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

Разберем, как перехватить выбор формы программно с помощью расширения:

  1. Заимствуем в расширение модуль менеджера документа ЗаказКлиента.
  2. В модуле менеджера расширения перехватываем обработчик события с помощью аннотации &Вместо:

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

Таким образом мы принудительно перенаправляем платформу на нашу собственную форму объекта, отключая стандартную логику подбора формы типовой конфигурации.

Причина 3. Жесткий вызов формы в командном интерфейсе

Проанализируем еще одну архитектурную особенность типовых решений. Во многих подсистемах команды создания документов открывают форму не стандартным обращением к типу объекта, а прямым вызовом конкретной формы по ее полному имени в метаданных.

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

ОткрытьФорму("Документ.ЗаказКлиента.Форма.ФормаДокумента", ПараметрыОткрытия);

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

Причина 4. Включение безопасного режима и кэширование

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

  1. В окне Управление расширениями конфигурации обратим внимание на флажки Безопасный режим и Защита от опасных действий. Если в коде новой формы используются вызовы внешних компонент или привилегированные операции, включенный безопасный режим может препятствовать нормальной инициализации формы. Снимем безопасный режим, если разработка является доверенной.
  2. Очистим локальный кэш пользователя. При интенсивной разработке и частой смене основных форм тонкий клиент может кэшировать структуру интерфейса. Запустим базу с параметром командной строки /ClearCache или вручную удалим каталоги временных файлов пользователя.

Рекомендуемый подход: модификация существующей формы вместо создания новой

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

Вместо полной замены формы рекомендуется:

  1. Заимствовать в расширение существующую типовую форму объекта (ФормаДокумента).
  2. Добавить необходимые реквизиты и элементы интерфейса непосредственно в редакторе формы расширения.
  3. Дописать необходимую бизнес-логику в модуле заимствованной формы, используя директивы &После или &Перед для стандартных событий (например, ПриСозданииНаСервере или ПослеЗаписиНаСервере).

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

← На главную