Разработка и Конфигурация · 10 мин
Как определить тип элемента формы в 1С
Как определить тип элемента формы в 1С: ТипЗнч, свойство Вид, отладчик и конфигуратор. Разбор методов для полей, таблиц, кнопок и декораций с примерами кода.
Элементы формы в 1С бывают разных типов: поле ввода, таблица, кнопка, декорация, группа. Когда код должен работать с неизвестным заранее элементом — например, при универсальном обходе всех элементов формы или в общих процедурах расширений — разработчику нужно программно определить, с чем он имеет дело. От типа элемента зависит, какие свойства и методы доступны: у таблицы есть коллекция строк, у кнопки — событие нажатия, у поля — тип редактируемого значения.
Ошибка в определении типа приводит к типичной ситуации: код обращается к свойству, которого у элемента нет, и пользователь получает сообщение «Поле объекта не обнаружено». Поэтому проверка типа элемента — обязательный шаг в любой универсальной логике обхода формы.
Существует несколько способов определить тип: функция ТипЗнч(), анализ свойства Вид у полей и групп, отладчик, а также визуальный просмотр структуры формы в конфигураторе. Ниже разобраны все подходы с примерами кода и типичными ошибками.
Какие типы элементов формы существуют в 1С
В управляемой форме платформа различает пять основных типов элементов верхнего уровня. Поле формы (ПолеФормы) — элемент для отображения и редактирования данных: флажок, поле ввода, поле надписи, переключатель. Таблица формы (ТаблицаФормы) — отображает табличные части, динамические списки и таблицы значений. Кнопка формы (КнопкаФормы) — обычные кнопки и кнопки командных панелей.
Декорация формы (ДекорацияФормы) — надписи, картинки и индикаторы, не связанные с редактированием данных. Группа формы (ГруппаФормы) — контейнеры: обычные группы, страницы, командные панели, группы кнопок. Каждый тип имеет собственный набор свойств, и попытка прочитать, например, свойство ТекущаяСтрока у декорации вызовет ошибку.
Определение типа через функцию ТипЗнч()
Основной программный способ — функция ТипЗнч() в сочетании с функцией Тип(). Имя типа указывается строкой: "ПолеФормы", "ТаблицаФормы", "КнопкаФормы", "ДекорацияФормы", "ГруппаФормы". Проверка выглядит так:
Элемент = Элементы.Найти("Номенклатура");
Если ТипЗнч(Элемент) = Тип("ПолеФормы") Тогда
// работаем с полем
ИначеЕсли ТипЗнч(Элемент) = Тип("ТаблицаФормы") Тогда
// работаем с таблицей
КонецЕсли;
Перед проверкой типа убедитесь, что элемент вообще найден: метод Найти() возвращает Неопределено, если элемента с таким именем нет. Сравнение ТипЗнч(Неопределено) с типом элемента формы вернёт Ложь, но попытка обратиться к свойству Вид у Неопределено вызовет ошибку выполнения.
- 1Получите элемент: Элемент = Элементы.Найти("ИмяЭлемента")
- 2Проверьте, что Элемент <> Неопределено
- 3Сравните ТипЗнч(Элемент) с нужным типом: Тип("ПолеФормы"), Тип("ТаблицаФормы") и т.д.
- 4Если это поле или группа — уточните вид через свойство Элемент.Вид
- 5Выполните логику, соответствующую выявленному типу
Уточнение вида поля и группы через свойство Вид
Типа «ПолеФормы» часто недостаточно: поле ввода и поле флажка требуют разной обработки. Для уточнения служит свойство Вид, которое принимает значения системных перечислений. У полей это ВидПоляФормы: ПолеВвода, ПолеФлажка, ПолеНадписи, ПолеПереключателя, ПолеКартинки и другие.
Если ТипЗнч(Элемент) = Тип("ПолеФормы") Тогда
Если Элемент.Вид = ВидПоляФормы.ПолеВвода Тогда
// текстовое редактирование
ИначеЕсли Элемент.Вид = ВидПоляФормы.ПолеФлажка Тогда
// булево значение
КонецЕсли;
КонецЕсли;
У групп свойство Вид принимает значения ВидГруппыФормы: ОбычнаяГруппа, Страницы, Страница, КоманднаяПанель, ГруппаКнопок, ГруппаКолонок. Это важно при обходе дерева элементов, когда нужно, например, пропустить командные панели или обработать только страницы.
Как узнать тип элемента в отладчике
Когда код уже работает, но тип элемента неясен, быстрее всего посмотреть его в отладчике. Установите точку останова в обработчике формы, откройте форму в режиме предприятия и дождитесь остановки. Затем в табло (Shift+F9) вычислите выражение Элементы.Найти("ИмяЭлемента") — в колонке «Тип» отобразится строковое представление типа, например «ПолеФормы».
Через кнопку «Вычислить выражение» (Ctrl+W при активном табло) можно раскрыть объект и просмотреть все его свойства, включая Вид, Родитель, ПутьКДанным. Это удобно, когда нужно понять не только тип, но и контекст: к какой группе относится элемент, какой реквизит редактирует.
Альтернатива без отладки — временный вывод в сообщение: Сообщить(ТипЗнч(Элементы.Найти("Имя"))). Способ грубый, но работает даже в файловой базе без настройки отладки, например при разборе поведения расширения на рабочей копии.
Просмотр типа в конфигураторе без кода
Если форма открыта в конфигураторе, тип элемента виден визуально в дереве элементов (правая часть редактора формы). Пиктограммы различают поля, таблицы, кнопки, группы и декорации. Двойной щелчок по элементу открывает палитру свойств, где свойство Вид показывает конкретную разновидность.
Этот способ подходит на этапе проектирования, когда нужно понять структуру типовой формы перед доработкой. Ограничение очевидно: в конфигураторе видны только элементы, созданные статически. Элементы, добавленные программно через Элементы.Добавить() в модуле формы или расширении, в дереве не отображаются — их тип придётся определять в отладчике.
Способы определения типа элемента
Единственный способ для универсальной логики и обхода элементов. Требует проверки на Неопределено перед сравнением.
Быстрый разбор конкретной ситуации в работающей системе. Не подходит для постоянной логики.
Подходит для анализа статической структуры формы. Не показывает программно созданные элементы.
Универсальный обход элементов формы с проверкой типа
Типовая задача, где определение типа обязательно, — рекурсивный обход всех элементов формы, например для массовой установки доступности или только просмотра. Коллекция Элементы содержит все элементы на одном уровне, а у групп и таблиц есть коллекция ПодчиненныеЭлементы.
Процедура ОбойтиЭлементы(Родитель)
Для Каждого Элемент Из Родитель.ПодчиненныеЭлементы Цикл
Если ТипЗнч(Элемент) = Тип("ПолеФормы") Тогда
Элемент.ТолькоПросмотр = Истина;
ИначеЕсли ТипЗнч(Элемент) = Тип("ТаблицаФормы") Тогда
Элемент.ТолькоПросмотр = Истина;
ОбойтиЭлементы(Элемент);
ИначеЕсли ТипЗнч(Элемент) = Тип("ГруппаФормы") Тогда
ОбойтиЭлементы(Элемент);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Обратите внимание: у кнопок и декораций нет подчиненных элементов, поэтому рекурсия для них не нужна. А у таблицы формы подчиненные элементы — это колонки, которые тоже имеют тип ПолеФормы и обрабатываются тем же ветвлением.
Типичные ошибки при определении типа
Отдельная ошибка — путать тип элемента формы с типом данных, которые он отображает. Поле ввода может редактировать строку, число или ссылку на справочник, но тип элемента остаётся ПолеФормы. Тип редактируемого значения определяется через реквизит формы и путь к данным, а не через тип элемента.
Как проверить, что тип определён правильно
Как проверить результат
Каждый элемент попадает ровно в одну ветку, обработка выполняется
Элементы пропускаются или попадают не в ту ветку — проверьте имя типа в функции Тип()
Свойство читается без ошибок у полей и групп
Ошибка «Поле объекта не обнаружено (Вид)» — значит, элемент не относится к полям или группам
Обработаны все поля и таблицы, включая колонки таблиц
Часть элементов не обработана — проверьте, что рекурсия вызывается и для таблиц, и для групп
Финальная проверка — запуск формы в режиме предприятия и визуальный контроль результата. Если логика устанавливала только просмотр, убедитесь, что недоступны именно те поля, которые планировались, а командные панели и кнопки остались работоспособными.
Что важно запомнить
Тип элемента формы определяется через ТипЗнч() с функцией Тип(), вид поля или группы — через свойство Вид. Перед любыми обращениями проверяйте результат Найти() на Неопределено. Для разбора конкретной формы используйте отладчик, для доработки типовых форм — расширения.
Частые вопросы
Можно ли определить тип элемента по имени?
Надёжного способа нет: имя элемента произвольно и задаётся разработчиком. Соглашения об именовании (префиксы вроде «Таблица» или «Поле») существуют только как договорённость внутри команды. Единственный корректный способ — ТипЗнч() по ссылке на элемент.
Чем отличается тип элемента от вида элемента?
Тип — это класс объекта: ПолеФормы, ТаблицаФормы, КнопкаФормы, ДекорацияФормы, ГруппаФормы. Вид — уточнение внутри типа: например, поле ввода и поле флажка имеют один тип ПолеФормы, но разные значения свойства Вид.
Как определить тип колонки таблицы формы?
Колонки таблицы — это подчиненные элементы таблицы с типом ПолеФормы. Их вид обычно ПолеНадписи или ПолеВвода в зависимости от режима редактирования. Обход колонок выполняется через коллекцию ПодчиненныеЭлементы таблицы.
Работает ли ТипЗнч для элементов обычных форм?
В обычных формах (толстый клиент, режим обычного приложения) используются другие типы элементов — например, ПолеВвода, ТабличноеПоле, Кнопка. Принцип проверки через ТипЗнч() тот же, но имена типов отличаются, поэтому код не переносится между управляемыми и обычными формами без адаптации.
Как узнать тип данных, которые редактирует поле?
Через свойство ПутьКДанным элемента определите имя реквизита формы, затем найдите этот реквизит в коллекции реквизитов формы и прочитайте его ТипЗначения. Тип элемента формы сам по себе о типе данных ничего не сообщает.
Почему сравнение ТипЗнч(Элемент) = "ПолеФормы" не работает?
Потому что ТипЗнч() возвращает объект типа «Тип», а не строку. Сравнивать нужно с результатом функции Тип("ПолеФормы"). Строковое представление типа можно получить только для вывода в сообщение или журнал.