При разработке документов в платформе 1С:Предприятие 7.7 разработчики нередко сталкиваются с ситуацией, когда в одной табличной части хранятся разнородные показатели. Например, реквизит табличной части имеет точность 2 знака после запятой, однако для части строк (в зависимости от выбранного показателя) требуется строго ограничить ввод одним знаком или вовсе запретить ввод сотых долей.
Проанализируем технические ограничения платформы и разберем проверенные способы решения этой задачи.
В архитектуре 1С:Предприятия 7.7 визуальная табличная часть жестко связана с метаданными документа. Формат редактирования, маска ввода и количество знаков после запятой задаются на уровне реквизита документа и действуют на всю колонку целиком. Штатные свойства управления интерфейсом (например, Форма.<ИмяКолонки>.Доступность()) также применяются ко всей колонке, а не к отдельным ячейкам.
Кроме того, в 1С 7.7 нет встроенного события «ПередНачаломРедактированияЯчейки», поэтому изменить формат маски прямо в процессе редактирования стандартного табличного поля штатными средствами невозможно. Рассмотрим практические варианты обхода этого ограничения.
Наиболее надежный штатный способ, исключающий возможность ввода пользователем лишних знаков, заключается в перехвате фокуса ячейки и вызове стандартной функции платформы ВвестиЧисло(). В этой функции можно динамически передавать требуемую точность в зависимости от текущего показателя строки.
Разберем реализацию по шагам:
Точность (число, задающее допустимое количество знаков).Посмотрим на пример кода функции в модуле формы документа:
Функция ВвестиЗначениеПоказателя()
Перем ВведенноеЧисло;
// Получаем требуемую точность из реквизита показателя текущей строки
ТочностьПоказателя = ТекущаяСтрока().Показатель.Точность;
Если ПустоеЗначение(ТочностьПоказателя) = 1 Тогда
ТочностьПоказателя = 2;
КонецЕсли;
ВведенноеЧисло = ТекущаяСтрока().Значение;
// Вызываем диалог ввода числа с динамической точностью
Если ВвестиЧисло(ВведенноеЧисло, "Введите значение показателя", 15, ТочностьПоказателя) = 1 Тогда
ТекущаяСтрока().Значение = ВведенноеЧисло;
КонецЕсли;
Возврат "";
КонецФункции
Такой подход полностью гарантирует, что пользователь физически не сможет напечатать больше одного знака после запятой для показателей с соответствующей настройкой.
Если требуется оставить редактирование непосредственно в таблице, можно перехватывать введенное значение через формулу колонки табличной части. Метод позволяет проверить остаток от деления и принудительно нормализовать число.
Разберем алгоритм проверки:
Функция ПриИзмененииЗначения()
ТекЗначение = ТекущаяСтрока().Значение;
ТекПоказатель = ТекущаяСтрока().Показатель;
// Проверяем условие, требует ли показатель точности в 1 знак
Если ТекПоказатель.Точность = 1 Тогда
// Проверяем, есть ли сотые доли
Если (ТекЗначение * 10) <> Цел(ТекЗначение * 10) Тогда
// Вариант А: Автоматическое округление
ТекущаяСтрока().Значение = Окр(ТекЗначение, 1);
Предупреждение("Для показателя """ + СокрЛП(ТекПоказатель) + """ допустим только 1 знак после запятой! Значение округлено.", 2);
КонецЕсли;
КонецЕсли;
Возврат "";
КонецФункции
В свойствах колонки реквизита в поле «Формула» указываем имя функции: ПриИзмененииЗначения(). При завершении редактирования ячейки платформа вызовет данную функцию, которая скорректирует число до десятых.
Когда филиалы заполняют и выгружают сводные документы, ключевой задачей является недопущение некорректных данных в базу. Для этого обработку данных выносят в предопределенную процедуру ПриЗаписи() модуля документа.
Посмотрим на пример обхода строк:
Процедура ПриЗаписи()
ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
Если Показатель.Точность = 1 Тогда
Если (Значение * 10) <> Цел(Значение * 10) Тогда
// Отсекаем или округляем значение
Значение = Окр(Значение, 1);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Если типового интерфейса недостаточно и требуется полноценное управление каждой ячейкой на уровне событий Windows, применяют внешние компоненты:
ПослеВходаВЯчейку() и ПослеРедактированияЯчейки()), позволяя перехватывать нажатия клавиш и маскировать ввод до фиксации значения.Выбор конкретного варианта зависит от требований: для строгой регламентации ввода без использования внешних библиотек оптимально подходит сочетание реквизита Точность в справочнике показателей с модальной функцией ВвестиЧисло() или формулой колонки.