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

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

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

Как получить значение из поля ввода в 1С: обращение к реквизиту формы, обработчики ПриИзменении и ПриОкончанииВводаТекста, проверка и преобразование данных.

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

Задача возникает в типовых сценариях: пользователь ввёл артикул, количество, комментарий или период, а код должен забрать это значение, проверить его и передать дальше — в запрос, в документ, в обработку. Ниже разобраны способы чтения значения, обработчики событий поля ввода, преобразование типов и типичные ошибки, из-за которых значение «теряется» между клиентом и сервером.

Где хранится значение поля ввода

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

Чтобы узнать, к какому реквизиту привязано поле, откройте форму в конфигураторе, выделите элемент и посмотрите свойство «ПутьКДанным». Если там указано, например, «Объект.Комментарий», значение читается как Объект.Комментарий. Если указан реквизит формы «СтрокаПоиска» — обращайтесь через ЭтаФорма.СтрокаПоиска или просто по имени реквизита в модуле формы.

Как прочитать значение реквизита в коде

Самый простой случай — кнопка «Выполнить», при нажатии на которую нужно забрать введённое значение. В обработчике команды обращайтесь к реквизиту напрямую:

&НаКлиенте

Процедура ВыполнитьПоиск(Команда)

СтрокаДляПоиска = ЭтаФорма.СтрокаПоиска;

Если ПустаяСтрока(СтрокаДляПоиска) Тогда

Сообщить("Введите строку поиска");

Возврат;

КонецЕсли;

ВыполнитьПоискНаСервере(СтрокаДляПоиска);

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

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

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

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

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

ПриИзменении

Событие срабатывает, когда пользователь завершил редактирование и значение уже записано в реквизит. Внутри обработчика читайте реквизит формы — он уже содержит актуальные данные:

&НаКлиенте

Процедура КоличествоПриИзменении(Элемент)

Если ЭтаФорма.Количество < 0 Тогда

Сообщить("Количество не может быть отрицательным");

ЭтаФорма.Количество = 0;

КонецЕсли;

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

ПриОкончанииВводаТекста

Событие удобно, когда нужно обработать введённый текст до его записи в реквизит: например, подобрать товар по штрихкоду или артикулу. Текст передаётся в параметре Текст, а через параметр ДанныеВыбора можно подменить результат:

&НаКлиенте

Процедура ТоварПриОкончанииВводаТекста(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, СтандартнаяОбработка)

Если СтрДлина(Текст) = 13 Тогда

СтандартнаяОбработка = Ложь;

ДанныеВыбора = НайтиПоШтрихкодуНаСервере(Текст);

КонецЕсли;

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

ИзменениеТекстаРедактирования

Событие срабатывает на каждое изменение текста в процессе набора, ещё до записи в реквизит. Текущий набираемый текст доступен в параметре Текст. Используйте его для «живого» поиска и автоподбора, но не для тяжёлых операций — обработчик вызывается на каждое нажатие клавиши.

Сравнение вариантов

ПриИзменении

Подходит для реакции на готовое значение: валидация, пересчёт итогов. Срабатывает после записи в реквизит, не ловит процесс набора.

ПриОкончанииВводаТекста

Подходит для обработки введённого текста до записи: поиск по штрихкоду, подмена выбора. Не сработает при выборе из списка без ввода.

ИзменениеТекстаРедактирования

Подходит для живого поиска и автоподбора при наборе. Срабатывает на каждый символ, поэтому тяжёлые серверные вызовы недопустимы.

Передача значения на сервер

Клиентский код управляемой формы не имеет прямого доступа к базе данных, поэтому полученное из поля ввода значение обычно передаётся в серверную процедуру. Правила простые: серверная процедура объявляется с директивой &НаСервере или &НаСервереБезКонтекста, а параметры должны быть сериализуемых типов — строки, числа, даты, ссылки, структуры.

&НаСервереБезКонтекста

Процедура ВыполнитьПоискНаСервере(СтрокаПоиска)

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура

|ГДЕ Наименование ПОДОБНО &Шаблон";

Запрос.УстановитьПараметр("Шаблон", "%" + СтрокаПоиска + "%");

// обработка результата

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

Директива БезКонтекста предпочтительнее, если процедуре не нужны данные формы целиком: на сервер не пересылается вся форма, вызов работает быстрее. Но из такой процедуры нельзя обратиться к реквизитам формы — все нужные значения передавайте параметрами.

Порядок действий
  1. 1
    Откройте форму в конфигураторе и найдите нужное поле ввода
  2. 2
    Посмотрите свойство «ПутьКДанным» — запомните имя реквизита
  3. 3
    В нужном обработчике (команда или ПриИзменении) прочитайте реквизит по имени
  4. 4
    Проверьте значение на пустоту и соответствие типу
  5. 5
    Передайте значение параметром в серверную процедуру и проверьте результат

Проверка и преобразование введённых данных

Пользователь может ввести пустую строку, пробелы или текст там, где ожидается число. Прежде чем использовать значение, выполните базовые проверки.

Для строк применяйте ПустаяСтрока() вместе с СокрЛП() — она считает пустой и строку из одних пробелов. Для чисел полезна функция СтроковыеФункцииКлиентСервер.СтрокаВЧисло (в типовых конфигурациях) либо конструкция с попыткой: ОписаниеТипа = Новый ОписаниеТипа("Число"); Число = ОписаниеТипа.ПривестиЗначение(Строка). Тип поля ввода можно ограничить заранее — задайте реквизиту нужный тип в конфигураторе, тогда платформа сама не даст ввести буквы в числовое поле.

Для ссылочных полей (выбор элемента справочника) проверяйте ЗначениеЗаполнено(Ссылка) — оно ложно для пустой ссылки, пустой строки, нуля и неопределённой даты.

Типичные ошибки и их причины

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

Вторая ошибка — обращение к элементу формы вместо реквизита: Элементы.ПолеВвода1.Значение в управляемой форме. У элемента нет такого свойства, возникает ошибка «Поле объекта не обнаружено».

Третья группа проблем связана с разделением клиента и сервера: попытка прочитать реквизит формы в процедуре &НаСервереБезКонтекста закончится ошибкой компиляции, потому что контекста формы там нет. Передавайте значение параметром.

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

Проверка результата и отладка

Быстрый способ убедиться, что значение читается правильно, — временно вывести его через Сообщить() или использовать отладчик конфигуратора: поставьте точку останова в обработчике и посмотрите значение реквизита в табло. Если в отладчике реквизит пуст, а в поле на форме текст есть — значит, поле не связано с реквизитом или связано с другим.

Также проверьте, что у поля ввода не сброшено свойство «Доступность» и не установлено «ТолькоПросмотр» — в этих случаях пользователь не сможет ввести данные, и реквизит останется пустым.

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

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

Свойство «ПутьКДанным» у поля ввода
Норма

Указан существующий реквизит формы или объекта

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

Свойство пустое или указывает на несуществующий реквизит

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

Реквизит содержит введённые данные

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

Реквизит пуст — поле не связано с реквизитом

Передача значения на сервер
Норма

Серверная процедура получает параметр с корректным значением

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

На сервере значение пустое — ошибка в имени параметра или директиве

Часто задаваемые вопросы

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

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

Почему в управляемой форме нельзя написать Элементы.Поле.Значение?

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

Как получить значение из поля ввода табличной части?

Обратитесь к текущей строке таблицы: Элементы.ИмяТаблицы.ТекущиеДанные.ИмяКолонки. В обработчике ПриИзменении колонки текущие данные уже содержат новое значение. На сервере работайте с коллекцией напрямую — Объект.ИмяТабличнойЧасти[Индекс].ИмяКолонки.

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

Задайте реквизиту, к которому привязано поле, тип «Число» в конфигураторе — платформа не даст ввести буквы. Дополнительно можно настроить квалификаторы числа (длину и точность) и свойство «МинимальноеЗначение»/«МаксимальноеЗначение» у элемента формы.

Чем отличается чтение значения в обычной форме от управляемой?

В обычной форме у элемента управления есть свойство «Значение», и обращение ЭлементыФормы.ПолеВвода1.Значение работает. В управляемой форме такого свойства нет — данные читаются только через реквизит из «ПутьКДанным». При переносе кода из обычных форм это самая частая правка.

Как передать введённое значение в другую форму?

Через параметры открываемой формы: сформируйте структуру параметров и передайте её в ОткрытьФорму("ИмяФормы", Параметры). В открываемой форме значение будет доступно через объект Параметры в обработчике ПриСозданииНаСервере. Альтернатива — Оповестить() для передачи данных в уже открытые формы.

Итог

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

Значение поля ввода в управляемой форме 1С хранится в реквизите из свойства «ПутьКДанным» — читайте его, а не сам элемент. Для реакции на ввод используйте ПриИзменении, ПриОкончанииВводаТекста или ИзменениеТекстаРедактирования, всегда проверяйте значение на пустоту и передавайте на сервер параметрами.