При разработке конфигураций на платформе 1С:Предприятие часто возникает задача ограничить ввод данных в определенные поля. Например, когда требуется, чтобы пользователь ввел числовой код (номер договора, ИНН, внутренний идентификатор), длина которого должна строго укладываться в диапазон от 8 до 10 символов. Если пользователь вводит слишком короткое или длинное число, система должна вовремя предупредить его об ошибке и заблокировать сохранение некорректных данных.
В этой статье мы подробно разберем, как правильно реализовать такое ограничение. Мы проанализируем различные подходы — от быстрой настройки свойств в конфигураторе до профессиональной программной валидации по стандартам БСП (Библиотеки Стандартных Подсистем). Также мы выясним, с какими скрытыми ловушками можно столкнуться при работе с числовыми типами данных и как их обойти.
Рассмотрим самый простой способ, который не требует написания кода. Платформа 1С позволяет задать ограничения непосредственно в свойствах числового реквизита. Выясним, как это сделать, на примере задачи «ввод от 8 до 10 символов».
Для числового поля количество символов напрямую связано с величиной самого числа. Если нам нужно ограничить ввод так, чтобы длина числа составляла от 8 до 10 знаков, мы можем перевести это требование в математический диапазон:
Разберем по шагам, как настроить эти свойства в конфигураторе:
Число.10 (так как это наш максимум).10000000.9999999999.Важный нюанс: этот метод отлично работает только в том случае, если реквизит является целым числом. Если у числового реквизита настроена точность (например, разрешены знаки после запятой), пользователь сможет ввести значение вроде 100000.05. Формально число будет меньше 10 миллионов, но из-за дробной части его визуальная длина составит 9 символов, что приведет к логической ошибке.
Кроме того, при выходе за границы диапазона платформа выдаст стандартную системную ошибку. Если вам требуется кастомизировать текст предупреждения для пользователя, этот способ не подойдет — придется использовать программные методы.
Теперь рассмотрим программный метод проверки. На первый взгляд, задача кажется тривиальной: достаточно преобразовать число в строку и проверить ее длину с помощью функции СтрДлина(). Посмотрим на классический пример такого кода, который часто пишут начинающие разработчики:
// Небезопасный код!
Если СтрДлина(Строка(Объект.НашРеквизит)) < 8 Или СтрДлина(Строка(Объект.НашРеквизит)) > 10 Тогда
Сообщить("Длина числа должна быть от 8 до 10 символов!");
КонецЕсли;
Проанализируем эту ситуацию глубже. В реальной работе этот код будет работать некорректно. Дело в том, что в 1С при неявном или явном преобразовании числа в строку платформа автоматически разделяет группы разрядов неразрывными пробелами (символ с кодом 160).
Например, если пользователь введет корректное восьмизначное число 12345678, функция Строка(12345678) вернет строковое значение "12 345 678" (с пробелами-разделителями). В результате функция СтрДлина() вернет значение 10 вместо ожидаемых 8. Это приведет к ложному срабатыванию проверки.
Чтобы избежать этой скрытой ошибки, при проверке длины числа необходимо полностью отключать группировку разрядов. Сделать это можно двумя надежными способами:
Вариант А: Использование функции Формат с отключением группировки (ЧГ=0)
// Принудительно отключаем группировку разрядов при преобразовании в строку
СтроковоеПредставление = Формат(Объект.НашРеквизит, "ЧГ=0");
ДлинаЧисла = СтрДлина(СтроковоеПредставление);
Вариант Б: Использование системной функции XMLСтрока
// Функция XMLСтрока всегда возвращает число в чистом виде без пробелов
СтроковоеПредставление = XMLСтрока(Объект.НашРеквизит);
ДлинаЧисла = СтрДлина(СтроковоеПредставление);
Оба этих варианта гарантируют получение точной физической длины введенного числа.
Выясним еще одну важную деталь, о которой часто забывают на этапе проектирования базы данных. Что произойдет, если пользователь попытается ввести код с лидирующими нулями, например, 00123456 (8 символов)?
Если ваш реквизит имеет тип данных Число, то при записи платформа 1С автоматически преобразует его к значению 123456, отбросив незначащие нули в начале. Длина числа мгновенно сократится до 6 символов, и проверка на минимальную длину (8 символов) не будет пройдена.
Правило разработки: Если для реквизита критически важно сохранять лидирующие нули (номера счетов, коды подразделений, штрихкоды), тип данных реквизита обязательно должен быть Строкой, а не Числом.
Для строковых реквизитов в 1С есть очень удобные инструменты ограничения ввода:
Если вам нужно заставить пользователя вводить только цифры длиной от 8 до 10 символов, можно использовать специальный символ маски 9 (означает, что разрешен ввод только цифры). Так как длина может варьироваться, в свойстве поля «Маска» можно перечислить допустимые маски через точку с запятой:
99999999;999999999;9999999999
Если вы работаете на современной платформе, то проверить строку на соответствие формату (только цифры и строго определенная длина) можно с помощью встроенного класса РегулярноеВыражение:
РегВыражение = Новый РегулярноеВыражение("^\d{8,10}$");
Если Не РегВыражение.Совпадает(Объект.НашРеквизит) Тогда
// Выдать ошибку пользователю
КонецЕсли;
Обычный вывод предупреждения через функцию Сообщить() имеет существенные недостатки: он не мешает пользователю записать некорректный документ или элемент справочника, а также не подсвечивает поле, в котором допущена ошибка.
По правилам разработки 1С (стандартам БСП), любые проверки корректности заполнения данных должны выполняться на сервере в модуле объекта. Это гарантирует, что ошибочные данные не попадут в базу данных ни при интерактивном вводе на форме, ни при программной загрузке из внешних систем (например, через Excel или веб-сервисы).
Разберем по шагам правильную реализацию проверки в модуле объекта с использованием обработчика ОбработкаПроверкиЗаполнения и объекта СообщениеПользователю:
ОбработкаПроверкиЗаполнения.Отказ = Истина и привяжет сообщение об ошибке непосредственно к элементу управления формы.Посмотрим на пример правильного кода в модуле объекта:
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
// 1. Очищаем пробелы группировки и вычисляем реальную длину числа
ДлинаРеквизита = СтрДлина(Формат(НашРеквизит, "ЧГ=0"));
// 2. Проверяем вхождение длины в диапазон от 8 до 10 символов
Если ДлинаРеквизита < 8 Или ДлинаРеквизита > 10 Тогда
// Блокируем запись объекта в базу данных
Отказ = Истина;
// 3. Выводим понятное интерактивное сообщение
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Поле должно содержать от 8 до 10 цифр (введено: " + ДлинаРеквизита + ")!";
// Привязываем сообщение к конкретному реквизиту на форме
Сообщение.Поле = "НашРеквизит";
Сообщение.УстановитьДанные(ЭтотОбъект);
// Отправляем сообщение пользователю
Сообщение.Сообщить();
КонецЕсли;
КонецПроцедуры
Благодаря использованию свойства Сообщение.Поле и метода УстановитьДанные(), платформа не просто выведет текст сообщения внизу экрана, но и автоматически выделит неверно заполненное поле на управляемой форме красным цветом, а также сфокусирует на нем внимание пользователя.
Подведем итоги нашего разбора. Выбор конкретного метода ограничения ввода в 1С зависит от специфики ваших данных:
00987654), обязательно используйте тип данных Строка в сочетании с маской ввода на форме.Формат() или XMLСтрока().ОбработкаПроверкиЗаполнения и используйте объект СообщениеПользователю.