При попытке использовать внешние COM-объекты вроде MSScriptControl.ScriptControl для обработки строк разработчики часто сталкиваются с ошибками синтаксического анализатора JScript, такими как «Предполагается наличие ';'». Разберем подробно, почему возникает данная ошибка, какие ограничения накладывает использование устаревших COM-компонентов, и рассмотрим современные, надежные способы поиска и замены символов в 1С:Предприятии.
Выясним причину падения метода AddCode в скрипте. В исходном примере в скриптовый движок передается конструкция вида:
scr.addcode("a = " + МояСтрока);
Проанализируем, что здесь происходит:
МояСтрока содержит обычный текст (например, "Тест 123"), то в JScript передается строка a = Тест 123. Интерпретатор JavaScript воспринимает слово «Тест» как неопределенный идентификатор (имя переменной), а пробел и цифры — как синтаксическую ошибку, требуя точку с запятой. Чтобы текст был строкой, его необходимо обрамлять в кавычки и экранировать спецсимволы.?(условие, 1, 0) заимствована из синтаксиса встроенного языка 1С. В JavaScript тернарный оператор имеет совершенно иной вид: условие ? значение1 : значение2./[a-z,A-Z,0-9]/ без глобального флага g найдет и заменит только первое совпадение, а запятые внутри квадратных скобок будут восприниматься как буквальный символ запятой. Кроме того, операция удаления латиницы не заменяет русские буквы на латинские.Перед тем как исправлять код с MSScriptControl, важно понимать архитектурные ограничения этого решения:
MSScriptControl существует исключительно как 32-битная COM-библиотека. При вызове на 64-разрядном сервере 1С или в 64-разрядном клиенте попытка создания объекта вызовет исключение «Класс не зарегистрирован».Начиная с версии 8.3.23, в платформу 1С:Предприятие встроен полноценный кроссплатформенный механизм регулярных выражений, работающий нативно как в 32-битных, так и в 64-битных приложениях под любой операционной системой.
Для поиска, проверки и замены символов рассмотрим функции встроенного языка:
// 1. Проверка наличия латинских букв в строке
ШаблонЛатиницы = "[a-zA-Z]";
ЕстьЛатиница = СтрНайтиПоРегулярномуВыражению(МояСтрока, ШаблонЛатиницы) > 0;
// 2. Удаление всех латинских символов и цифр
ШаблонУдаления = "[a-zA-Z0-9]";
СтрокаБезЛатиницы = СтрЗаменитьПоРегулярномуВыражению(МояСтрока, ШаблонУдаления, "");
// 3. Замена русских букв на латинские аналоги по шаблону
// Если требуется пакетная замена схожих по написанию символов
СтрокаРезультат = МояСтрока;
СтрокаРезультат = СтрЗаменитьПоРегулярномуВыражению(СтрокаРезультат, "а", "a");
СтрокаРезультат = СтрЗаменитьПоРегулярномуВыражению(СтрокаРезультат, "е", "e");
Для многократного использования шаблона с высокой производительностью применим объект ОписаниеРегулярногоВыражения:
РегЭксп = Новый ОписаниеРегулярногоВыражения("[A-Za-z]");
Если РегЭксп.Совпадает(МояСтрока) Тогда
// Строка полностью состоит из латинских букв
КонецЕсли;
Если решение должно работать на любых версиях платформы 1С без внешних библиотек и с поддержкой Linux, реализуем посимвольную обработку или замену по словарю соответствий.
Рассмотрим пример замены похожих русских букв на латинские:
Функция ЗаменитьРусскиеБуквыНаЛатинские(Знач ВходнаяСтрока)
// Таблица соответствия визуально похожих символов
РусскиеСимволы = "АВЕКМНОРСТУХавекмнорстух";
ЛатинскиеСимволы = "ABEKMHOPCTYXabekmhopctyx";
Результат = ВходнаяСтрока;
Для Индекс = 1 По СтрДлина(РусскиеСимволы) Цикл
СимволРус = Сред(РусскиеСимволы, Индекс, 1);
СимволЛат = Сред(ЛатинскиеСимволы, Индекс, 1);
Результат = СтрЗаменить(Результат, СимволРус, СимволЛат);
КонецЦикла;
Возврат Результат;
КонецФункции
Разберем проверку строки на наличие латиницы по кодам символов через КодСимвола():
Функция СодержитЛатиницу(Знач ПроверяемаяСтрока)
Для Позиция = 1 По СтрДлина(ПроверяемаяСтрока) Цикл
Код = КодСимвола(ПроверяемаяСтрока, Позиция);
// Диапазоны кодов ASCII: A-Z (65-90), a-z (97-122)
Если (Код >= 65 И Код <= 90) Или (Код >= 97 И Код <= 122) Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
Возврат Ложь;
КонецФункции
Если версия платформы ниже 8.3.23, а разработка ведется в среде Windows, вместо устаревшего MSScriptControl рекомендуется применять объект VBScript.RegExp. В отличие от ScriptControl, компонент VBScript.RegExp доступен как в 32-битной, так и в 64-битной среде Windows.
Посмотрим на пример корректного использования:
Попытка
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
RegExp.IgnoreCase = Истина;
// Шаблон для поиска всех латинских букв и цифр
RegExp.Pattern = "[a-z0-9]";
// Проверка наличия совпадений
ЕстьСовпадения = RegExp.Test(МояСтрока);
// Удаление или замена найденных символов
СтрокаПослеЗамены = RegExp.Replace(МояСтрока, "");
Исключение
ВызватьИсключение "Не удалось инициализировать VBScript.RegExp: " + ОписаниеОшибки();
КонецПопытки;
Итог: для решения задач манипуляции символами в современных конфигурациях следует отдавать предпочтение штатным методам 1С (функциям СтрЗаменитьПоРегулярномуВыражению() или стандартным строковым операциям СтрЗаменить() и КодСимвола()). Это обеспечивает высокую скорость работы, кроссплатформенность и независимость от разрядности сервера.