Данный код призван получить из неверной раскладки строку в альтернативной раскладке.
Демо-база работает на платформе 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);
Продолжить;
КонецЕсли;
СтрокаВозврата = СтрокаВозврата + Символ; // сохраним старый символ, если он не конвертируется
КонецЦикла;
Возврат СтрокаВозврата;
КонецФункции
А можно ли это реализовать, например, расширением, которое автоматически добавить такой функционал ко всем справочникам в конфигурации? Может как-то через подписки на события?
Расширением можно переделать. Делалось для самописной конфы домашних финансов, поэтому без расширений.
Автоматически ко всем справочникам наверное нет — в каждой конфе свой набор справочников — только через подписку на событие, но подписки на событие МенеджераМодуляСправочника ОбработкаПолученияДанныхВыбора нет — было бы конечно круто, если можно было бы подпиской на все справочники наложить.
(0) интересный алгоритм и взгляд на проблему!
(3) спасибо, буду рад если поможет кому-то еще.