Разработка и Конфигурация · 10 мин
Как проверить, что форма управляемая в 1С
Как определить, что форма в 1С управляемая: проверка через конфигуратор, свойства формы, код на встроенном языке. Признаки, отличия от обычной формы, типичные ошибки.
В технологических решениях на платформе 1С:Предприятие 8 существуют два принципиально разных типа форм — обычные и управляемые. От типа формы зависит, какой код в ней можно писать, какие события доступны и как дорабатывать интерфейс. Ошибка в определении типа формы приводит к неверным доработкам: разработчик пытается использовать обработчики, которых в данном типе формы просто нет.
Определить, что форма управляемая, можно несколькими способами: визуально по структуре модуля, через свойства объекта в конфигураторе, программно — через тип объекта формы. Ниже разобраны все рабочие методы с конкретными шагами и признаками результата.
Материал ориентирован на разработчиков и администраторов, которые работают с конфигуратором 1С:Предприятие 8.3 и сталкиваются с необходимостью быстро понять, с каким типом формы они имеют дело.
Чем управляемая форма отличается от обычной
Обычные формы появились в платформе 8.0–8.1 и строятся по принципу «разработчик рисует интерфейс целиком»: расположение элементов задаётся координатами, вся логика исполняется на клиенте, разделения контекста на клиент и сервер нет. Управляемые формы появились в платформе 8.2 и работают иначе: разработчик описывает состав формы декларативно, а платформа сама строит интерфейс под конкретный клиент — тонкий, толстый или веб-клиент.
Ключевое техническое отличие — разделение контекста исполнения. В модуле управляемой формы процедуры и функции помечаются директивами &НаКлиенте, &НаСервере, &НаСервереБезКонтекста, &НаКлиентеНаСервереБезКонтекста. В обычной форме таких директив нет и быть не может — весь код исполняется в одном контексте.
Ещё одно отличие — основной реквизит формы. У управляемой формы данные объекта представлены реквизитом типа «ДанныеФормыСтруктура» (и производными), а не самим объектом. Поэтому код вида ЭтотОбъект.Провести() в управляемой форме не сработает без преобразования данных формы в объект.
Как определить тип формы в конфигураторе визуально
Самый простой способ — открыть форму объекта в конфигураторе и посмотреть на редактор формы. У управляемой формы окно редактора разделено на области: дерево элементов формы, панель свойств, а внизу — закладки «Форма», «Модуль», «Командный интерфейс», «Реквизиты», «Параметры», «Команды». Наличие закладок «Реквизиты» и «Командный интерфейс» — однозначный признак управляемой формы.
У обычной формы редактор выглядит иначе: это визуальный конструктор с размещёнными на макете элементами — полями, кнопками, табличными полями, которые можно перетаскивать мышью и выравнивать по пикселям. Закладок «Реквизиты» и «Командный интерфейс» там нет.
Дополнительный признак — палитра элементов. В управляемой форме доступны элементы «Поле», «Группа», «Кнопка», «Таблица», «Декорация» с привязкой к реквизитам формы. В обычной — «ПолеВвода», «Надпись», «ТабличноеПоле», «Кнопка» и другие элементы с прямым позиционированием.
Есть — форма управляемая, нет — обычная
У обычной формы — ПолеВвода, ТабличноеПоле, Надпись
Управляемая форма не задаёт положение в пикселях
Как проверить тип формы по модулю
Откройте модуль формы (закладка «Модуль» в редакторе формы). Если в коде встречаются директивы компиляции &НаКлиенте и &НаСервере — это управляемая форма. Эти директивы существуют только в управляемых формах, и их наличие — стопроцентный признак.
Обратите внимание на стандартные обработчики событий. У управляемой формы характерные события: ПриСозданииНаСервере, ПриОткрытии, ПередЗаписьюНаСервере, ПослеЗаписиНаСервере, ПриЧтенииНаСервере. У обычной формы свои события: ПриОткрытии, ПередЗаписью, ПриЗаписи, ПриЗакрытии — без указания контекста сервера.
Если форма открыта только в модуле без редактора, поищите обращения к свойству ЭтаФорма с реквизитами формы или вызовы РеквизитФормыВЗначение() — эти конструкции встречаются только в управляемых формах.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Наличие этого обработчика = форма управляемая
КонецПроцедурыКак проверить тип формы программно
Иногда тип формы нужно определить в коде — например, в общем модуле, который обрабатывает переданную форму. Для этого используется проверка типа через функцию ТипЗнч() и сравнение с Тип("УправляемаяФорма") (или Тип("ФормаКлиентскогоПриложения") в новых версиях платформы, где тип переименован).
Пример проверки: Если ТипЗнч(Форма) = Тип("УправляемаяФорма") Тогда ... КонецЕсли;. Для обычной формы тип будет Форма. Учтите, что в свежих версиях платформы тип «УправляемаяФорма» является синонимом «ФормаКлиентскогоПриложения», поэтому надёжнее проверять оба варианта или использовать актуальное имя типа.
Косвенный программный признак — наличие у формы свойства УникальныйИдентификатор и коллекции Параметры с характерным составом, но такая проверка менее надёжна, чем сравнение типов, и применять её стоит только когда сравнение типов недоступно.
Если ТипЗнч(Форма) = Тип("УправляемаяФорма") Тогда
// Работаем с управляемой формой
ИначеЕсли ТипЗнч(Форма) = Тип("Форма") Тогда
// Обычная форма
КонецЕсли;Как проверить тип формы по свойствам объекта конфигурации
На уровне конфигурации в целом тип форм определяется свойством корневого узла конфигурации — «Основной режим запуска». Если установлен «Управляемое приложение» или «Управляемое приложение и обычное», то по умолчанию создаются управляемые формы. Если «Обычное приложение» — обычные.
Конкретная форма конкретного объекта может не совпадать с режимом запуска: в управляемом приложении у объекта может быть создана обычная форма вручную. Поэтому режим запуска — только подсказка, а не доказательство. Проверять нужно саму форму одним из способов выше.
Чтобы понять, какие формы есть у объекта, раскройте в дереве конфигурации ветку «Формы» нужного объекта. Тип каждой формы определяется при её создании: в мастере новой формы есть переключатель «Тип формы» — «Обычная» или «Управляемая» (в зависимости от режима запуска он может быть недоступен). Открыв форму, вы увидите её тип по признакам редактора.
Типичные ошибки при определении типа формы
Частая ошибка — судить о типе формы по внешнему виду в режиме предприятия. Управляемая и обычная формы могут выглядеть похоже, особенно если обычная форма аккуратно свёрстана. Надёжнее всего смотреть модуль и редактор, а не отрисованный интерфейс.
Вторая ошибка — путать управляемую форму объекта с формой, открытой через ПолучитьФорму(). Метод ПолучитьФорму() может вернуть как управляемую, так и обычную форму в зависимости от того, какая форма назначена объекту. Сам факт вызова метода ничего не говорит о типе результата.
Третья ошибка — считать, что наличие обработчика ПриОткрытии указывает на обычную форму. Событие ПриОткрытии есть у обоих типов форм, различие в других обработчиках и в директивах компиляции.
Как проверить результат и что делать дальше
После определения типа формы убедитесь, что вывод подтверждается минимум двумя признаками: структурой редактора и содержимым модуля. Одного признака иногда недостаточно — например, пустой модуль управляемой формы может не содержать директив, и тогда поможет только вид редактора.
Если форма оказалась обычной, а конфигурация работает в управляемом режиме, учтите: обычная форма откроется только в толстом клиенте в режиме обычного приложения. В тонком и веб-клиенте она работать не будет. Это частая причина ошибок «форма не найдена» при запуске.
Если планируется доработка, опирайтесь на подтверждённый тип: для управляемой формы пишите код с директивами контекста и используйте реквизиты формы, для обычной — работайте с элементами напрямую. Перед изменением формы в рабочей базе сделайте копию конфигурации или выгрузите форму — ошибочные правки модуля могут нарушить работу пользователей.
Как проверить результат
Присутствуют — управляемая форма
Отсутствуют, но редактор управляемый — сверьтесь с видом редактора
Есть «Реквизиты» и «Командный интерфейс» — управляемая
Визуальный конструктор с координатами — обычная
ТипЗнч возвращает УправляемаяФорма
Тип Форма — это обычная форма
Что важно запомнить
Управляемую форму надёжно определяют директивы контекста в модуле и закладки «Реквизиты»/«Командный интерфейс» в редакторе. Программно тип проверяется через ТипЗнч. Режим запуска конфигурации — только подсказка, а не доказательство.
Частые вопросы
Может ли обычная форма работать в тонком клиенте?
Нет. Обычные формы открываются только в толстом клиенте, запущенном в режиме обычного приложения. В тонком и веб-клиенте доступны только управляемые формы.
Как понять, какая форма назначена основной у объекта?
Откройте свойства объекта конфигурации (документа, справочника) и посмотрите поля «Основная форма объекта», «Основная форма списка» и т.п. Там указано имя формы — откройте её и определите тип по признакам из статьи.
Почему в модуле управляемой формы нет директив &НаСервере?
Если разработчик не добавлял серверных обработчиков, директив может не быть — пустой модуль ничего не содержит. В этом случае определяйте тип по виду редактора формы и набору доступных событий в палитре свойств.
Можно ли преобразовать обычную форму в управляемую?
Автоматического конвертера в платформе нет. Форму создают заново как управляемую и переносят логику с учётом разделения контекста и работы через реквизиты формы вместо прямого доступа к элементам.
Чем отличаются типы УправляемаяФорма и ФормаКлиентскогоПриложения?
В новых версиях платформы тип переименован в «ФормаКлиентскогоПриложения», а «УправляемаяФорма» сохранён как синоним для совместимости. Для прикладного кода это один и тот же тип.