При активной работе операторов в учетных системах 1С (например, при подборе товаров, вводе штрихкодов или заполнении табличных частей документов) иногда возникает плавающий и неприятный баг: пользователь набирает на клавиатуре число 49, а в ячейке или реквизите документа оказывается 94. При проверке логов клавиатуры фиксируется правильная последовательность нажатий, однако в системе значение оказывается зеркальным.
Разберем детально, почему возникает такая инверсия символов, проанализируем основные технические причины на стороне операционной системы, протокола удаленного доступа и платформы 1С:Предприятие, а также рассмотрим пошаговые способы устранения неполадки.
Наиболее частым виновником зеркального ввода выступают системы мониторинга рабочего времени, DLP-системы и клавиатурные шпионы (кейлоггеры). Для отслеживания нажатий клавиш такое программное обеспечение регистрирует в операционной системе Windows глобальный низкоуровневый перехватчик событий клавиатуры — WH_KEYBOARD_LL.
Рассмотрим механизм возникновения сбоя:
WM_KEYDOWN и WM_KEYUP.Способ решения:
1cv8.exe / 1cv8c.exe либо обновите версию агента слежения до актуальной.Проанализируем программную причину внутри самой конфигурации 1С. В управляемых формах реквизиты числового ввода или поля табличной части часто имеют привязанные события.
Если для поля ввода назначен обработчик АвтоПодбор, ИзменениеТекстаРедактирования или ОкончаниеВводаТекста, и внутри этого обработчика выполняется контекстный вызов сервера без оптимизации, происходит следующее:
&НаСервере).Посмотрим на пример некорректного кода, вызывающего сброс курсора:
&НаКлиенте
Процедура КоличествоТоваровИзменениеТекстаРедактирования(Элемент, Текст, ТекстАвтоПодбора, СтандартнаяОбработка)
// Неверный подход: вызов сервера на каждое нажатие клавиши
ПроверитьОстаткиНаСервере(Текст);
КонецПроцедуры
Для исправления подобной ситуации необходимо отказаться от синхронных серверных вызовов на каждое изменение символа. Проверки и расчеты следует переносить в событие ПриИзменении, которое отрабатывает после завершения ввода значения пользователем:
&НаКлиенте
Процедура КоличествоТоваровПриИзменении(Элемент)
// Корректный подход: обработка выполняется после фиксации ввода
ТекущиеДанные = Элементы.ТаблицаТовары.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено Тогда
ПересчитатьСуммуСтроки(ТекущиеДанные);
КонецЕсли;
КонецПроцедуры
В операционной системе Windows встроена системная комбинация клавиш для смены направления письма на режим «справа налево» (Right-to-Left, RTL), используемый для арабской вязи и иврита.
По умолчанию в некоторых версиях Windows активно сочетание клавиш Ctrl + Правый Shift. Если оператор при быстром наборе случайно задевает эту комбинацию, активное поле ввода переключается в зеркальный режим: каждый новый символ подставляется слева от предыдущего.
Способ решения:
Утилиты автоматической смены раскладки клавиатуры перехватывают поток ввода, анализируют последовательности символов и при срабатывании определенных правил эмулируют нажатия клавиш Backspace, после чего вставляют текст из внутреннего буфера.
При высокой скорости печати буфер программы может рассинхронизироваться с реальным полем ввода 1С, что приводит к перестановке соседних символов или дублированию цифр.
Способ решения:
1cv8.exe, 1cv8c.exe) в список исключений переключателя раскладки.Если пользователи работают в терминальном режиме (Remote Desktop Services), рассинхронизация ввода может быть вызвана нестабильной работой RDP поверх протокола UDP при потерях пакетов или включенном аппаратном ускорении графики RemoteFX.
Способ решения:
gpedit.msc) на сервере или клиентской машине.Чтобы быстро локализовать источник проблемы, выполним следующие шаги:
ИзменениеТекстаРедактирования и АвтоПодбор. Исключаем из них любые серверные вызовы.Ctrl + Shift для изменения направления письма в настройках Windows.