Как исправить ошибку при работе с MSScriptControl и правильно обрабатывать латинские и русские символы в строках 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При попытке использовать внешние COM-объекты вроде MSScriptControl.ScriptControl для обработки строк разработчики часто сталкиваются с ошибками синтаксического анализатора JScript, такими как «Предполагается наличие ';'». Разберем подробно, почему возникает данная ошибка, какие ограничения накладывает использование устаревших COM-компонентов, и рассмотрим современные, надежные способы поиска и замены символов в 1С:Предприятии.

Анализ причин ошибки в исходном коде

Выясним причину падения метода AddCode в скрипте. В исходном примере в скриптовый движок передается конструкция вида:

scr.addcode("a = " + МояСтрока);

Проанализируем, что здесь происходит:

  1. Отсутствие строковых кавычек: если переменная МояСтрока содержит обычный текст (например, "Тест 123"), то в JScript передается строка a = Тест 123. Интерпретатор JavaScript воспринимает слово «Тест» как неопределенный идентификатор (имя переменной), а пробел и цифры — как синтаксическую ошибку, требуя точку с запятой. Чтобы текст был строкой, его необходимо обрамлять в кавычки и экранировать спецсимволы.
  2. Некорректный тернарный оператор: конструкция ?(условие, 1, 0) заимствована из синтаксиса встроенного языка 1С. В JavaScript тернарный оператор имеет совершенно иной вид: условие ? значение1 : значение2.
  3. Логика регулярного выражения: шаблон /[a-z,A-Z,0-9]/ без глобального флага g найдет и заменит только первое совпадение, а запятые внутри квадратных скобок будут восприниматься как буквальный символ запятой. Кроме того, операция удаления латиницы не заменяет русские буквы на латинские.

Ограничения использования MSScriptControl.ScriptControl

Перед тем как исправлять код с MSScriptControl, важно понимать архитектурные ограничения этого решения:

  1. Только 32-разрядная архитектура: MSScriptControl существует исключительно как 32-битная COM-библиотека. При вызове на 64-разрядном сервере 1С или в 64-разрядном клиенте попытка создания объекта вызовет исключение «Класс не зарегистрирован».
  2. Привязка к ОС Windows: COM-технология не поддерживается на серверах и клиентских рабочих местах под управлением Linux и macOS.

Способ 1. Использование встроенных регулярных выражений платформы (начиная с 1С 8.3.23)

Начиная с версии 8.3.23, в платформу 1С:Предприятие встроен полноценный кроссплатформенный механизм регулярных выражений, работающий нативно как в 32-битных, так и в 64-битных приложениях под любой операционной системой.

Для поиска, проверки и замены символов рассмотрим функции встроенного языка:


// 1. Проверка наличия латинских букв в строке
ШаблонЛатиницы = "[a-zA-Z]";
ЕстьЛатиница = СтрНайтиПоРегулярномуВыражению(МояСтрока, ШаблонЛатиницы) > 0;

// 2. Удаление всех латинских символов и цифр
ШаблонУдаления = "[a-zA-Z0-9]";
СтрокаБезЛатиницы = СтрЗаменитьПоРегулярномуВыражению(МояСтрока, ШаблонУдаления, "");

// 3. Замена русских букв на латинские аналоги по шаблону
// Если требуется пакетная замена схожих по написанию символов
СтрокаРезультат = МояСтрока;
СтрокаРезультат = СтрЗаменитьПоРегулярномуВыражению(СтрокаРезультат, "а", "a");
СтрокаРезультат = СтрЗаменитьПоРегулярномуВыражению(СтрокаРезультат, "е", "e");

Для многократного использования шаблона с высокой производительностью применим объект ОписаниеРегулярногоВыражения:


РегЭксп = Новый ОписаниеРегулярногоВыражения("[A-Za-z]");
Если РегЭксп.Совпадает(МояСтрока) Тогда
    // Строка полностью состоит из латинских букв
КонецЕсли;

Способ 2. Замена и анализ символов на чистом встроенном языке 1С

Если решение должно работать на любых версиях платформы 1С без внешних библиотек и с поддержкой Linux, реализуем посимвольную обработку или замену по словарю соответствий.

Рассмотрим пример замены похожих русских букв на латинские:


Функция ЗаменитьРусскиеБуквыНаЛатинские(Знач ВходнаяСтрока)
    
    // Таблица соответствия визуально похожих символов
    РусскиеСимволы  = "АВЕКМНОРСТУХавекмнорстух";
    ЛатинскиеСимволы = "ABEKMHOPCTYXabekmhopctyx";
    
    Результат = ВходнаяСтрока;
    
    Для Индекс = 1 По СтрДлина(РусскиеСимволы) Цикл
        СимволРус = Сред(РусскиеСимволы, Индекс, 1);
        СимволЛат = Сред(ЛатинскиеСимволы, Индекс, 1);
        Результат = СтрЗаменить(Результат, СимволРус, СимволЛат);
    КонецЦикла;
    
    Возврат Результат;
    
КонецФункции

Разберем проверку строки на наличие латиницы по кодам символов через КодСимвола():


Функция СодержитЛатиницу(Знач ПроверяемаяСтрока)
    
    Для Позиция = 1 По СтрДлина(ПроверяемаяСтрока) Цикл
        Код = КодСимвола(ПроверяемаяСтрока, Позиция);
        // Диапазоны кодов ASCII: A-Z (65-90), a-z (97-122)
        Если (Код >= 65 И Код <= 90) Или (Код >= 97 И Код <= 122) Тогда
            Возврат Истина;
        КонецЕсли;
    КонецЦикла;
    
    Возврат Ложь;
    
КонецФункции

Способ 3. Использование VBScript.RegExp для старых версий платформы под Windows

Если версия платформы ниже 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С (функциям СтрЗаменитьПоРегулярномуВыражению() или стандартным строковым операциям СтрЗаменить() и КодСимвола()). Это обеспечивает высокую скорость работы, кроссплатформенность и независимость от разрядности сервера.

← На главную