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