Как установить ограничение на длину ввода числового реквизита в 1С (от 8 до 10 символов)

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке конфигураций на платформе 1С:Предприятие часто возникает задача ограничить ввод данных в определенные поля. Например, когда требуется, чтобы пользователь ввел числовой код (номер договора, ИНН, внутренний идентификатор), длина которого должна строго укладываться в диапазон от 8 до 10 символов. Если пользователь вводит слишком короткое или длинное число, система должна вовремя предупредить его об ошибке и заблокировать сохранение некорректных данных.

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

Способ 1. Быстрая настройка диапазона допустимых значений в конфигураторе

Рассмотрим самый простой способ, который не требует написания кода. Платформа 1С позволяет задать ограничения непосредственно в свойствах числового реквизита. Выясним, как это сделать, на примере задачи «ввод от 8 до 10 символов».

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

  1. Минимальное 8-значное число — это 10 000 000. Любое число меньше этого (например, 9 999 999) будет иметь длину 7 символов или меньше.
  2. Максимальное 10-значное число — это 9 999 999 999. Любое число больше этого будет иметь длину 11 символов и более.

Разберем по шагам, как настроить эти свойства в конфигураторе:

  1. Откроем свойства нужного реквизита объекта (справочника или документа).
  2. Установим тип данных Число.
  3. В поле «Длина» укажем значение 10 (так как это наш максимум).
  4. Установим флажок «Неотрицательное», если знак «минус» не предполагается.
  5. Найдем свойства «Минимальное значение» и «Максимальное значение».
  6. В поле «Минимальное значение» введем 10000000.
  7. В поле «Максимальное значение» введем 9999999999.

Важный нюанс: этот метод отлично работает только в том случае, если реквизит является целым числом. Если у числового реквизита настроена точность (например, разрешены знаки после запятой), пользователь сможет ввести значение вроде 100000.05. Формально число будет меньше 10 миллионов, но из-за дробной части его визуальная длина составит 9 символов, что приведет к логической ошибке.

Кроме того, при выходе за границы диапазона платформа выдаст стандартную системную ошибку. Если вам требуется кастомизировать текст предупреждения для пользователя, этот способ не подойдет — придется использовать программные методы.

Способ 2. Программная проверка длины числа и скрытая ошибка группировки

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


// Небезопасный код!
Если СтрДлина(Строка(Объект.НашРеквизит)) < 8 Или СтрДлина(Строка(Объект.НашРеквизит)) > 10 Тогда
    Сообщить("Длина числа должна быть от 8 до 10 символов!");
КонецЕсли;

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

Например, если пользователь введет корректное восьмизначное число 12345678, функция Строка(12345678) вернет строковое значение "12 345 678" (с пробелами-разделителями). В результате функция СтрДлина() вернет значение 10 вместо ожидаемых 8. Это приведет к ложному срабатыванию проверки.

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

Вариант А: Использование функции Формат с отключением группировки (ЧГ=0)


// Принудительно отключаем группировку разрядов при преобразовании в строку
СтроковоеПредставление = Формат(Объект.НашРеквизит, "ЧГ=0");
ДлинаЧисла = СтрДлина(СтроковоеПредставление);

Вариант Б: Использование системной функции XMLСтрока


// Функция XMLСтрока всегда возвращает число в чистом виде без пробелов
СтроковоеПредставление = XMLСтрока(Объект.НашРеквизит);
ДлинаЧисла = СтрДлина(СтроковоеПредставление);

Оба этих варианта гарантируют получение точной физической длины введенного числа.

Способ 3. Проблема лидирующих нулей и переход к строковому типу

Выясним еще одну важную деталь, о которой часто забывают на этапе проектирования базы данных. Что произойдет, если пользователь попытается ввести код с лидирующими нулями, например, 00123456 (8 символов)?

Если ваш реквизит имеет тип данных Число, то при записи платформа 1С автоматически преобразует его к значению 123456, отбросив незначащие нули в начале. Длина числа мгновенно сократится до 6 символов, и проверка на минимальную длину (8 символов) не будет пройдена.

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

Для строковых реквизитов в 1С есть очень удобные инструменты ограничения ввода:

  1. Настройка маски ввода в свойствах поля формы.

    Если вам нужно заставить пользователя вводить только цифры длиной от 8 до 10 символов, можно использовать специальный символ маски 9 (означает, что разрешен ввод только цифры). Так как длина может варьироваться, в свойстве поля «Маска» можно перечислить допустимые маски через точку с запятой:

    99999999;999999999;9999999999

  2. Использование регулярных выражений (начиная с версии платформы 8.3.24).

    Если вы работаете на современной платформе, то проверить строку на соответствие формату (только цифры и строго определенная длина) можно с помощью встроенного класса РегулярноеВыражение:

    
    РегВыражение = Новый РегулярноеВыражение("^\d{8,10}$");
    Если Не РегВыражение.Совпадает(Объект.НашРеквизит) Тогда
        // Выдать ошибку пользователю
    КонецЕсли;
    

Способ 4. Профессиональная валидация по стандартам 1С (БСП)

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

По правилам разработки 1С (стандартам БСП), любые проверки корректности заполнения данных должны выполняться на сервере в модуле объекта. Это гарантирует, что ошибочные данные не попадут в базу данных ни при интерактивном вводе на форме, ни при программной загрузке из внешних систем (например, через Excel или веб-сервисы).

Разберем по шагам правильную реализацию проверки в модуле объекта с использованием обработчика ОбработкаПроверкиЗаполнения и объекта СообщениеПользователю:

  1. Откроем модуль нужного объекта конфигурации.
  2. Создадим (или найдем существующий) предопределенный обработчик события ОбработкаПроверкиЗаполнения.
  3. Напишем код проверки, который в случае ошибки установит флаг Отказ = Истина и привяжет сообщение об ошибке непосредственно к элементу управления формы.

Посмотрим на пример правильного кода в модуле объекта:


Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
	
	// 1. Очищаем пробелы группировки и вычисляем реальную длину числа
	ДлинаРеквизита = СтрДлина(Формат(НашРеквизит, "ЧГ=0"));
	
	// 2. Проверяем вхождение длины в диапазон от 8 до 10 символов
	Если ДлинаРеквизита < 8 Или ДлинаРеквизита > 10 Тогда
		
		// Блокируем запись объекта в базу данных
		Отказ = Истина; 
		
		// 3. Выводим понятное интерактивное сообщение
		Сообщение = Новый СообщениеПользователю;
		Сообщение.Текст = "Поле должно содержать от 8 до 10 цифр (введено: " + ДлинаРеквизита + ")!";
		
		// Привязываем сообщение к конкретному реквизиту на форме
		Сообщение.Поле = "НашРеквизит"; 
		Сообщение.УстановитьДанные(ЭтотОбъект);
		
		// Отправляем сообщение пользователю
		Сообщение.Сообщить();
		
	КонецЕсли;
	
КонецПроцедуры

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

Резюме и рекомендации

Подведем итоги нашего разбора. Выбор конкретного метода ограничения ввода в 1С зависит от специфики ваших данных:

← На главную