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

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

Как ввести строку в 1С: способы ввода для пользователя и разработчика

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

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

Для пользователя ввод строки — это обычная работа с полем ввода: щёлкнуть в поле, набрать текст, подтвердить ввод клавишей Enter или переходом к следующему элементу. Для программиста 1С ввод строки означает вызов диалога ввода значения, обработку результата и валидацию полученных данных перед записью в базу.

Ниже разобраны оба сценария: как ввести строку в интерфейсе программы, как запросить строку из кода с помощью ВвестиСтроку и современных асинхронных методов, какие ограничения существуют в разных клиентах и как проверить корректность введённого значения.

Ввод строки в интерфейсе программы

В типовых конфигурациях 1С текстовые поля встречаются повсюду: наименование контрагента, комментарий к документу, адрес доставки, артикул. Чтобы ввести строку, установите курсор в поле ввода (одинарный щелчок мыши или переход клавишей Tab), наберите текст и подтвердите ввод клавишей Enter либо переходом к другому полю. Пока фокус остаётся в поле, значение считается редактируемым и ещё не зафиксировано в объекте.

Если поле отображает серую подсказку вроде «Укажите наименование», это не значение, а подсказка ввода — она исчезнет при первом нажатии клавиши. Если поле недоступно (затемнено), значит, оно заблокировано настройками формы, правами доступа или логикой конфигурации: например, реквизит заполняется автоматически и редактирование запрещено.

Многострочные поля (комментарии, описания) позволяют переносить строки. Перевод строки внутри такого поля обычно выполняется сочетанием Ctrl+Enter или просто Enter — зависит от настроек поля. Если Enter завершает редактирование вместо переноса строки, используйте Ctrl+Enter.

Программный запрос строки: метод ВвестиСтроку

Во встроенном языке 1С для запроса строки у пользователя существует метод ВвестиСтроку. Он открывает модальное окно с полем ввода и возвращает Истина, если пользователь подтвердил ввод, или Ложь при отмене. Введённое значение помещается в переменную, переданную первым параметром.

Строка = "";

Если ВвестиСтроку(Строка, "Введите комментарий", 200, Ложь) Тогда

Сообщить("Введено: " + Строка);

Иначе

Сообщить("Ввод отменён");

КонецЕсли;

Параметры метода: переменная для результата, текст подсказки в заголовке диалога, максимальная длина строки и признак многострочности. Если четвёртый параметр установить в Истина, пользователь сможет вводить текст в несколько строк. Метод выполняется только на клиенте — вызов на сервере приведёт к ошибке, потому что у серверного кода нет пользовательского интерфейса.

Модальный вызов ВвестиСтроку блокирует интерфейс до ответа пользователя. В управляемых формах и веб-клиенте модальные окна ограничены или запрещены настройками конфигурации (свойство «Режим использования модальности»), поэтому в современных разработках применяют асинхронный вариант.

1c
Если ВвестиСтроку(Строка, "Введите значение", 100, Ложь) Тогда
    // обработка строки
КонецЕсли;

Асинхронный ввод: ПоказатьВводСтроки

Метод ПоказатьВводСтроки выполняет ту же задачу, но не останавливает выполнение программы: результат приходит в описание оповещения — отдельную процедуру, которая сработает после закрытия диалога. Это рекомендуемый способ для управляемых форм, тонкого и веб-клиента.

&НаКлиенте

Процедура КомандаВвестиСтроку(Команда)

Оповещение = Новый ОписаниеОповещения("ПослеВводаСтроки", ЭтотОбъект);

ПоказатьВводСтроки(Оповещение, "", "Введите наименование", 150, Ложь);

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

&НаКлиенте

Процедура ПослеВводаСтроки(Результат, ДополнительныеПараметры) Экспорт

Если Результат <> Неопределено Тогда

Объект.Наименование = Результат;

КонецЕсли;

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

Если пользователь нажал «Отмена», в обработчик приходит Неопределено, а не пустая строка — это важное отличие, которое нужно учитывать при проверке результата. Сравнение с пустой строкой в этом случае даст ложное срабатывание логики, поэтому всегда проверяйте именно на Неопределено.

Порядок действий при асинхронном вводе
  1. 1
    Создайте описание оповещения с именем процедуры-обработчика
  2. 2
    Вызовите ПоказатьВводСтроки с подсказкой и ограничением длины
  3. 3
    В обработчике проверьте результат на Неопределено
  4. 4
    Проверьте строку на пустоту функцией ПустаяСтрока
  5. 5
    Присвойте значение реквизиту объекта и при необходимости установите признак модифицированности

Ввод других типов значений через строку

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

Оповещение = Новый ОписаниеОповещения("ПослеВводаЧисла", ЭтотОбъект);

ПоказатьВводЗначения(Оповещение, 0, "Введите количество", "Число");

Если всё же приходится преобразовывать строку в число вручную, используйте конструкцию Число() внутри попытки: при невозможности преобразования возникает исключение, которое нужно перехватить и сообщить пользователю о неверном формате. Не оставляйте преобразование без обработки ошибок — необработанное исключение прервёт выполнение всей процедуры.

Сравнение способов ввода

ВвестиСтроку

Простой синхронный вызов. Подходит для обычных форм и отладки, но блокирует интерфейс и может быть запрещён настройками модальности.

ПоказатьВводСтроки

Асинхронный вариант для управляемых форм, тонкого и веб-клиента. Требует отдельной процедуры-обработчика, но не блокирует интерфейс.

ПоказатьВводЗначения

Когда нужен конкретный тип (число, дата, ссылка). Платформа сама контролирует формат ввода.

Проверка и обработка введённой строки

Любое значение, полученное от пользователя, нужно проверить перед использованием. Минимальный набор проверок: строка не пуста (ПустаяСтрока), длина не превышает длину целевого реквизита (СтрДлина), при необходимости — отсутствие недопустимых символов. Для удаления лишних пробелов по краям применяйте СокрЛП — пользователи часто вводят пробелы случайно, и «Иванов » с пробелом будет отличаться от «Иванов» при поиске.

Значение = СокрЛП(Результат);

Если ПустаяСтрока(Значение) Тогда

ПоказатьПредупреждение(, "Строка не может быть пустой");

Возврат;

КонецЕсли;

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

Типичные ошибки
01
Проверка результата асинхронного ввода на пустую строку вместо Неопределено — отмена ввода обрабатывается как успешный ввод
02
Вызов ВвестиСтроку в серверном коде — ошибка выполнения, так как на сервере нет интерфейса
03
Игнорирование ограничения длины реквизита — строка молча обрезается при записи
04
Отсутствие СокрЛП — поиск и сравнение строк дают ложные несовпадения из-за пробелов

Ограничения в разных клиентах и режимах

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

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

Маршрут решения

Как выбрать способ ввода

Конфигурация на обычных формах или код для отладкиИспользуйте ВвестиСтроку — это проще и короче
Управляемые формы, тонкий или веб-клиентИспользуйте ПоказатьВводСтроки с описанием оповещения
Нужно число, дата или ссылка, а не произвольный текстИспользуйте ПоказатьВводЗначения с указанием типа
Код выполняется на сервереПеренесите интерактивный ввод в клиентскую процедуру

Как проверить, что ввод сработал правильно

После ввода строки в интерфейсе убедитесь, что значение отображается в поле полностью, без обрезки, и сохраняется после записи объекта: закройте и заново откройте форму — значение должно остаться. Если после перезаписи строка исчезла или обрезалась, проверьте длину реквизита в конфигураторе и права на его изменение.

При программном вводе проверьте логику по шагам: диалог открылся, в обработчик пришло значение (не Неопределено), после СокрЛП строка не пуста, реквизит объекта изменился, объект записан без ошибок. Временный вывод через Сообщить или точку останова в отладчике помогает локализовать, на каком шаге значение теряется.

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

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

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

Строка отображается полностью и сохраняется после записи

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

Текст обрезан или пропадает после переоткрытия формы

Результат в обработчике оповещения
Норма

Приходит введённая строка или Неопределено при отмене

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

Обработчик не вызывается — ошибка в имени процедуры оповещения

Поиск по введённой строке
Норма

Элемент находится после СокрЛП и единого регистра

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

Поиск не находит очевидно существующее значение

Итог

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

В интерфейсе строка вводится в поле ввода и подтверждается Enter. В коде для управляемых форм используйте ПоказатьВводСтроки с проверкой результата на Неопределено, а модальный ВвестиСтроку оставьте для обычных форм. Всегда очищайте строку через СокрЛП и проверяйте длину целевого реквизита.

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

Почему ВвестиСтроку выдаёт ошибку «Интерактивные операции недоступны»?

Код выполняется в контексте, где нет пользовательского интерфейса: на сервере, в фоновом задании или при отключённой модальности. Перенесите вызов в клиентскую процедуру формы и используйте асинхронный ПоказатьВводСтроки.

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

Третьим параметром методов ВвестиСтроку и ПоказатьВводСтроки передаётся максимальная длина — платформа не даст ввести больше символов. Дополнительно убедитесь, что длина реквизита в конфигураторе не меньше этого значения, иначе строка обрежется при записи.

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

При асинхронном вводе отмена возвращает Неопределено, а пустой ввод с подтверждением — пустую строку. Проверяйте сначала «Результат = Неопределено» для отмены, затем ПустаяСтрока(Результат) для пустого значения.

Можно ли ввести многострочный текст через диалог ввода?

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

Почему введённая строка не находится при поиске в справочнике?

Чаще всего причина в пробелах по краям или разном регистре символов. Применяйте СокрЛП к обеим сравниваемым строкам и приводите их к одному регистру через ВРег или НРег перед сравнением.

Как ввести строку в мобильном клиенте 1С?

Логика та же, что и в веб-клиенте: только асинхронные методы ПоказатьВводСтроки и ПоказатьВводЗначения. Модальные вызовы в мобильной платформе не поддерживаются, поэтому весь интерактивный ввод оформляйте через описания оповещений.