Демо-база работает на платформе 1с.8.3.12 и выше.
Часто бывает, что выбирая некоторый элемент справочника, мы забываем проверить раскладку и не сразу замечаем, что пишем вместо названия/кода искомого элемента нечто несуразное.
Данный код призван получить из неверной раскладки строку в альтернативной раскладке. В нашем случае это либо из русского в английский, либо наоборот.
В примере (демо-базе) в событие ОбработкаПолученияДанныхВыбора() справочника Валюты (и других справочников тоже) добавлен поиск не только по тому тексту, что набирает пользователь, по и параллельно по тексту, полученному из восстановленной раскладки.
Функция ВосстановитьРаскладку(Строка) Экспорт
СтрокаБазы1 = "йцукенгшщзхъфывапролджэячсмитьбю.qwertyuiop[]asdfghjkl;'zxcvbnm,./";
//СтрокаБазы2 = "ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ.QWERTYUIOP[]ASDFGHJKL;'ZXCVBNM,./"; capslock
СтрокаБазы3 = "ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,QWERTYUIOP{}ASDFGHJKL:""ZXCVBNM<>?";
//СтрокаБазы4 = "Э""";
// итак, конвертер обходит строку посимвольно и меняет ее на другую.
// capslock не учитываем - слишком сложно далее анализировать - появляется инвариантность.
// числа тоже надо как-то анализировать, но не в этом коде, т.к. опять появляется инвариантность.
//// Э анализируем отдельно :( работает итак :)
ДлинаСтроки = СтрДлина(строка);
СтрокаВозврата = "";
Для Счетчик=1 По ДлинаСтроки Цикл
Символ = Сред(Строка,Счетчик,1);
МестоВСтроке = Найти(СтрокаБазы1,Символ);
Если МестоВСтроке>0 Тогда
Если МестоВСтроке<33 Тогда
МестоВСтроке = МестоВСтроке+33;
Иначе
МестоВСтроке = МестоВСтроке-33;
КонецЕсли;
СтрокаВозврата = СтрокаВозврата+Сред(СтрокаБазы1,МестоВСтроке,1);
Продолжить;
КонецЕсли;
МестоВСтроке = Найти(СтрокаБазы3,Символ);
Если МестоВСтроке>0 Тогда
Если МестоВСтроке<33 Тогда
МестоВСтроке = МестоВСтроке+33;
Иначе
МестоВСтроке = МестоВСтроке-33;
КонецЕсли;
СтрокаВозврата = СтрокаВозврата+Сред(СтрокаБазы3,МестоВСтроке,1);
Продолжить;
КонецЕсли;
СтрокаВозврата = СтрокаВозврата + Символ; // сохраним старый символ, если он не конвертируется
КонецЦикла;
Возврат СтрокаВозврата;
КонецФункции