К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как проверить, что форма управляемая в 1С

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

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

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

Материал ориентирован на разработчиков и администраторов, которые работают с конфигуратором 1С:Предприятие 8.3 и сталкиваются с необходимостью быстро понять, с каким типом формы они имеют дело.

Чем управляемая форма отличается от обычной

Обычные формы появились в платформе 8.0–8.1 и строятся по принципу «разработчик рисует интерфейс целиком»: расположение элементов задаётся координатами, вся логика исполняется на клиенте, разделения контекста на клиент и сервер нет. Управляемые формы появились в платформе 8.2 и работают иначе: разработчик описывает состав формы декларативно, а платформа сама строит интерфейс под конкретный клиент — тонкий, толстый или веб-клиент.

Ключевое техническое отличие — разделение контекста исполнения. В модуле управляемой формы процедуры и функции помечаются директивами &НаКлиенте, &НаСервере, &НаСервереБезКонтекста, &НаКлиентеНаСервереБезКонтекста. В обычной форме таких директив нет и быть не может — весь код исполняется в одном контексте.

Ещё одно отличие — основной реквизит формы. У управляемой формы данные объекта представлены реквизитом типа «ДанныеФормыСтруктура» (и производными), а не самим объектом. Поэтому код вида ЭтотОбъект.Провести() в управляемой форме не сработает без преобразования данных формы в объект.

Как определить тип формы в конфигураторе визуально

Самый простой способ — открыть форму объекта в конфигураторе и посмотреть на редактор формы. У управляемой формы окно редактора разделено на области: дерево элементов формы, панель свойств, а внизу — закладки «Форма», «Модуль», «Командный интерфейс», «Реквизиты», «Параметры», «Команды». Наличие закладок «Реквизиты» и «Командный интерфейс» — однозначный признак управляемой формы.

У обычной формы редактор выглядит иначе: это визуальный конструктор с размещёнными на макете элементами — полями, кнопками, табличными полями, которые можно перетаскивать мышью и выравнивать по пикселям. Закладок «Реквизиты» и «Командный интерфейс» там нет.

Дополнительный признак — палитра элементов. В управляемой форме доступны элементы «Поле», «Группа», «Кнопка», «Таблица», «Декорация» с привязкой к реквизитам формы. В обычной — «ПолеВвода», «Надпись», «ТабличноеПоле», «Кнопка» и другие элементы с прямым позиционированием.

Закладки редактораРеквизиты, Параметры, Командный интерфейс

Есть — форма управляемая, нет — обычная

ЭлементыПоле, Группа, Таблица, Декорация

У обычной формы — ПолеВвода, ТабличноеПоле, Надпись

Дерево элементовИерархия без координат

Управляемая форма не задаёт положение в пикселях

Как проверить тип формы по модулю

Откройте модуль формы (закладка «Модуль» в редакторе формы). Если в коде встречаются директивы компиляции &НаКлиенте и &НаСервере — это управляемая форма. Эти директивы существуют только в управляемых формах, и их наличие — стопроцентный признак.

Обратите внимание на стандартные обработчики событий. У управляемой формы характерные события: ПриСозданииНаСервере, ПриОткрытии, ПередЗаписьюНаСервере, ПослеЗаписиНаСервере, ПриЧтенииНаСервере. У обычной формы свои события: ПриОткрытии, ПередЗаписью, ПриЗаписи, ПриЗакрытии — без указания контекста сервера.

Если форма открыта только в модуле без редактора, поищите обращения к свойству ЭтаФорма с реквизитами формы или вызовы РеквизитФормыВЗначение() — эти конструкции встречаются только в управляемых формах.

bsl
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Наличие этого обработчика = форма управляемая
КонецПроцедуры

Как проверить тип формы программно

Иногда тип формы нужно определить в коде — например, в общем модуле, который обрабатывает переданную форму. Для этого используется проверка типа через функцию ТипЗнч() и сравнение с Тип("УправляемаяФорма") (или Тип("ФормаКлиентскогоПриложения") в новых версиях платформы, где тип переименован).

Пример проверки: Если ТипЗнч(Форма) = Тип("УправляемаяФорма") Тогда ... КонецЕсли;. Для обычной формы тип будет Форма. Учтите, что в свежих версиях платформы тип «УправляемаяФорма» является синонимом «ФормаКлиентскогоПриложения», поэтому надёжнее проверять оба варианта или использовать актуальное имя типа.

Косвенный программный признак — наличие у формы свойства УникальныйИдентификатор и коллекции Параметры с характерным составом, но такая проверка менее надёжна, чем сравнение типов, и применять её стоит только когда сравнение типов недоступно.

bsl
Если ТипЗнч(Форма) = Тип("УправляемаяФорма") Тогда
    // Работаем с управляемой формой
ИначеЕсли ТипЗнч(Форма) = Тип("Форма") Тогда
    // Обычная форма
КонецЕсли;

Как проверить тип формы по свойствам объекта конфигурации

На уровне конфигурации в целом тип форм определяется свойством корневого узла конфигурации — «Основной режим запуска». Если установлен «Управляемое приложение» или «Управляемое приложение и обычное», то по умолчанию создаются управляемые формы. Если «Обычное приложение» — обычные.

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

Чтобы понять, какие формы есть у объекта, раскройте в дереве конфигурации ветку «Формы» нужного объекта. Тип каждой формы определяется при её создании: в мастере новой формы есть переключатель «Тип формы» — «Обычная» или «Управляемая» (в зависимости от режима запуска он может быть недоступен). Открыв форму, вы увидите её тип по признакам редактора.

Типичные ошибки при определении типа формы

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

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

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

Типичные ошибки
01
Определять тип по внешнему виду формы в режиме предприятия — интерфейс может обмануть, смотрите модуль
02
Судить по событию ПриОткрытии — оно есть у обоих типов форм
03
Считать режим запуска конфигурации доказательством типа конкретной формы
04
Использовать обработчики обычной формы в управляемой — код просто не вызовется

Как проверить результат и что делать дальше

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

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

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

Контрольные точки

Как проверить результат

Директивы &НаСервере / &НаКлиенте в модуле
Норма

Присутствуют — управляемая форма

Тревожный признак

Отсутствуют, но редактор управляемый — сверьтесь с видом редактора

Закладки редактора формы
Норма

Есть «Реквизиты» и «Командный интерфейс» — управляемая

Тревожный признак

Визуальный конструктор с координатами — обычная

Тип объекта в коде
Норма

ТипЗнч возвращает УправляемаяФорма

Тревожный признак

Тип Форма — это обычная форма

Итог

Что важно запомнить

Управляемую форму надёжно определяют директивы контекста в модуле и закладки «Реквизиты»/«Командный интерфейс» в редакторе. Программно тип проверяется через ТипЗнч. Режим запуска конфигурации — только подсказка, а не доказательство.

Частые вопросы

Может ли обычная форма работать в тонком клиенте?

Нет. Обычные формы открываются только в толстом клиенте, запущенном в режиме обычного приложения. В тонком и веб-клиенте доступны только управляемые формы.

Как понять, какая форма назначена основной у объекта?

Откройте свойства объекта конфигурации (документа, справочника) и посмотрите поля «Основная форма объекта», «Основная форма списка» и т.п. Там указано имя формы — откройте её и определите тип по признакам из статьи.

Почему в модуле управляемой формы нет директив &НаСервере?

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

Можно ли преобразовать обычную форму в управляемую?

Автоматического конвертера в платформе нет. Форму создают заново как управляемую и переносят логику с учётом разделения контекста и работы через реквизиты формы вместо прямого доступа к элементам.

Чем отличаются типы УправляемаяФорма и ФормаКлиентскогоПриложения?

В новых версиях платформы тип переименован в «ФормаКлиентскогоПриложения», а «УправляемаяФорма» сохранён как синоним для совместимости. Для прикладного кода это один и тот же тип.