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