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

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

Как получить значение поля ввода в 1С

Как получить значение поля ввода в 1С 8.3: управляемые и обычные формы, доступ через реквизиты, обработчики событий, типовые ошибки и примеры кода.

Задача получить значение поля ввода возникает у разработчика 1С постоянно: на форме документа пользователь ввёл число или строку, и это значение нужно проверить, использовать в расчёте или передать в другой объект. Способ получения зависит от типа формы (управляемая или обычная) и от того, как поле связано с данными — напрямую с реквизитом объекта или с реквизитом формы.

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

Ниже разобраны рабочие способы для управляемых и обычных форм, обработчики событий изменения, проверка и приведение типов, а также типичные ошибки, из-за которых вместо значения разработчик получает пустую строку или ошибку исполнения.

Определяем тип формы и источник данных

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

Второй момент — привязка поля к данным. Откройте свойства поля ввода в конфигураторе и посмотрите свойство «ПутьКДанным» (DataPath). Если там указан реквизит объекта или реквизит формы, значение уже находится в этом реквизите, и отдельно «читать поле» не нужно. Если поле не связано с данными (что редко, но бывает в доработках), придётся работать с элементом формы напрямую.

Получение значения в управляемой форме

В управляемой форме основной способ — обращение к реквизиту. Если поле связано с реквизитом объекта (например, документа), значение доступно через Объект.ИмяРеквизита. Если поле связано с реквизитом формы, добавленным вручную, используйте ЭтаФорма.ИмяРеквизита или просто имя реквизита в модуле формы.

// Реквизит объекта (например, документа)

СуммаИзПоля = Объект.СуммаОплаты;

// Реквизит формы, добавленный вручную

КомментарийИзПоля = ЭтаФорма.Комментарий;

Обратиться к самому элементу можно через коллекцию Элементы: Элементы.ИмяПоля. Но у элемента управляемой формы нет свойства «Значение» с данными объекта — элемент отвечает только за отображение (видимость, доступность, заголовок). Поэтому конструкция вида Элементы.ПолеСумма.Значение в управляемой форме не даст нужного результата.

Получение значения в обычной форме

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

// Обычная форма

ЗначениеПоля = ЭлементыФормы.ПолеВвода1.Значение;

// Если поле связано с реквизитом объекта — надёжнее читать реквизит

ЗначениеПоля = ЭтотОбъект.Наименование;

Даже в обычной форме предпочтительнее читать реквизит объекта, а не элемент: реквизит содержит типизированное значение, тогда как свойство элемента может вернуть данные в неожиданном виде, если поле настроено нестандартно.

Обработчики событий поля ввода

Часто значение нужно не в произвольный момент, а сразу после ввода пользователем. Для этого у поля ввода есть события, которые назначаются в палитре свойств элемента формы:

  • ПриИзменении — срабатывает после завершения редактирования, когда значение уже записано в связанный реквизит. Основное событие для реакции на ввод.
  • ИзменениеТекстаРедактирования — срабатывает на каждое нажатие клавиши, ещё до записи в реквизит. В параметре Текст передаётся текущий введённый текст.
  • НачалоВыбора и ОкончаниеВводаТекста — для полей со списком выбора и вводом по строке.
&НаКлиенте

Процедура ПолеСуммаПриИзменении(Элемент)

// Значение уже в реквизите — просто читаем его

ТекущаяСумма = Объект.СуммаОплаты;

Если ТекущаяСумма < 0 Тогда

Сообщить("Сумма не может быть отрицательной");

КонецЕсли;

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

Порядок действий
  1. 1
    Откройте форму в конфигураторе и выделите поле ввода
  2. 2
    В свойствах найдите ПутьКДанным — запомните имя реквизита
  3. 3
    В модуле формы читайте значение через Объект.ИмяРеквизита или ЭтаФорма.ИмяРеквизита
  4. 4
    Если нужна реакция на ввод — создайте обработчик ПриИзменении у элемента
  5. 5
    Проверьте результат в режиме предприятия: введите значение и убедитесь, что код его видит

Проверка и приведение типов значения

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

Если Не ЗначениеЗаполнено(Объект.Количество) Тогда

Сообщить("Поле количества не заполнено");

Возврат;

КонецЕсли;

Если ТипЗнч(Объект.Количество) <> Тип("Число") Тогда

Сообщить("Ожидалось числовое значение");

Возврат;

КонецЕсли;

Если значение приходит как строка (например, из события ИзменениеТекстаРедактирования), а нужно число, приведите его явно. Учтите, что пользователь мог ввести нечисловые символы, и прямое преобразование может дать ноль или ошибку — безопаснее обернуть преобразование в попытку или предварительно проверить содержимое.

Типичные ошибки и ограничения

Самая распространённая ошибка — попытка прочитать Элементы.ИмяПоля.Значение в управляемой форме. Свойства «Значение» у элемента нет, и код либо выдаёт ошибку, либо молча не работает в зависимости от контекста. Второй частый промах — чтение реквизита в обработчике ИзменениеТекстаРедактирования: на этом этапе реквизит ещё не обновлён, там старое значение, а введённый текст доступен только в параметре события.

Ещё одна ловушка — имена. Имя элемента формы и имя реквизита могут не совпадать: элемент мог быть переименован при доработке. Всегда сверяйте ПутьКДанным в свойствах элемента, а не полагайтесь на совпадение названий. Также помните, что в клиент-серверном режиме обращение к реквизиту объекта в клиентском контексте может потребовать вызова сервера, если данные не кэшированы на форме.

Типичные ошибки
01
Чтение Элементы.ИмяПоля.Значение в управляемой форме — у элемента нет данных объекта, читайте реквизит
02
Чтение реквизита в событии ИзменениеТекстаРедактирования — реквизит ещё старый, берите параметр Текст
03
Путаница имени элемента и имени реквизита — сверяйте свойство ПутьКДанным
04
Отсутствие проверки заполненности — пустое поле ломает последующий расчёт
Контрольные точки

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

Значение в отладчике
Норма

Реквизит содержит введённые данные сразу после ПриИзменении

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

Реквизит пустой или содержит старое значение — неверный источник данных

Тип значения
Норма

ТипЗнч() возвращает ожидаемый тип реквизита

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

Тип не совпадает — значение взято из текста редактирования, а не из реквизита

Поведение при пустом поле
Норма

Проверка ЗначениеЗаполнено() корректно отрабатывает

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

Код падает или считает по нулю без предупреждения

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

Как получить значение поля ввода, не связанного с реквизитом?

В управляемой форме такой сценарий лучше избегать: добавьте реквизит формы нужного типа и свяжите поле с ним через ПутьКДанным. В обычной форме можно прочитать ЭлементыФормы.ИмяПоля.Значение напрямую, но и там привязка к реквизиту надёжнее.

Почему в обработчике ПриИзменении значение пустое?

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

Как получить текст, который пользователь ещё набирает?

Используйте событие ИзменениеТекстаРедактирования — в его параметре Текст передаётся текущее содержимое поля на каждое нажатие клавиши. Реквизит в этот момент ещё не обновлён.

Можно ли получить значение поля другой формы?

Напрямую читать элементы чужой формы нельзя. Передавайте значения через параметры при открытии формы, через оповещения (Оповестить/ОбработкаОповещения) или через структуру, возвращаемую при закрытии формы.

Чем отличается ЭтаФорма.ИмяРеквизита от Объект.ИмяРеквизита?

Объект — это основной реквизит формы (например, редактируемый документ), а ЭтаФорма.ИмяРеквизита — реквизит, добавленный разработчиком на саму форму. Оба читаются в модуле формы, но хранятся в разных местах.

Итог

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

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