В процессе разработки конфигураций на платформе 1С часто возникают задачи, требующие нестандартного ограничения прав пользователя. Одна из таких специфических задач — разрешить бухгалтеру или менеджеру корректировать только «копейки» (дробную часть) в сумме, оставляя целую часть неизменной. В этой статье мы подробно разберем, как реализовать такой функционал, используя штатные возможности управляемых форм, не прибегая к сложным доработкам архитектуры данных.
Штатного свойства, которое позволяло бы «блокировать целую часть числа», в платформе 1С не существует. Однако, комбинируя свойства элементов управления и программный код, мы можем достичь желаемого поведения. Основная цель — дать пользователю инструмент для точечного изменения значения с шагом, например, 0.01, и при этом исключить вероятность случайного или намеренного ввода произвольного числа с клавиатуры.
Наиболее эффективным и лаконичным способом решения данной задачи является использование встроенного механизма КнопкаРегулирования. Этот инструмент позволяет организовать изменение значения в поле ввода через нажатие стрелок вверх/вниз.
Чтобы реализовать этот подход, выполним следующие шаги:
ТабличнойЧасти.КнопкаВыбора = Ложь (скрываем ненужную кнопку выбора).КнопкаРегулирования = Истина (активируем стрелки регулирования).РедактированиеТекста = Ложь (самый важный пункт — именно он запрещает пользователю вводить числа вручную с клавиатуры).Регулирование для данного элемента.После того как мы заблокировали возможность прямого ввода, нам необходимо описать логику изменения числа при нажатии на стрелки регулирования. Рассмотрим пример кода, который позволяет менять дробную часть, не затрагивая целую, с учетом границ диапазона (чтобы избежать некорректных значений):
&НаКлиенте
Процедура СуммаРегулирование(Элемент, Направление, СтандартнаяОбработка)
// Получаем текущее значение из данных строки
СуммаИзменения = Элементы.ВашаТабличнаяЧасть.ТекущиеДанные.Сумма;
// Извлекаем последнюю цифру дробной части для контроля
// Преобразуем в строку для анализа
Цифра = Прав(Строка(СуммаИзменения), 1);
Если Направление = 1 Тогда // Нажата стрелка ВВЕРХ
Если Цифра <> "9" Тогда
Элементы.ВашаТабличнаяЧасть.ТекущиеДанные.Сумма = СуммаИзменения + 0.01;
КонецЕсли;
ИначеЕсли Направление = -1 Тогда // Нажата стрелка ВНИЗ
Если Цифра <> "0" Тогда
Элементы.ВашаТабличнаяЧасть.ТекущиеДанные.Сумма = СуммаИзменения - 0.01;
КонецЕсли;
КонецЕсли;
// Отменяем стандартную обработку, так как мы полностью управляем процессом
СтандартнаяОбработка = Ложь;
КонецПроцедуры
При внедрении данного решения стоит обратить внимание на несколько технических нюансов:
1. Работа с типами данных: Использование математических операций с дробными числами типа 0.01 может привести к накоплению погрешности плавающей запятой. Если расчеты в вашей конфигурации критически зависят от точности, рекомендуем использовать функцию Окр(Значение, 2) при записи результата обратно в реквизит.
2. Удобство пользователя: Отключение РедактированиеТекста делает невозможным копирование суммы из буфера обмена. Если бухгалтеру необходимо иногда вставлять значения из Excel, рассмотрите вариант создания дополнительной команды (кнопки) или специального режима «разблокировки» редактирования для администратора.
3. Альтернативный подход: Если задача усложняется и требуется не просто «подгонять копейки», а разделять визуально целую и дробную части, рассмотрите вариант использования фиктивного реквизита формы. В таком случае в таблице отображается два поля: «Целая часть» (доступна только для чтения) и «Дробная часть» (редактируемое поле). При завершении редактирования данные программно объединяются в исходный реквизит типа Число.
Применение описанного выше метода с КнопкойРегулирования — это оптимальный баланс между сложностью реализации и итоговым удобством для пользователя. Мы избавили систему от ошибок ввода, сохранив при этом необходимую гибкость для завершающей корректировки документов.