Почему в 1С цифры меняются местами при вводе и как это исправить?

Системный администратор 1С v8.3 (Управляемые формы) 1С:Комплексная автоматизация IT и автоматизация бизнеса
← На главную

При активной работе операторов в учетных системах 1С (например, при подборе товаров, вводе штрихкодов или заполнении табличных частей документов) иногда возникает плавающий и неприятный баг: пользователь набирает на клавиатуре число 49, а в ячейке или реквизите документа оказывается 94. При проверке логов клавиатуры фиксируется правильная последовательность нажатий, однако в системе значение оказывается зеркальным.

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

Причина 1. Конфликт низкоуровневых перехватчиков клавиатуры (Keyboard Hooks) и ПО слежения

Наиболее частым виновником зеркального ввода выступают системы мониторинга рабочего времени, DLP-системы и клавиатурные шпионы (кейлоггеры). Для отслеживания нажатий клавиш такое программное обеспечение регистрирует в операционной системе Windows глобальный низкоуровневый перехватчик событий клавиатуры — WH_KEYBOARD_LL.

Рассмотрим механизм возникновения сбоя:

  1. Оператор быстро нажимает клавиши подряд (например, «4», затем «9»).
  2. Событие нажатия первой клавиши перехватывается сторонним драйвером или службой мониторинга для логирования.
  3. Если обработчик хука задерживает передачу события в очередь оконных сообщений даже на несколько миллисекунд (из-за дисковых операций, отправки пакета по сети или блокировки потока), нарушается очередность сообщений WM_KEYDOWN и WM_KEYUP.
  4. В результате сообщение о нажатии второй цифры («9») попадает в активное поле ввода 1С раньше, чем обработается первая («4»).

Способ решения:

  1. Временно отключите или приостановите службу мониторинга действий пользователей на сервере терминалов или рабочем месте оператора.
  2. Проверьте, воспроизводится ли проблема при быстром вводе чисел в режиме «чистого теста».
  3. Если сбой прекратился, настройте в ПО мониторинга исключения для процесса 1cv8.exe / 1cv8c.exe либо обновите версию агента слежения до актуальной.

Причина 2. Сброс позиции курсора из-за серверных вызовов в обработчиках событий

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

Если для поля ввода назначен обработчик АвтоПодбор, ИзменениеТекстаРедактирования или ОкончаниеВводаТекста, и внутри этого обработчика выполняется контекстный вызов сервера без оптимизации, происходит следующее:

  1. При установке фокуса в поле число выделяется целиком (если включено стандартное свойство «Выделять при вводе»).
  2. Оператор вводит первый символ («4»), который замещает старое значение.
  3. Срабатывает клиентское событие, которое инициирует обращение на сервер (&НаСервере).
  4. Пока клиент ожидает ответ от сервера, позиция каретки (курсора) внутри поля ввода кратковременно сбрасывается в начало строки (позиция 0, перед только что введенной четверкой).
  5. Следующий символ («9»), набранный пользователем без паузы, вставляется в текущую позицию каретки — то есть перед первой цифрой. В итоге формируется число 94.

Посмотрим на пример некорректного кода, вызывающего сброс курсора:


&НаКлиенте
Процедура КоличествоТоваровИзменениеТекстаРедактирования(Элемент, Текст, ТекстАвтоПодбора, СтандартнаяОбработка)
    // Неверный подход: вызов сервера на каждое нажатие клавиши
    ПроверитьОстаткиНаСервере(Текст);
КонецПроцедуры

Для исправления подобной ситуации необходимо отказаться от синхронных серверных вызовов на каждое изменение символа. Проверки и расчеты следует переносить в событие ПриИзменении, которое отрабатывает после завершения ввода значения пользователем:


&НаКлиенте
Процедура КоличествоТоваровПриИзменении(Элемент)
    // Корректный подход: обработка выполняется после фиксации ввода
    ТекущиеДанные = Элементы.ТаблицаТовары.ТекущиеДанные;
    Если ТекущиеДанные <> Неопределено Тогда
        ПересчитатьСуммуСтроки(ТекущиеДанные);
    КонецЕсли;
КонецПроцедуры

Причина 3. Случайное переключение направления текста (RTL)

В операционной системе Windows встроена системная комбинация клавиш для смены направления письма на режим «справа налево» (Right-to-Left, RTL), используемый для арабской вязи и иврита.

По умолчанию в некоторых версиях Windows активно сочетание клавиш Ctrl + Правый Shift. Если оператор при быстром наборе случайно задевает эту комбинацию, активное поле ввода переключается в зеркальный режим: каждый новый символ подставляется слева от предыдущего.

Способ решения:

  1. Для возврата в стандартный режим нажмите Ctrl + Левый Shift.
  2. Чтобы полностью исключить случайное переключение, отключите горячие клавиши смены направления текста в параметрах языковой панели операционной системы: Параметры -> Время и язык -> Язык -> Дополнительные параметры клавиатуры -> Сочетания клавиш для языков ввода.

Причина 4. Влияние автоматических переключателей раскладки (Punto Switcher и аналоги)

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

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

Способ решения:

  1. Добавьте исполняемые файлы 1С (1cv8.exe, 1cv8c.exe) в список исключений переключателя раскладки.
  2. Отключите автоматическое переключение для числовых блоков и специальных символов.

Причина 5. Особенности буферизации RDP и сетевого протокола UDP

Если пользователи работают в терминальном режиме (Remote Desktop Services), рассинхронизация ввода может быть вызвана нестабильной работой RDP поверх протокола UDP при потерях пакетов или включенном аппаратном ускорении графики RemoteFX.

Способ решения:

  1. Откройте редактор локальной групповой политики (gpedit.msc) на сервере или клиентской машине.
  2. Перейдите по пути: Конфигурация компьютера -> Административные шаблоны -> Компоненты Windows -> Службы удаленных рабочих столов -> Клиент подключения к удаленному рабочему столу.
  3. Включите параметр «Отключить UDP на клиенте» (Turn Off UDP On Client), чтобы принудительно перевести весь терминальный трафик на гарантированную доставку по TCP.

Сводная инструкция по диагностике

Чтобы быстро локализовать источник проблемы, выполним следующие шаги:

  1. Проверка окружения: запускаем 1С локально без RDP и сторонних утилит. Если перестановка цифр исчезла — проблема в терминальном клиенте или ПО перехвата клавиш.
  2. Аудит стороннего ПО: отключаем службы агентов DLP, тайм-трекеров и переключателей раскладки.
  3. Анализ кода формы: проверяем свойства элементов формы на наличие обработчиков ИзменениеТекстаРедактирования и АвтоПодбор. Исключаем из них любые серверные вызовы.
  4. Проверка системных хоткеев: отключаем сочетания Ctrl + Shift для изменения направления письма в настройках Windows.
← На главную