Тип поля ввода в управляемой форме 1С: от реквизита до программной смены
Содержание
Тип поля ввода в 1С задаётся не у самого поля, а у данных, к которым оно привязано. Откройте форму в Конфигураторе, выделите реквизит на вкладке «Реквизиты» и в палитре свойств укажите Тип. Поле ввода на форме возьмёт этот тип автоматически: для строки покажет обычный текст, для ссылки добавит кнопки выбора и открытия, для даты — календарь.
Типичная ситуация: разработчик добавил на форму обработки поле «Сумма», а в нём принимается любой текст. Или наоборот, нужное значение не вводится: поле не даёт выбрать документ, потому что тип указан как «Справочник» вместо «Документ». Ниже — как выбрать тип, как ограничить ввод, как поменять тип из кода и что делать, когда вставка из буфера обмена ведёт себя не так, как ожидаешь. Речь о платформе 8.3 с интерфейсом «Такси» и управляемыми формами.
Откуда поле ввода берёт свой тип
У поля ввода на управляемой форме есть свойство Данные. Оно указывает на реквизит формы или на реквизит объекта (например, Объект.Контрагент). Тип поля — это тип этого реквизита. Своего независимого типа у элемента формы нет.
Отсюда два практических вывода:
- 🔧 чтобы поменять тип поля, меняют тип реквизита, а не элемента;
- 🔧 у полей, связанных с реквизитами объекта метаданных, тип нельзя поправить на форме: он задан в самом справочнике, документе или регистре.
Для реквизита, который вы создали на форме сами, порядок такой:
- Откройте форму в Конфигураторе (двойной щелчок по форме в дереве конфигурации).
- Перейдите на вкладку «Реквизиты» и добавьте новый реквизит или выделите существующий.
- В палитре свойств найдите
Типи нажмите кнопку выбора справа от значения. - В окне выбора типа отметьте нужный тип. Для составного типа отмечают несколько.
- Перетащите реквизит на вкладку «Элементы»: появится поле ввода с этим типом.
Если поле уже стоит на форме, а тип вы поменяли позже, пересоздавать поле не нужно: оно подхватит новый тип при следующем открытии формы.
Какие типы встречаются чаще всего
| Тип | Что вводит пользователь | Что учесть |
|---|---|---|
Строка | Текст | Нужна длина: фиксированная или неограниченная |
Число | Число | Нужны разрядность и знак |
Дата | Дата, время или оба | Задаётся состав даты |
Булево | Флажок | Поле превращается в галочку |
СправочникСсылка.Имя | Элемент справочника | Открывается форма выбора справочника |
ДокументСсылка.Имя | Документ | Выбор из журнала документов этого вида |
ПеречислениеСсылка.Имя | Значение перечисления | Выбор из короткого списка |
Квалификаторы: длина строки, разрядность числа, состав даты
Сам тип «Строка» или «Число» ничего не говорит о границах. Их задают квалификаторы — дополнительные параметры типа. В окне выбора типа они появляются под списком, когда вы отметили соответствующий тип.
Строка
Для строки задают Длина и Допустимая длина. Длина 0 означает неограниченную строку: такое поле удобно для комментариев, но с ним нельзя сравнивать значения в запросах без преобразования. Допустимая длина бывает «Переменная» (обычный случай) и «Фиксированная» — тогда значение дополняется пробелами до заданной длины.
Пример: поле «ИНН» для юрлица — строка длиной 10 символов. Для ИП и физлица — 12. Если в одном поле нужны оба случая, ставят длину 12.
Число
Квалификаторы числа — Разрядность (сколько всего цифр) и Разрядность дробной части. Есть ещё Допустимый знак: «Любой» или «Неотрицательный».
Пример с арифметикой. Поле «Цена» с разрядностью 15 и дробной частью 2 принимает до 13 цифр в целой части: 15 − 2 = 13. Значение 12345678901,25 помещается, а число из 14 цифр до запятой — нет, платформа его не примет. Для «Количества» чаще ставят 15 и 3, для процента — 5 и 2.
Дата
У даты один квалификатор — Состав даты: «Дата», «Время» или «Дата и время». От него зависит, что покажет поле: только календарь, только часы или оба элемента.
Ограничение типа и выбор типа на форме
Когда реквизит имеет составной тип, пользователь видит поле, в которое можно ввести значения разных видов. Как это поведёт себя на форме, определяют два свойства поля ввода.
Выбирать тип (в палитре свойств поля) отвечает за то, предлагает ли платформа пользователю выбор типа перед вводом значения. Если составной тип из двух-трёх вариантов, пользователь при выборе сначала указывает тип, а потом само значение. Если свойство отключено, платформа считает, что тип известен заранее, и пропускает этот шаг.
Ограничение типа сужает набор допустимых типов только для этого конкретного поля, не меняя реквизит. Допустим, реквизит имеет тип «Любая ссылка», а в поле нужны только контрагенты и физлица: в ограничении оставляют СправочникСсылка.Контрагенты и СправочникСсылка.ФизическиеЛица. Остальные ссылки поле отклонит.
Ограничение типа работает на уровне формы. Из кода значение другого типа в реквизит записать получится, если сам реквизит это допускает. Для защиты данных проверяйте тип ещё и при записи.
Составной и произвольный тип
Составной тип — это реквизит, у которого отмечено несколько типов сразу. В окне выбора типа есть и обобщённые варианты вроде «Любая ссылка»: они подходят, когда заранее неизвестно, на что будет ссылаться значение, но у них есть цена. Поле с «Любой ссылкой» не знает, какую форму выбора открыть, и вынуждает пользователя сначала выбирать вид объекта.
Правило практика: если вариантов меньше пяти, перечислите их явно. Обобщённый тип оставьте для служебных механизмов вроде подсистемы свойств или заметок.
Программное управление типом поля
Менять тип реквизита из кода на уже открытой форме нельзя прямо: свойство типа у реквизита только для чтения. Платформа даёт два законных способа.
Способ 1. Ограничить допустимые типы у поля
Подходит, когда реквизит составной, а нужно сократить список под текущую ситуацию:
&НаКлиенте
Процедура ПриИзмененииВидаДокумента(Элемент)
Массив = Новый Массив;
Массив.Добавить(Тип("СправочникСсылка.Контрагенты"));
Массив.Добавить(Тип("СправочникСсылка.ФизическиеЛица"));
Элементы.Получатель.ОграничениеТипа = Новый ОписаниеТипов(Массив);
КонецПроцедуры
Пример рабочий, но предполагает, что в вашей конфигурации существуют оба справочника. Имена замените на свои.
Способ 2. Создать реквизит нужного типа динамически
Если форма строится под тип, который известен только в момент открытия, реквизит создают в процедуре ПриСозданииНаСервере и сразу выводят поле:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
КвалификаторыСтроки = Новый КвалификаторыСтроки(100);
ОписаниеСтроки = Новый ОписаниеТипов("Строка", , КвалификаторыСтроки);
НовыеРеквизиты = Новый Массив;
НовыеРеквизиты.Добавить(Новый РеквизитФормы("Примечание", ОписаниеСтроки, , "Примечание"));
ИзменитьРеквизиты(НовыеРеквизиты);
Поле = Элементы.Добавить("Примечание", Тип("ПолеФормы"), Элементы.ГруппаДополнительно);
Поле.Вид = ВидПоляФормы.ПолеВвода;
Поле.ПутьКДанным = "Примечание";
КонецПроцедуры
Здесь ГруппаДополнительно — группа, которую вы заранее создали на форме. Метод ИзменитьРеквизиты вызывают один раз и до того, как форма отображена, иначе он сбрасывает значения реквизитов.
Описание типов под любой случай
Конструктор Новый ОписаниеТипов принимает имя типа строкой, несколько имён через запятую или массив типов, а за ним — квалификаторы. Примеры:
Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2))— число с двумя знаками после запятой;Новый ОписаниеТипов("Дата", , , Новый КвалификаторыДаты(ЧастиДаты.Дата))— только дата;Новый ОписаниеТипов("СправочникСсылка.Номенклатура")— ссылка на номенклатуру.
Описание типов можно привести к нужному виду функцией ПривестиЗначение: она вернёт значение указанного типа или значение по умолчанию для него. Это удобно для проверки того, что ввёл пользователь.
Вставка из буфера обмена: что происходит с типом
Вставка в поле (Ctrl+V или пункт контекстного меню «Вставить») работает по правилам того типа, который у поля. Платформа не угадывает тип, а пытается преобразовать вставленный текст.
Что бывает на практике:
- 📌 Строка. Текст вставляется как есть. Если он длиннее заданной длины, лишнее обрезается. Многострочный текст попадёт в поле целиком только при включённом
Многострочный режим. - 📌 Число. Платформа читает строку как число. Пробелы-разделители тысяч обычно ломают разбор, а запятая или точка как десятичный разделитель зависит от региональных настроек. Если вставляете из Excel и получаете нули, уберите пробелы и неразрывные пробелы в исходной ячейке.
- 📌 Дата. Принимается формат, который понимает платформа при вводе с клавиатуры, например
07.10.2026. Дата в виде2026-10-07может не распознаться. - 📌 Ссылка. Вставленный текст воспринимается как строка поиска. Платформа ищет элемент по наименованию или коду и подставляет единственное совпадение. Если совпадений несколько, откроется список подбора.
Если нужно управлять этим поведением, используют события поля ввода: АвтоПодборТекста (подсказки при наборе), ОкончаниеВводаТекста (когда пользователь закончил ввод или вставил текст) и ПриИзменении. В обработчике ОкончаниеВводаТекста можно самому найти элемент по тексту, например по ИНН, и подставить его в поле.
Сузить выбор внутри одного типа
Иногда тип подходит, но в списке слишком много лишнего. Например, поле «Банковский счёт» имеет ссылочный тип, а пользователь должен видеть счета только выбранной организации. Менять тип для этого не нужно: у поля ввода есть свойства Параметры выбора и Связи параметров выбора.
В Параметрах выбора задают фиксированный отбор, например «Владелец равно такому-то значению». В Связях параметров выбора отбор привязывают к другому полю формы: пользователь выбирает организацию, и список счетов сам фильтруется по ней. Это настраивается в палитре свойств без единой строки кода.
Три шага, чтобы не промахнуться:
- Убедитесь, что у справочника, из которого выбирают, есть реквизит, по которому фильтруете (владелец или обычный реквизит).
- В свойстве
Связи параметров выборадобавьте строку: имя отбора и поле формы, из которого берётся значение. - Проверьте в режиме 1С:Предприятия, что при смене организации список обновился, а ранее выбранный счёт чужой организации не остался в поле.
Типичные проблемы с типами и как их найти
Ниже — признаки, по которым быстро понять, где сидит ошибка.
| Что видите | Вероятная причина | Что сделать |
|---|---|---|
| Поле не принимает число с копейками | В квалификаторе дробная часть 0 | Увеличьте разрядность дробной части |
| Не получается выбрать нужный документ | В реквизите указан другой вид ссылки | Проверьте тип, поправьте на ДокументСсылка.Имя |
| Вместо календаря обычная строка | Реквизит имеет тип «Строка» | Смените тип на «Дата» |
| Длинный текст обрезается | Задана фиксированная длина строки | Поставьте длину 0 или увеличьте |
| В поле «Любая ссылка» нельзя выбрать значение | Тип выбирается вручную | Укажите конкретные типы или ограничьте тип |
ИзменитьРеквизиты пересоздаёт реквизиты формы. Вызывайте его один раз при создании формы и не после ввода данных пользователем.Частые вопросы
Можно ли поменять тип поля на уже открытой форме?
ОграничениеТипа или создать реквизит заново при открытии формы через ИзменитьРеквизиты.Чем тип реквизита отличается от ограничения типа?
Почему поле ввода не показывает кнопку выбора?
Как сделать поле с выбором из фиксированного списка?
Список выбора у поля ввода. Если нужно, чтобы вводились только значения из списка, включите Режим выбора из списка.