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

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

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

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

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

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

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

Базовый способ: функция ВвестиЧисло()

Функция ВвестиЧисло() открывает модальное окно с полем ввода и возвращает Истина, если пользователь нажал «ОК», или Ложь, если нажал «Отмена». Само введённое значение записывается в переменную, переданную первым параметром. Синтаксис:

Число = 0;

Если ВвестиЧисло(Число, "Введите количество", 10, 2) Тогда

Сообщить("Вы ввели: " + Число);

Иначе

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

КонецЕсли;

Параметры функции: первый — переменная для результата, второй — текст подсказки в заголовке окна, третий — максимальная длина числа (количество разрядов), четвёртый — точность (число знаков после запятой). Если точность указать равной нулю, поле примет только целое число.

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

Современный способ: ПоказатьВводЧисла() с оповещением

Метод ПоказатьВводЧисла() решает ту же задачу, но не блокирует выполнение кода. Результат приходит позже — в отдельную процедуру, указанную через объект ОписаниеОповещения. Это единственный вариант, который корректно работает в веб-клиенте и при запрете модальности.

&НаКлиенте

Процедура ЗапроситьКоличество(Команда)

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

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

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

&НаКлиенте

Процедура ПослеВводаЧисла(Число, Параметры) Экспорт

Если Число = Неопределено Тогда

Возврат; // пользователь нажал «Отмена»

КонецЕсли;

Сообщить("Введено: " + Число);

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

Ключевое отличие в обработке отказа: здесь при нажатии «Отмена» в обработчик приходит не Ложь, а значение Неопределено. Проверка именно на Неопределено — обязательная первая строка процедуры-обработчика, иначе дальнейшие вычисления упадут с ошибкой преобразования типа.

Процедура-обработчик обязательно должна быть объявлена с ключевым словом Экспорт и находиться в том же модуле, который указан вторым параметром при создании описания оповещения (обычно ЭтотОбъект). Если забыть Экспорт, платформа не сможет вызвать процедуру и выдаст ошибку «Метод объекта не обнаружен».

Порядок действий для немодального ввода
  1. 1
    Создайте процедуру-обработчик с параметрами (Число, ДополнительныеПараметры) и пометьте её словом Экспорт
  2. 2
    В начале обработчика проверьте: Если Число = Неопределено Тогда Возврат
  3. 3
    В основной процедуре создайте ОписаниеОповещения с именем обработчика и ЭтотОбъект
  4. 4
    Вызовите ПоказатьВводЧисла с оповещением, значением по умолчанию, подсказкой, длиной и точностью
  5. 5
    Запустите форму в режиме предприятия и проверьте оба сценария: ввод значения и отмену

Альтернативы: ВвестиЗначение и Вопрос

Универсальная функция ВвестиЗначение() принимает описание типов, поэтому подходит, когда заранее неизвестно, что именно введёт пользователь, или когда нужно строго ограничить тип:

ОписаниеТипа = Новый ОписаниеТипов("Число",

Новый КвалификаторыЧисла(15, 2, ДопустимыйЗнак.Неотрицательный));

Значение = 0;

Если ВвестиЗначение(Значение, "Введите сумму", ОписаниеТипа) Тогда

// работаем с результатом

КонецЕсли;

Плюс этого варианта — квалификатор ДопустимыйЗнак.Неотрицательный: платформа сама не даст ввести отрицательное число, и отдельная проверка в коде не потребуется. Асинхронный аналог — ПоказатьВводЗначения() — работает по той же схеме с оповещением, что и ПоказатьВводЧисла().

Третий вариант — Вопрос() или ПоказатьВопрос() — подходит, когда число выбирается из фиксированного набора (например, «Сколько копий напечатать: 1, 2 или 3?»). Варианты передаются списком значений, а ответ возвращается как код выбранной кнопки. Это избавляет пользователя от ручного ввода и исключает опечатки.

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

ВвестиЧисло()

Простой синхронный код. Подходит для толстого клиента и старых конфигураций. Не работает при запрете модальности и в веб-клиенте.

ПоказатьВводЧисла()

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

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

Гибкая настройка через описание типов, включая запрет отрицательных чисел. Универсально, но код чуть объёмнее.

Вопрос() / ПоказатьВопрос()

Подходит для выбора из 2–5 фиксированных вариантов. Не подходит для произвольного числа.

Проверка результата и защита от ошибок

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

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

Если Число = Неопределено Тогда

Возврат;

ИначеЕсли Число <= 0 Тогда

ПоказатьПредупреждение(, "Количество должно быть больше нуля");

Возврат;

ИначеЕсли Число <> Цел(Число) Тогда

ПоказатьПредупреждение(, "Введите целое число");

Возврат;

КонецЕсли;

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

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

Нажатие «Отмена»
Норма

Код завершился без сообщений и без ошибок

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

Ошибка преобразования или расчёт выполнился со старым значением

Ввод нуля или отрицательного числа
Норма

Показано понятное предупреждение, расчёт не выполнен

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

Ноль ушёл в документ или деление на ноль

Ввод дробного числа при точности 2
Норма

Дробная часть сохранилась, формат отображения корректный

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

Число округлилось неожиданно для пользователя

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

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

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

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

Типичные ошибки
01
Проверка результата ПоказатьВводЧисла на Ложь вместо Неопределено — отмена ввода обрабатывается как успех
02
Вызов ВвестиЧисло в веб-клиенте или при запрете модальности — ошибка выполнения в режиме предприятия
03
Отсутствие слова Экспорт у процедуры-обработчика — ошибка «Метод объекта не обнаружен»
04
Вызов интерактивного ввода в серверной процедуре — ошибка о недопустимой операции на сервере
05
Отсутствие проверки диапазона — в документ уходит ноль или технически невозможное значение

Практические рекомендации по выбору

Для новых разработок и доработок типовых конфигураций используйте только асинхронные методы: ПоказатьВводЧисла() и ПоказатьВводЗначения(). Это соответствует стандартам разработки фирмы «1С» и гарантирует работу во всех клиентах, включая веб-клиент и мобильную платформу.

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

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

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

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

Конфигурация работает в веб-клиенте или с запретом модальностиИспользуйте ПоказатьВводЧисла с описанием оповещения
Нужно запретить отрицательные значения на уровне платформыИспользуйте ПоказатьВводЗначения с квалификатором Неотрицательный
Пользователь выбирает из 2–5 фиксированных вариантовИспользуйте ПоказатьВопрос со списком значений
Значение вводится регулярно и участвует в расчётахВынесите его в реквизит формы вместо диалогового окна
Старая внешняя обработка только для толстого клиентаДопустимо оставить ВвестиЧисло, но запланируйте замену

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

Что возвращает ВвестиЧисло, если пользователь нажал «Отмена»?

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

Почему ВвестиЧисло выдаёт ошибку в веб-клиенте?

Браузеры не поддерживают модальные диалоги в том виде, в каком они нужны платформе, поэтому синхронные модальные методы в веб-клиенте запрещены. Замените вызов на ПоказатьВводЧисла() с описанием оповещения — этот метод работает во всех клиентских приложениях.

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

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

Можно ли вызвать ввод числа в серверной процедуре?

Нет. Интерактивные операции доступны только на клиенте. Правильная схема: на клиенте запросить число через ПоказатьВводЧисла, в обработчике оповещения вызвать серверную процедуру и передать введённое значение обычным параметром.

Как задать значение по умолчанию в окне ввода?

Передайте нужное число в переменной-параметре (для ВвестиЧисло) или вторым параметром ПоказатьВводЧисла. Оно появится в поле ввода при открытии окна, и пользователь сможет просто нажать «ОК», если значение его устраивает.

Чем отличается ВвестиСтроку с последующим преобразованием от ВвестиЧисло?

ВвестиСтроку принимает любой текст, и преобразование в число придётся делать вручную с обработкой ошибок (буквы, пустая строка, разделитель дробной части). ВвестиЧисло делает это на уровне платформы: поле не примет нечисловые символы. Для ввода чисел всегда предпочтительнее специализированный метод.

Итог

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

Для ввода числа от пользователя в новых разработках используйте ПоказатьВводЧисла с описанием оповещения — это единственный вариант, работающий во всех клиентах. В обработчике первым делом проверяйте результат на Неопределено, затем — диапазон и целочисленность. Синхронный ВвестиЧисло оставляйте только для старого кода в толстом клиенте.