Как настроить разную точность числа для отдельных строк в табличной части 1С 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При разработке документов в платформе 1С:Предприятие 7.7 разработчики нередко сталкиваются с ситуацией, когда в одной табличной части хранятся разнородные показатели. Например, реквизит табличной части имеет точность 2 знака после запятой, однако для части строк (в зависимости от выбранного показателя) требуется строго ограничить ввод одним знаком или вовсе запретить ввод сотых долей.

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

Причина ограничения платформы

В архитектуре 1С:Предприятия 7.7 визуальная табличная часть жестко связана с метаданными документа. Формат редактирования, маска ввода и количество знаков после запятой задаются на уровне реквизита документа и действуют на всю колонку целиком. Штатные свойства управления интерфейсом (например, Форма.<ИмяКолонки>.Доступность()) также применяются ко всей колонке, а не к отдельным ячейкам.

Кроме того, в 1С 7.7 нет встроенного события «ПередНачаломРедактированияЯчейки», поэтому изменить формат маски прямо в процессе редактирования стандартного табличного поля штатными средствами невозможно. Рассмотрим практические варианты обхода этого ограничения.

Способ 1. Программный ввод через модальное окно «ВвестиЧисло»

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

Разберем реализацию по шагам:

  1. В метаданных документа оставляем реквизит с максимальной необходимой точностью (2 знака).
  2. В свойствах колонки на форме документа делаем ячейку недоступной для прямого редактирования или назначаем в поле Формула пользовательскую функцию обработки нажатия.
  3. В справочник показателей добавляем реквизит Точность (число, задающее допустимое количество знаков).
  4. При попытке изменения значения открываем диалог ввода нужной разрядности.

Посмотрим на пример кода функции в модуле формы документа:


Функция ВвестиЗначениеПоказателя()
    Перем ВведенноеЧисло;
    
    // Получаем требуемую точность из реквизита показателя текущей строки
    ТочностьПоказателя = ТекущаяСтрока().Показатель.Точность;
    Если ПустоеЗначение(ТочностьПоказателя) = 1 Тогда
        ТочностьПоказателя = 2;
    КонецЕсли;
    
    ВведенноеЧисло = ТекущаяСтрока().Значение;
    
    // Вызываем диалог ввода числа с динамической точностью
    Если ВвестиЧисло(ВведенноеЧисло, "Введите значение показателя", 15, ТочностьПоказателя) = 1 Тогда
        ТекущаяСтрока().Значение = ВведенноеЧисло;
    КонецЕсли;
    
    Возврат "";
КонецФункции

Такой подход полностью гарантирует, что пользователь физически не сможет напечатать больше одного знака после запятой для показателей с соответствующей настройкой.

Способ 2. Контроль и округление в формуле колонки

Если требуется оставить редактирование непосредственно в таблице, можно перехватывать введенное значение через формулу колонки табличной части. Метод позволяет проверить остаток от деления и принудительно нормализовать число.

Разберем алгоритм проверки:


Функция ПриИзмененииЗначения()
    ТекЗначение = ТекущаяСтрока().Значение;
    ТекПоказатель = ТекущаяСтрока().Показатель;
    
    // Проверяем условие, требует ли показатель точности в 1 знак
    Если ТекПоказатель.Точность = 1 Тогда
        // Проверяем, есть ли сотые доли
        Если (ТекЗначение * 10) <> Цел(ТекЗначение * 10) Тогда
            // Вариант А: Автоматическое округление
            ТекущаяСтрока().Значение = Окр(ТекЗначение, 1);
            Предупреждение("Для показателя """ + СокрЛП(ТекПоказатель) + """ допустим только 1 знак после запятой! Значение округлено.", 2);
        КонецЕсли;
    КонецЕсли;
    
    Возврат "";
КонецФункции

В свойствах колонки реквизита в поле «Формула» указываем имя функции: ПриИзмененииЗначения(). При завершении редактирования ячейки платформа вызовет данную функцию, которая скорректирует число до десятых.

Способ 3. Валидация и отсечение лишних знаков при записи

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

Посмотрим на пример обхода строк:


Процедура ПриЗаписи()
    ВыбратьСтроки();
    Пока ПолучитьСтроку() = 1 Цикл
        Если Показатель.Точность = 1 Тогда
            Если (Значение * 10) <> Цел(Значение * 10) Тогда
                // Отсекаем или округляем значение
                Значение = Окр(Значение, 1);
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Способ 4. Использование внешних компонент (1С++ и FormEx)

Если типового интерфейса недостаточно и требуется полноценное управление каждой ячейкой на уровне событий Windows, применяют внешние компоненты:

  1. ТабличноеПоле (1С++): Заменяет стандартную таблицу на полноценный табличный контрол, где для каждой строки и ячейки можно программно задавать формат, цвет, доступность и маску ввода.
  2. FormEx: Предоставляет низкоуровневые события формы (например, ПослеВходаВЯчейку() и ПослеРедактированияЯчейки()), позволяя перехватывать нажатия клавиш и маскировать ввод до фиксации значения.

Выбор конкретного варианта зависит от требований: для строгой регламентации ввода без использования внешних библиотек оптимально подходит сочетание реквизита Точность в справочнике показателей с модальной функцией ВвестиЧисло() или формулой колонки.

← На главную