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

В этой статье мы разберём 5 практических методов — от визуальных признаков до программных проверок через встроенный язык и конфигуратор. Каждый способ подходит для разных сценариев: одни помогут пользователям без доступа к коду, другие — разработчикам, которым нужно автоматизировать проверку в скриптах. Также вы узнаете, почему некоторые формы могут "притворяться" управляемыми, хотя на самом деле являются обычными с эмуляцией поведения, и как это распознать.

1. Визуальные признаки управляемой формы

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

  • 🔍 Динамическое изменение элементов: Кнопки, поля и табличные части появляются/исчезают без перерисовки всей формы (например, при смене вкладок или условий видимости).
  • 🎨 Современный стиль оформления: Плоский дизайн, скруглённые углы, тени под элементами, анимация при наведении (в последних версиях платформы).
  • 📱 Адаптивность: Форма подстраивается под размер окна — элементы перестраиваются, а не обрезаются (в отличие от обычных форм, где часто появляются полосы прокрутки).
  • ⚙️ Контекстное меню: При правом клике на элемент формы появляется меню с пунктами типа "Настроить список", "Показать настройки" (в обычных формах такого нет).

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

⚠️ Внимание: В конфигурациях на базе 1С:Управление торговлей 10.3 или 1С:Бухгалтерия 2.0 (и более ранних) управляемых форм нет в принципе — их поддерживают только платформы 8.2 и выше. Если вы работаете с унаследованной системой, сразу переходите к способу №4 (проверка через конфигуратор).
📊 Как часто вам приходится определять тип формы в 1С?
Постоянно, это часть моей работы
Иногда, при доработках чужих конфигураций
Рядом, но не уверен, как это сделать
Никогда не сталкивался

2. Проверка через свойства формы (для пользователей)

Если у вас есть доступ к форме в режиме 1С:Предприятие (но нет прав на конфигуратор), используйте встроенные инструменты платформы. Этот метод не требует знания кода и подходит для аналитиков или опытных пользователей.

Откройте форму (например, документа или справочника) и выполните следующие шаги:

  1. Нажмите Ctrl + Shift + F1 — это вызовет окно "Все функции".
  2. В строке поиска введите ТипФормы или ThisForm и нажмите Enter.
  3. Если в результатах появится метод ТипФормы(), выделите его и нажмите Выполнить. В окне результата вы увидите:
    • УправляемаяФорма — если форма управляемая;
    • ОбычнаяФорма — если обычная.

Альтернативный путь: в окне формы нажмите F1 (вызов справки), затем в адресной строке браузера (если справка открылась в нём) найдите параметр formType. Его значение укажет на тип формы.

💡

Если окно "Все функции" не открывается, проверьте, не заблокированы ли горячие клавиши в настройках 1С:Предприятия (раздел "Администрирование → Настройки пользователя").

3. Программная проверка через встроенный язык

Для разработчиков самый надёжный способ — написать короткий скрипт, который определит тип формы. Этот метод работает как в режиме 1С:Предприятие, так и в Конфигураторе (в отладчике).

Используйте следующий код:

Если ТипЗнч(ЭтотОбъект) = Тип("УправляемаяФорма") Тогда

Сообщить("Это управляемая форма!");

ИначеЕсли ТипЗнч(ЭтотОбъект) = Тип("Форма") Тогда

Сообщить("Это обычная форма!");

КонецЕсли;

Где разместить код:

  • 📝 В обработчике события формы (например, ПриОткрытии).
  • 🖥️ В окне отладчика (Ctrl + Alt + F5), если форма уже открыта.
  • 🔧 В внешней обработке, которая будет подключаться к любой форме.

Для проверки формы до её открытия (например, в модуле объекта) используйте функцию ПолучитьФорму():

ФормаОбъекта = Объект.ПолучитьФорму();

Если ТипЗнч(ФормаОбъекта) = Тип("УправляемаяФорма") Тогда

// Логика для управляемой формы

КонецЕсли;

⚠️ Внимание: В некоторых случаях метод ПолучитьФорму() может вернуть Неопределён, если форма не назначена объекту или удалена. Всегда обрабатывайте такие ситуации через Попытка...Исключение.

Вызвать отладчик (Ctrl+Alt+F5)|Вставить код с проверкой ТипЗнч(ЭтотОбъект)|Проверить результат в окне сообщений|Обработать исключения, если форма не открыта-->

4. Анализ в Конфигураторе (для разработчиков)

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

Инструкция:

  1. Откройте конфигурацию в Конфигураторе (1Cv8.cf или через меню запуска).
  2. Перейдите в дерево объектов: Объекты → [ТипОбъекта] → Формы (например, Документы → РеализацияТоваровУслуг → Формы).
  3. Найдите нужную форму в списке. В колонке "Тип" будет указано:
    • Управляемая форма — для управляемых;
    • Форма — для обычных.

Дополнительно можно открыть форму в редактор и проверить:

  • 📌 Наличие вкладки "Реквизиты" (только в управляемых формах).
  • 📌 Вкладка "Модуль" содержит обработчики событий типа ПриСозданииНаСервере (характерно для управляемых).
  • 📌 В свойствах формы есть параметр Управляемая со значением Истина.
Признак Управляемая форма Обычная форма
Тип в дереве Конфигуратора УправляемаяФорма Форма
Наличие вкладки "Реквизиты" Да Нет
Обработчик ПриОткрытии Есть (клиентский и серверный) Есть (только клиентский)
Метод ЭлементыФормы Возвращает коллекцию Не поддерживается
Что делать, если форма отсутствует в дереве Конфигуратора?

Это означает, что форма не назначена объекту или удалена. В таком случае:

1. Проверьте, не используется ли внешняя форма (файл .epf или .erf).

2. Убедитесь, что вы смотрите правильную конфигурацию (возможно, форма в другой базе).

3. Используйте программный метод (способ №3), чтобы получить форму через код.

5. Проверка через журнал регистрации

Менее известный, но полезный метод — анализ журнала регистрации. Он помогает, когда форма открывается динамически (например, через ОткрытьФорму()), и её тип нужно определить постфактум.

Как это сделать:

  1. Включите регистрацию событий в 1С:Предприятии: Администрирование → Журнал регистрации → Настройка.
  2. Установите флаги для событий "Открытие формы" и "Закрытие формы".
  3. Откройте нужную форму и найдите запись о её открытии в журнале.
  4. В колонке "Дополнительно" будет указан тип формы, например: УправляемаяФорма.ФормаДокумента.РеализацияТоваровУслуг.

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

⚠️ Внимание: В облачных версиях (например, 1С:Fresh) доступ к журналу регистрации может быть ограничен. Используйте альтернативные методы (способ №2 или №3).

6. Специфические случаи: гибридные формы и эмуляция

Иногда формы ведут себя нестандартно. Например:

  • 🤖 Обычная форма с эмуляцией: Разработчик вручную добавил динамическое поведение (скрытие/показ элементов через код), имитируя управляемую форму.
  • 🧩 Гибридные формы: В старых конфигурациях могли встречаться формы, где часть логики писалась под управляемый интерфейс, а часть — под обычный.
  • 📁 Внешние формы: Формы из файлов .epf/.erf, которые подключаются динамически и могут иметь любой тип.

Как распознать такие случаи:

  1. Проверьте источник формы:
    • Если форма хранится в файле (внешняя), её тип можно определить только программно (способ №3).
    • Если форма встроена в конфигурацию, но ведёт себя странно, изучите её модуль на наличие ручной эмуляции (поиск по ключевым словам Видимость, ДобавитьКнопку).
  • Используйте отладчик для пошагового выполнения кода формы. Обратите внимание на:
    • Вызов методов Обновить() — характерно для обычных форм.
    • Использование ПараметрыФормы — характерно для управляемых.
    • Пример кода для проверки гибридной формы:

      Если ЭтотОбъект.ЭлементыФормы <> Неопределено Тогда
      

      // Это управляемая форма (или эмуляция)

      Попытка

      ЭтотОбъект.ЭлементыФормы.Кнопка1.Видимость = Ложь; // Пробуем изменить видимость динамически

      Сообщить("Форма поддерживает динамическое управление элементами!");

      Исключение

      Сообщить("Форма не поддерживает динамическое управление (возможно, обычная с эмуляцией)");

      КонецПопытки;

      КонецЕсли;

      💡

      Если форма ведёт себя как управляемая, но программно определяется как обычная, скорее всего, это ручная эмуляция. Такие формы требуют особого подхода при доработках — их логику нельзя переносить на настоящие управляемые формы без рефакторинга.

      FAQ: Частые вопросы о проверке форм в 1С

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

      Нет, автоматического преобразования не существует. Это требует полной переработки формы в Конфигураторе:

      1. Создать новую управляемую форму.
      2. Перенести все элементы и логику вручную.
      3. Заменить обработчики событий (например, ПриАктивизацииСтроки на ПриИзменении).

    Для ускорения процесса можно использовать внешние обработки-конвертеры (например, от Инфостарт), но они не гарантируют 100% работоспособность.

    Почему в отчётах и обработках нет управляемых форм?

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

    • Отчёты часто открываются в модальном режиме, где преимущества управляемых форм неактуальны.
    • Обработки могут выполняться в фоновом режиме без интерфейса.
    • Однако вы можете вручную создать управляемую форму для отчёта/обработки через Конфигуратор и назначить её основной.

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

    Используйте один из следующих подходов:

    1. Через параметры открытия:
      ПараметрыФормы = Новый Структура("Ключ, Значение");
      

      ПараметрыФормы.Вставить("РодительскаяФорма", ЭтотОбъект);

      ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", ПараметрыФормы);

      В дочерней форме проверьте тип через Параметры.РодительскаяФорма.

    2. Через глобальный контекст:
      Если ТипЗнч(ГлобальныйКонтекст.ТекущаяФорма) = Тип("УправляемаяФорма") Тогда
      

      // ...

      КонецЕсли;

    Влияет ли тип формы на производительность?

    Да, но не всегда критично:

    • 🚀 Управляемые формы могут быть медленнее при первом открытии (из-за динамической загрузки элементов), но быстрее при последующих взаимодействиях (благодаря кэшированию).
    • 🐢 Обычные формы открываются быстрее "в холодном состоянии", но тормозят при частом обновлении интерфейса (например, при изменении видимости элементов).

    Для оптимизации:

    • В управляемых формах избегайте сложных вычислений в ПриСозданииНаСервере.
    • В обычных формах минимизируйте количество Обновить().

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

    Нет, напрямую нельзя. Элементы обычных форм (например, ПолеФормы, ТаблицаФормы) несовместимы с управляемыми. Однако вы можете:

    • 🔄 Эмулировать поведение: Создать аналогичные элементы в управляемой форме (например, заменить ТаблицаФормы на ТабличноеПоле).
    • 📦 Использовать общие модули: Перенести логику из обычной формы в общий модуль и вызывать её оттуда.
    • 🖼️ Встраивать через OLE: В крайних случаях можно вставить обычную форму как OLE-объект, но это не рекомендуется из-за проблем с поддержкой.