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

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

Как определить тип элемента формы в 1С

Как определить тип элемента формы в 1С: ТипЗнч, свойство Вид, отладчик и конфигуратор. Разбор методов для полей, таблиц, кнопок и декораций с примерами кода.

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

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

Существует несколько способов определить тип: функция ТипЗнч(), анализ свойства Вид у полей и групп, отладчик, а также визуальный просмотр структуры формы в конфигураторе. Ниже разобраны все подходы с примерами кода и типичными ошибками.

Какие типы элементов формы существуют в 1С

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

Декорация формы (ДекорацияФормы) — надписи, картинки и индикаторы, не связанные с редактированием данных. Группа формы (ГруппаФормы) — контейнеры: обычные группы, страницы, командные панели, группы кнопок. Каждый тип имеет собственный набор свойств, и попытка прочитать, например, свойство ТекущаяСтрока у декорации вызовет ошибку.

Определение типа через функцию ТипЗнч()

Основной программный способ — функция ТипЗнч() в сочетании с функцией Тип(). Имя типа указывается строкой: "ПолеФормы", "ТаблицаФормы", "КнопкаФормы", "ДекорацияФормы", "ГруппаФормы". Проверка выглядит так:

Элемент = Элементы.Найти("Номенклатура");

Если ТипЗнч(Элемент) = Тип("ПолеФормы") Тогда

// работаем с полем

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

// работаем с таблицей

КонецЕсли;

Перед проверкой типа убедитесь, что элемент вообще найден: метод Найти() возвращает Неопределено, если элемента с таким именем нет. Сравнение ТипЗнч(Неопределено) с типом элемента формы вернёт Ложь, но попытка обратиться к свойству Вид у Неопределено вызовет ошибку выполнения.

Порядок определения типа элемента
  1. 1
    Получите элемент: Элемент = Элементы.Найти("ИмяЭлемента")
  2. 2
    Проверьте, что Элемент <> Неопределено
  3. 3
    Сравните ТипЗнч(Элемент) с нужным типом: Тип("ПолеФормы"), Тип("ТаблицаФормы") и т.д.
  4. 4
    Если это поле или группа — уточните вид через свойство Элемент.Вид
  5. 5
    Выполните логику, соответствующую выявленному типу

Уточнение вида поля и группы через свойство Вид

Типа «ПолеФормы» часто недостаточно: поле ввода и поле флажка требуют разной обработки. Для уточнения служит свойство Вид, которое принимает значения системных перечислений. У полей это ВидПоляФормы: ПолеВвода, ПолеФлажка, ПолеНадписи, ПолеПереключателя, ПолеКартинки и другие.

Если ТипЗнч(Элемент) = Тип("ПолеФормы") Тогда

Если Элемент.Вид = ВидПоляФормы.ПолеВвода Тогда

// текстовое редактирование

ИначеЕсли Элемент.Вид = ВидПоляФормы.ПолеФлажка Тогда

// булево значение

КонецЕсли;

КонецЕсли;

У групп свойство Вид принимает значения ВидГруппыФормы: ОбычнаяГруппа, Страницы, Страница, КоманднаяПанель, ГруппаКнопок, ГруппаКолонок. Это важно при обходе дерева элементов, когда нужно, например, пропустить командные панели или обработать только страницы.

Как узнать тип элемента в отладчике

Когда код уже работает, но тип элемента неясен, быстрее всего посмотреть его в отладчике. Установите точку останова в обработчике формы, откройте форму в режиме предприятия и дождитесь остановки. Затем в табло (Shift+F9) вычислите выражение Элементы.Найти("ИмяЭлемента") — в колонке «Тип» отобразится строковое представление типа, например «ПолеФормы».

Через кнопку «Вычислить выражение» (Ctrl+W при активном табло) можно раскрыть объект и просмотреть все его свойства, включая Вид, Родитель, ПутьКДанным. Это удобно, когда нужно понять не только тип, но и контекст: к какой группе относится элемент, какой реквизит редактирует.

Альтернатива без отладки — временный вывод в сообщение: Сообщить(ТипЗнч(Элементы.Найти("Имя"))). Способ грубый, но работает даже в файловой базе без настройки отладки, например при разборе поведения расширения на рабочей копии.

Просмотр типа в конфигураторе без кода

Если форма открыта в конфигураторе, тип элемента виден визуально в дереве элементов (правая часть редактора формы). Пиктограммы различают поля, таблицы, кнопки, группы и декорации. Двойной щелчок по элементу открывает палитру свойств, где свойство Вид показывает конкретную разновидность.

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

Способы определения типа элемента

ТипЗнч() в коде

Единственный способ для универсальной логики и обхода элементов. Требует проверки на Неопределено перед сравнением.

Отладчик и табло

Быстрый разбор конкретной ситуации в работающей системе. Не подходит для постоянной логики.

Дерево элементов в конфигураторе

Подходит для анализа статической структуры формы. Не показывает программно созданные элементы.

Универсальный обход элементов формы с проверкой типа

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

Процедура ОбойтиЭлементы(Родитель)

Для Каждого Элемент Из Родитель.ПодчиненныеЭлементы Цикл

Если ТипЗнч(Элемент) = Тип("ПолеФормы") Тогда

Элемент.ТолькоПросмотр = Истина;

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

Элемент.ТолькоПросмотр = Истина;

ОбойтиЭлементы(Элемент);

ИначеЕсли ТипЗнч(Элемент) = Тип("ГруппаФормы") Тогда

ОбойтиЭлементы(Элемент);

КонецЕсли;

КонецЦикла;

КонецПроцедуры

Обратите внимание: у кнопок и декораций нет подчиненных элементов, поэтому рекурсия для них не нужна. А у таблицы формы подчиненные элементы — это колонки, которые тоже имеют тип ПолеФормы и обрабатываются тем же ветвлением.

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

Типичные ошибки
01
Обращение к свойству Вид без проверки типа: у таблицы нет значения ВидПоляФормы, код падает с ошибкой. Сначала проверяйте ТипЗнч, потом читайте Вид.
02
Отсутствие проверки на Неопределено после Элементы.Найти(): если элемент не найден, любое обращение к его свойствам вызывает исключение.
03
Сравнение типа строкой ТипЗнч(Элемент) = "ПолеФормы": такое сравнение всегда ложно, тип нужно получать через функцию Тип().
04
Попытка изменить свойство Вид программно: оно доступно только для чтения, изменение вызывает ошибку.
05
Игнорирование программно созданных элементов: в конфигураторе их не видно, логика обхода должна работать с коллекцией Элементы в рантайме.

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

Как проверить, что тип определён правильно

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

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

Ветвление по типу в коде
Норма

Каждый элемент попадает ровно в одну ветку, обработка выполняется

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

Элементы пропускаются или попадают не в ту ветку — проверьте имя типа в функции Тип()

Работа со свойством Вид
Норма

Свойство читается без ошибок у полей и групп

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

Ошибка «Поле объекта не обнаружено (Вид)» — значит, элемент не относится к полям или группам

Рекурсивный обход формы
Норма

Обработаны все поля и таблицы, включая колонки таблиц

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

Часть элементов не обработана — проверьте, что рекурсия вызывается и для таблиц, и для групп

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

Итог

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

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

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

Можно ли определить тип элемента по имени?

Надёжного способа нет: имя элемента произвольно и задаётся разработчиком. Соглашения об именовании (префиксы вроде «Таблица» или «Поле») существуют только как договорённость внутри команды. Единственный корректный способ — ТипЗнч() по ссылке на элемент.

Чем отличается тип элемента от вида элемента?

Тип — это класс объекта: ПолеФормы, ТаблицаФормы, КнопкаФормы, ДекорацияФормы, ГруппаФормы. Вид — уточнение внутри типа: например, поле ввода и поле флажка имеют один тип ПолеФормы, но разные значения свойства Вид.

Как определить тип колонки таблицы формы?

Колонки таблицы — это подчиненные элементы таблицы с типом ПолеФормы. Их вид обычно ПолеНадписи или ПолеВвода в зависимости от режима редактирования. Обход колонок выполняется через коллекцию ПодчиненныеЭлементы таблицы.

Работает ли ТипЗнч для элементов обычных форм?

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

Как узнать тип данных, которые редактирует поле?

Через свойство ПутьКДанным элемента определите имя реквизита формы, затем найдите этот реквизит в коллекции реквизитов формы и прочитайте его ТипЗначения. Тип элемента формы сам по себе о типе данных ничего не сообщает.

Почему сравнение ТипЗнч(Элемент) = "ПолеФормы" не работает?

Потому что ТипЗнч() возвращает объект типа «Тип», а не строку. Сравнивать нужно с результатом функции Тип("ПолеФормы"). Строковое представление типа можно получить только для вывода в сообщение или журнал.