Восстановление раскладки клавиатуры

Часто бывает, что выбирая некоторый элемент справочника, мы забываем проверить раскладку и не сразу замечаем, что пишем вместо названия/кода искомого элемента нечто несуразное.
Данный код призван получить из неверной раскладки строку в альтернативной раскладке.

Демо-база работает на платформе 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);
Продолжить;
КонецЕсли;

СтрокаВозврата = СтрокаВозврата + Символ; // сохраним старый символ, если он не конвертируется

КонецЦикла;

Возврат СтрокаВозврата;

КонецФункции

 

4 Comments

  1. ellavs

    А можно ли это реализовать, например, расширением, которое автоматически добавить такой функционал ко всем справочникам в конфигурации? Может как-то через подписки на события?

    Reply
  2. user635629_exter

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

    Автоматически ко всем справочникам наверное нет — в каждой конфе свой набор справочников — только через подписку на событие, но подписки на событие МенеджераМодуляСправочника ОбработкаПолученияДанныхВыбора нет — было бы конечно круто, если можно было бы подпиской на все справочники наложить.

    Reply
  3. Rustig

    (0) интересный алгоритм и взгляд на проблему!

    Reply
  4. user635629_exter

    (3) спасибо, буду рад если поможет кому-то еще.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *