Работа с формами в 1С:Предприятие часто требует точного понимания их типа — управляемая или обычная (устаревшая). От этого зависит не только синтаксис кода, но и логика взаимодействия с элементами, обработка событий, а также совместимость с последними версиями платформы. Например, управляемые формы поддерживают динамическое изменение интерфейса без перезагрузки, а обычные — нет. Но как быстро и безошибочно определить тип формы, особенно если вы inherited legacy-проект или работаете с чужой конфигурацией?
В этой статье мы разберём 5 практических методов — от визуальных признаков до программных проверок через встроенный язык и конфигуратор. Каждый способ подходит для разных сценариев: одни помогут пользователям без доступа к коду, другие — разработчикам, которым нужно автоматизировать проверку в скриптах. Также вы узнаете, почему некоторые формы могут "притворяться" управляемыми, хотя на самом деле являются обычными с эмуляцией поведения, и как это распознать.
1. Визуальные признаки управляемой формы
Самый быстрый способ — оценить интерфейс формы на предмет характерных особенностей управляемых форм. Их дизайн и поведение заметно отличаются от обычных, даже если функциональность идентична.
- 🔍 Динамическое изменение элементов: Кнопки, поля и табличные части появляются/исчезают без перерисовки всей формы (например, при смене вкладок или условий видимости).
- 🎨 Современный стиль оформления: Плоский дизайн, скруглённые углы, тени под элементами, анимация при наведении (в последних версиях платформы).
- 📱 Адаптивность: Форма подстраивается под размер окна — элементы перестраиваются, а не обрезаются (в отличие от обычных форм, где часто появляются полосы прокрутки).
- ⚙️ Контекстное меню: При правом клике на элемент формы появляется меню с пунктами типа "Настроить список", "Показать настройки" (в обычных формах такого нет).
Однако визуальный метод не всегда надёжен. Например, обычная форма может быть стилизована под управляемую с помощью СтильОформления, а управляемая — упрощена до минималистичного вида. В таких случаях требуется более глубокая проверка.
⚠️ Внимание: В конфигурациях на базе 1С:Управление торговлей 10.3 или 1С:Бухгалтерия 2.0 (и более ранних) управляемых форм нет в принципе — их поддерживают только платформы 8.2 и выше. Если вы работаете с унаследованной системой, сразу переходите к способу №4 (проверка через конфигуратор).
2. Проверка через свойства формы (для пользователей)
Если у вас есть доступ к форме в режиме 1С:Предприятие (но нет прав на конфигуратор), используйте встроенные инструменты платформы. Этот метод не требует знания кода и подходит для аналитиков или опытных пользователей.
Откройте форму (например, документа или справочника) и выполните следующие шаги:
- Нажмите
Ctrl + Shift + F1— это вызовет окно "Все функции". - В строке поиска введите
ТипФормыилиThisFormи нажмитеEnter. - Если в результатах появится метод
ТипФормы(), выделите его и нажмитеВыполнить. В окне результата вы увидите:УправляемаяФорма— если форма управляемая;ОбычнаяФорма— если обычная.
Альтернативный путь: в окне формы нажмите F1 (вызов справки), затем в адресной строке браузера (если справка открылась в нём) найдите параметр formType. Его значение укажет на тип формы.
Если окно "Все функции" не открывается, проверьте, не заблокированы ли горячие клавиши в настройках 1С:Предприятия (раздел "Администрирование → Настройки пользователя").
3. Программная проверка через встроенный язык
Для разработчиков самый надёжный способ — написать короткий скрипт, который определит тип формы. Этот метод работает как в режиме 1С:Предприятие, так и в Конфигураторе (в отладчике).
Используйте следующий код:
Если ТипЗнч(ЭтотОбъект) = Тип("УправляемаяФорма") Тогда
Сообщить("Это управляемая форма!");
ИначеЕсли ТипЗнч(ЭтотОбъект) = Тип("Форма") Тогда
Сообщить("Это обычная форма!");
КонецЕсли;
Где разместить код:
- 📝 В обработчике события формы (например,
ПриОткрытии). - 🖥️ В окне отладчика (
Ctrl + Alt + F5), если форма уже открыта. - 🔧 В внешней обработке, которая будет подключаться к любой форме.
Для проверки формы до её открытия (например, в модуле объекта) используйте функцию ПолучитьФорму():
ФормаОбъекта = Объект.ПолучитьФорму();
Если ТипЗнч(ФормаОбъекта) = Тип("УправляемаяФорма") Тогда
// Логика для управляемой формы
КонецЕсли;
⚠️ Внимание: В некоторых случаях методПолучитьФорму()может вернутьНеопределён, если форма не назначена объекту или удалена. Всегда обрабатывайте такие ситуации черезПопытка...Исключение.
Вызвать отладчик (Ctrl+Alt+F5)|Вставить код с проверкой ТипЗнч(ЭтотОбъект)|Проверить результат в окне сообщений|Обработать исключения, если форма не открыта-->
4. Анализ в Конфигураторе (для разработчиков)
Если у вас есть доступ к Конфигуратору, самый надёжный способ — изучить структуру формы напрямую. Этот метод гарантированно покажет тип формы, даже если она модифицирована или наследуется от другой.
Инструкция:
- Откройте конфигурацию в Конфигураторе (
1Cv8.cfили через меню запуска). - Перейдите в дерево объектов:
Объекты → [ТипОбъекта] → Формы(например,Документы → РеализацияТоваровУслуг → Формы). - Найдите нужную форму в списке. В колонке "Тип" будет указано:
Управляемая форма— для управляемых;Форма— для обычных.
Дополнительно можно открыть форму в редактор и проверить:
- 📌 Наличие вкладки "Реквизиты" (только в управляемых формах).
- 📌 Вкладка "Модуль" содержит обработчики событий типа
ПриСозданииНаСервере(характерно для управляемых). - 📌 В свойствах формы есть параметр
Управляемаясо значениемИстина.
| Признак | Управляемая форма | Обычная форма |
|---|---|---|
| Тип в дереве Конфигуратора | УправляемаяФорма |
Форма |
| Наличие вкладки "Реквизиты" | Да | Нет |
Обработчик ПриОткрытии |
Есть (клиентский и серверный) | Есть (только клиентский) |
Метод ЭлементыФормы |
Возвращает коллекцию | Не поддерживается |
Что делать, если форма отсутствует в дереве Конфигуратора?
Это означает, что форма не назначена объекту или удалена. В таком случае:
1. Проверьте, не используется ли внешняя форма (файл .epf или .erf).
2. Убедитесь, что вы смотрите правильную конфигурацию (возможно, форма в другой базе).
3. Используйте программный метод (способ №3), чтобы получить форму через код.
5. Проверка через журнал регистрации
Менее известный, но полезный метод — анализ журнала регистрации. Он помогает, когда форма открывается динамически (например, через ОткрытьФорму()), и её тип нужно определить постфактум.
Как это сделать:
- Включите регистрацию событий в 1С:Предприятии:
Администрирование → Журнал регистрации → Настройка. - Установите флаги для событий "Открытие формы" и "Закрытие формы".
- Откройте нужную форму и найдите запись о её открытии в журнале.
- В колонке "Дополнительно" будет указан тип формы, например:
УправляемаяФорма.ФормаДокумента.РеализацияТоваровУслуг.
Этот способ полезен для отладки, когда форма открывается неявно (например, из другой формы или через обработчик). Однако он требует прав администратора и может быть ресурсоёмким на больших базах.
⚠️ Внимание: В облачных версиях 1С (например, 1С:Fresh) доступ к журналу регистрации может быть ограничен. Используйте альтернативные методы (способ №2 или №3).
6. Специфические случаи: гибридные формы и эмуляция
Иногда формы ведут себя нестандартно. Например:
- 🤖 Обычная форма с эмуляцией: Разработчик вручную добавил динамическое поведение (скрытие/показ элементов через код), имитируя управляемую форму.
- 🧩 Гибридные формы: В старых конфигурациях могли встречаться формы, где часть логики писалась под управляемый интерфейс, а часть — под обычный.
- 📁 Внешние формы: Формы из файлов
.epf/.erf, которые подключаются динамически и могут иметь любой тип.
Как распознать такие случаи:
- Проверьте источник формы:
- Если форма хранится в файле (внешняя), её тип можно определить только программно (способ №3).
- Если форма встроена в конфигурацию, но ведёт себя странно, изучите её модуль на наличие ручной эмуляции (поиск по ключевым словам
Видимость,ДобавитьКнопку).
- Вызов методов
Обновить()— характерно для обычных форм. - Использование
ПараметрыФормы— характерно для управляемых.
Пример кода для проверки гибридной формы:
Если ЭтотОбъект.ЭлементыФормы <> Неопределено Тогда
// Это управляемая форма (или эмуляция)
Попытка
ЭтотОбъект.ЭлементыФормы.Кнопка1.Видимость = Ложь; // Пробуем изменить видимость динамически
Сообщить("Форма поддерживает динамическое управление элементами!");
Исключение
Сообщить("Форма не поддерживает динамическое управление (возможно, обычная с эмуляцией)");
КонецПопытки;
КонецЕсли;
Если форма ведёт себя как управляемая, но программно определяется как обычная, скорее всего, это ручная эмуляция. Такие формы требуют особого подхода при доработках — их логику нельзя переносить на настоящие управляемые формы без рефакторинга.
FAQ: Частые вопросы о проверке форм в 1С
Можно ли преобразовать обычную форму в управляемую автоматически?
Нет, автоматического преобразования не существует. Это требует полной переработки формы в Конфигураторе:
- Создать новую управляемую форму.
- Перенести все элементы и логику вручную.
- Заменить обработчики событий (например,
ПриАктивизацииСтрокинаПриИзменении).
Для ускорения процесса можно использовать внешние обработки-конвертеры (например, от Инфостарт), но они не гарантируют 100% работоспособность.
Почему в отчётах и обработках нет управляемых форм?
В 1С:Предприятие 8 отчёты и обработки по умолчанию используют обычные формы, даже в последних версиях платформы. Это связано с историческими причинами и спецификой их работы:
- Отчёты часто открываются в модальном режиме, где преимущества управляемых форм неактуальны.
- Обработки могут выполняться в фоновом режиме без интерфейса.
Однако вы можете вручную создать управляемую форму для отчёта/обработки через Конфигуратор и назначить её основной.
Как узнать тип формы, если она открывается из другой формы?
Используйте один из следующих подходов:
- Через параметры открытия:
ПараметрыФормы = Новый Структура("Ключ, Значение");ПараметрыФормы.Вставить("РодительскаяФорма", ЭтотОбъект);
ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", ПараметрыФормы);
В дочерней форме проверьте тип через
Параметры.РодительскаяФорма. - Через глобальный контекст:
Если ТипЗнч(ГлобальныйКонтекст.ТекущаяФорма) = Тип("УправляемаяФорма") Тогда// ...
КонецЕсли;
Влияет ли тип формы на производительность?
Да, но не всегда критично:
- 🚀 Управляемые формы могут быть медленнее при первом открытии (из-за динамической загрузки элементов), но быстрее при последующих взаимодействиях (благодаря кэшированию).
- 🐢 Обычные формы открываются быстрее "в холодном состоянии", но тормозят при частом обновлении интерфейса (например, при изменении видимости элементов).
Для оптимизации:
- В управляемых формах избегайте сложных вычислений в
ПриСозданииНаСервере. - В обычных формах минимизируйте количество
Обновить().
Можно ли в управляемой форме использовать элементы из обычной?
Нет, напрямую нельзя. Элементы обычных форм (например, ПолеФормы, ТаблицаФормы) несовместимы с управляемыми. Однако вы можете:
- 🔄 Эмулировать поведение: Создать аналогичные элементы в управляемой форме (например, заменить
ТаблицаФормынаТабличноеПоле). - 📦 Использовать общие модули: Перенести логику из обычной формы в общий модуль и вызывать её оттуда.
- 🖼️ Встраивать через OLE: В крайних случаях можно вставить обычную форму как OLE-объект, но это не рекомендуется из-за проблем с поддержкой.