Почему при вводе отрицательного числа в таблицу значений вместо -1 получается -10 и как это исправить

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При работе с классическими «Обычными формами» в среде 1С:Предприятие 8.2 разработчики часто сталкиваются со странным поведением элементов управления. Один из самых известных и раздражающих нюансов — некорректный ввод отрицательных чисел в колонки типа Число табличного поля. Ситуация выглядит следующим образом: пользователь пытается ввести «-1», но в ячейке внезапно оказывается значение «-10». В этой статье мы подробно разберем, почему это происходит, и какие программные методы позволяют победить этот «платформенный глюк».

Разбор ситуации и поиск причины

Рассмотрим стандартный сценарий. Программист создает на форме объект ТабличноеПоле, связанный с переменной типа ТаблицаЗначений. Колонки добавляются программно или через конфигуратор с типом Число. По умолчанию в новой строке такой таблицы в числовом поле всегда стоит «0».

Проанализируем механику ввода данных. Когда пользователь активирует ячейку и нажимает клавишу «-» (минус), ожидается, что система подготовит поле для ввода отрицательного числа. Однако в проблемных релизах платформы (в частности, ветка 8.2.19.х) встроенный редактор текстового поля внутри ячейки отрабатывает некорректно. Вместо того чтобы полностью заменить текущее значение «0» на вводимый символ, система «склеивает» ввод. Курсор ошибочно позиционируется между только что введенным минусом и существующим нулем. В результате, когда пользователь нажимает «1», единица вставляется перед нулем, превращая строку в «-10».

Выясним причину такого поведения. Это чистой воды баг внутреннего алгоритма обработки событий клавиатуры в текстовых редакторах ячеек. Платформа 8.3 в режиме обычных форм этот недочет исправила, но на старых конфигурациях проблема остается актуальной.

Решение №1: Глобальное обновление платформы

Самый простой и логичный способ — это переход на актуальную версию платформы 8.3. Даже если ваша конфигурация написана на обычных формах и вы не планируете переходить на управляемый интерфейс, запуск в режиме обычного приложения на движке 8.3 полностью устраняет проблему. Как показывает практика и обсуждения на форумах, в версиях начиная с 8.3.10 и выше, этот баг более не воспроизводится.

Решение №2: Настройка свойств колонки «Выделять при входе»

Если обновление платформы по каким-то причинам невозможно, проанализируем настройки свойств табличного поля. Одной из ключевых настроек является свойство ВыделятьПриВходе (SelectOnEntry) для элемента управления, который используется в колонке.

Когда это свойство установлено в значение Истина, при начале редактирования всё содержимое ячейки (тот самый злополучный «0») выделяется целиком. В этом случае первый же нажатый символ («-») полностью заменяет выделение, и поле становится пустым, содержащим только минус. Последующий ввод цифр происходит корректно.

Как это настроить:

  1. Откройте свойства колонки табличного поля.
  2. Перейдите к элементу управления (обычно это ПолеВвода).
  3. Найдите свойство «Выделять при входе» и установите флажок.

Решение №3: Программная очистка в событии ПриНачалеРедактирования

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

Посмотрим на пример кода, который можно разместить в модуле формы:


Процедура ТаблицаТоваровПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
    // Если мы редактируем существующую строку и значение равно 0
    // имеет смысл очистить его для удобства ввода
    ТекущиеДанные = Элемент.ТекущиеДанные;
    Если ТекущиеДанные <> Неопределено Тогда
        Если ТекущиеДанные.Колич = 0 Тогда
            ТекущиеДанные.Колич = 0; // Переинициализация иногда помогает
            // Но лучше принудительно выделить текст через ЭлементыФормы
            Элемент.ТекущаяКолонка.ЭлементУправления.ВыделенныйТекст = Строка(ТекущиеДанные.Колич);
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Однако более надежным способом будет использование метода УстановитьГраницыВыделения, чтобы гарантировать, что при вводе любого символа старое значение будет затерто.

Решение №4: Форматирование ячейки (ЧН=)

Рассмотрим еще один подход — использование свойств формата. В 1С есть параметр формата ЧН (Представление нуля). Если установить его в пустое значение, то визуально «0» отображаться не будет.

Для колонки таблицы в свойстве Формат укажите: ЧН=. Это не удаляет ноль из памяти (в базе или в таблице значений он останется числом 0), но в интерфейсе ячейка будет выглядеть пустой. В некоторых релизах 8.2 это заставляет редактор вести себя иначе, так как визуальное отсутствие текста снижает вероятность некорректной склейки строки при вводе минуса.

Решение №5: Рекомендации для пользователей (Manual Workaround)

Если вы не являетесь разработчиком или не имеете возможности менять код конфигурации, существует «бытовой» способ обхода проблемы. Проанализируем действия пользователя: ошибка возникает из-за того, что «0» остается в поле.

Инструкция для пользователя:

Итоги

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

  1. Лучшее решение — обновление на 1С 8.3 (даже для обычных форм).
  2. Второй по эффективности метод — включение свойства ВыделятьПриВходе в колонках таблицы.
  3. Для динамических таблиц используйте обработку события ПриНачалеРедактирования для программного выделения или очистки.

Используя эти методы, вы обеспечите корректную и комфортную работу пользователей с числовыми данными, исключив появление странных значений вроде «-10» вместо «-1».

← На главную