В разработке интерфейсов на платформе 1С:Предприятие часто возникает задача ограничить ввод данных определенным правилом. Одной из таких задач является требование вводить только числа, кратные определенному значению (например, 10). Это может быть актуально для указания количества товара в упаковках, задания интервалов времени или настройки процентов. Рассмотрим подробнее несколько способов реализации этой задачи, начиная от простых настроек свойств формы и заканчивая программной обработкой событий. Для быстрого изменения свойств и интерактивного тестирования элементов управляемой формы непосредственно в режиме 1С:Предприятие можно использовать инструмент для редактирования свойств открытых форм.
Проанализируем самый простой и интуитивно понятный для пользователя вариант. Если диапазон вводимых чисел невелик (например, от 0 до 60 или 100), мы можем полностью исключить возможность ручного набора текста, оставив пользователю только кнопки «вверх» и «вниз». Это гарантирует, что в поле никогда не попадет «мусорное» значение.
Разберем по шагам, как это реализовать:
КнопкаРегулирования.РедактированиеТекста. Теперь пользователь не сможет печатать в поле, а будет только нажимать на стрелки.Регулирование для этого поля.Посмотрим на пример кода, который обеспечит шаг изменения значения равным 10:
&НаКлиенте
Процедура КоличествоСекундРегулирование(Элемент, Направление, СтандартнаяОбработка)
// Отключаем стандартное поведение (изменение на 1)
СтандартнаяОбработка = Ложь;
// Направление = 1 (вверх), Направление = -1 (вниз)
Если Направление = 1 Тогда
Объект.КоличествоСекунд = Объект.КоличествоСекунд + 10;
Иначе
Объект.КоличествоСекунд = Объект.КоличествоСекунд - 10;
КонецЕсли;
// Дополнительно можно добавить проверку на минимальное значение
Если Объект.КоличествоСекунд < 0 Тогда
Объект.КоличествоСекунд = 0;
КонецЕсли;
КонецПроцедуры
Данный метод идеален, если значения ограничены небольшим пределом. Однако, если пользователю нужно ввести число 3000, нажимать на кнопку 300 раз будет неудобно. В этом случае рассмотрим другие варианты.
Если нам нужно разрешить пользователю печатать число вручную, но при этом автоматически корректировать его до кратного 10, лучше всего использовать событие ОкончаниеВводаТекста или ПриИзменении. Выясним причину, по которой ОкончаниеВводаТекста часто предпочтительнее: оно срабатывает один раз после завершения редактирования, не прерывая процесс набора каждой цифры.
Рассмотрим алгоритм округления:
&НаКлиенте
Процедура МоеПолеОкончаниеВводаТекста(Элемент, Текст, Значение, СтандартнаяОбработка)
// Преобразуем введенный текст в число
ЧисловоеЗначение = Число(Текст);
// Округляем до десятков. Функция Окр с параметром -1 округляет до 10.
// Например: 14 станет 10, 16 станет 20.
Результат = Окр(ЧисловоеЗначение, -1);
// Устанавливаем итоговое значение обратно в поле
Значение = Результат;
КонецПроцедуры
Стоит учитывать математические нюансы округления. В 1С используется стандартное правило: 0.5 округляется в большую сторону. Если ваша бизнес-логика требует всегда округлять вверх (например, любая часть упаковки считается как целая упаковка), используйте следующую формулу:
Цел((Число + 9) / 10) * 10
Если допустимых значений совсем немного, проанализируем ситуацию с использованием выпадающего списка. Это максимально ограничивает пользователя, не давая ему совершить ошибку.
РежимВыбораИзСписка в значение Истина.ПриСозданииНаСервере заполните список доступными значениями.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Для Счетчик = 0 По 6 Цикл
Элементы.МоеПоле.СписокВыбора.Добавить(Счетчик * 10);
КонецЦикла;
КонецПроцедуры
В этом случае поле превратится в выпадающий список с вариантами: 0, 10, 20, 30, 40, 50, 60. Пользователь просто выбирает нужное из списка.
Важно понимать, что все вышеперечисленные способы работают только на уровне интерфейса формы. Если данные в это поле могут попасть программно (например, через загрузку из Excel или внешнее API), проверка на форме не сработает. Проанализируем, как защитить данные на уровне базы данных.
Для этого необходимо добавить проверку в модуле объекта (справочника или документа) в процедуре ПередЗаписью или ОбработкаПроверкиЗаполнения.
Процедура ПередЗаписью(Отказ)
// Проверяем кратность 10 через остаток от деления
Если Количество % 10 <> 0 Тогда
Сообщить("Значение поля 'Количество' должно быть кратно 10!");
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Использование оператора % (остаток от деления) — это самый надежный технический способ проверки кратности в языке 1С.
Чтобы работа пользователя была комфортной, рекомендуем обратить внимание на следующие детали:
ПодсказкаВвода, напишите там: «Введите число, кратное 10». Это снимет лишние вопросы у пользователя.АвтоПодбор, чтобы при вводе цифры «2» система сразу предлагала вариант «20».990. Однако это жесткое ограничение, которое может мешать при вводе чисел разной разрядности.ПолосаРегулирования, установив шаг равным 10.Подведем итог: выбор метода зависит от диапазона значений. Если диапазон мал — используйте Список выбора или Кнопки регулирования с запретом текста. Если диапазон велик — используйте программное округление в событии ОкончаниеВводаТекста и обязательно дублируйте проверку в Модуле объекта для надежности.