Как исправить ошибку StrFindAllByRegularExpression при открытии функций для технического специалиста в 1С 8.3.26

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

При переходе на новые релизы платформы 1С:Предприятие 8.3.26 технические специалисты часто сталкиваются с неприятной ситуацией: при попытке открыть меню «Функции для технического специалиста» или штатный «Журнал регистрации» система выдает критическую ошибку инициализации модуля. Проблема особенно актуальна для конфигураций, работающих в режиме совместимости с версиями 8.3.8, 8.3.12 и более старыми (например, старые редакции 1С:ERP 2.2 или самописные базы на 8.2).

В этой статье мы подробно разберем причины возникновения этой ошибки, проанализируем механизмы работы платформы и рассмотрим несколько вариантов решения — от временных «заглушек» до полноценного обновления системы.

Разбор ситуации: почему возникает ошибка инициализации StandardEventLog?

Проанализируем текст ошибки, который видит пользователь:

Ошибка инициализации модуля: ВнешняяОбработка.StandardEventLog.МодульОбъекта по причине: {ВнешняяОбработка.StandardEventLog.МодульОбъекта(565,9)}: Процедура или функция с указанным именем не определена (StrFindAllByRegularExpression)

Выясним причину такого поведения. В платформе 8.3.26 разработчики обновили внутреннюю обработку StandardEventLog, которая отвечает за отображение журнала регистрации. В коде этой обработки на строке 565 был добавлен вызов метода StrFindAllByRegularExpression (или его русского аналога СтрНайтиВсеПоРегулярномуВыражению). Этот метод предназначен для поиска подстрок с использованием регулярных выражений и официально появился в платформе только в версии 8.3.23.

Коллизия заключается в следующем: когда конфигурация запущена в режиме совместимости ниже 8.3.23, платформа искусственно ограничивает программный интерфейс (API), делая новые методы недоступными для компилятора. Однако системная обработка StandardEventLog, являясь частью самой платформы, пытается использовать этот метод, игнорируя настройки совместимости конкретной информационной базы. В итоге возникает синтаксическая ошибка: парсер видит вызов функции, которой «не существует» в текущем контексте.

Вариант 1. Официальное исправление (Обновление платформы)

Рассмотрим самый надежный способ решения проблемы. Фирма «1С» признала данное поведение ошибкой (код ошибки 60019118). Если у вас есть возможность обновить технологическую платформу, следует выбрать релизы, в которых эта проблема уже устранена:

  1. Для ветки 8.3.26: установите версию 8.3.26.1610 или выше.
  2. Для ветки 8.3.27: используйте версию 8.3.27.1508 и последующие.

В данных исправлениях разработчики платформы добавили проверку доступности метода или реализовали обходной путь для конфигураций с низким режимом совместимости.

Вариант 2. Программный обход через «функции-заглушки»

Если оперативное обновление платформы невозможно (например, из-за жестких требований инфраструктуры), мы можем применить программное решение. Нам необходимо «обмануть» систему, определив недостающие функции в глобальном контексте, чтобы компилятор не выдавал ошибку при инициализации журнала регистрации.

Выполним следующие шаги по шагам:

  1. Откроем конфигуратор и создадим новый Общий модуль. Назовем его, например, ИсправлениеОшибокПлатформы.
  2. В свойствах модуля обязательно установим флаги: Глобальный, Сервер, Внешнее соединение, Клиент (управляемое приложение). Флаг Глобальный критически важен, так как именно он позволяет платформе найти функцию в любом месте кода без указания имени модуля.
  3. Разместим в модуле следующий код:

#Область ПрограммныйИнтерфейс

// Исправление ошибки платформы 8.3.26 (код 60019118)
// Функции-заглушки для конфигураций с режимом совместимости ниже 8.3.23

Функция СтрНайтиВсеПоРегулярномуВыражению(ИсходнаяСтрока, РегулярноеВыражение, ИгнорироватьРегистр = Ложь, МногострочныйПоиск = Ложь) Экспорт
    Результат = Новый Массив;
    Возврат Результат;
КонецФункции

Function StrFindAllByRegularExpression(SourceString, RegEx, RegisterIgnore = False, Multiline = False) Export
    Result = New Array;
    Return Result;
EndFunction

#КонецОбласти

Важное замечание: При копировании кода из интернет-форумов часто можно встретить написание StrFindAllByRegularEx * pression со звездочкой или пробелом внутри слова. Это результат работы защитных фильтров сайтов. Обязательно убедитесь, что в вашем коде слово Expression написано слитно и без посторонних символов, иначе система выдаст ошибку Ожидается символ '('.

Разберем, что делает этот код. Мы создаем пустую функцию, которая всегда возвращает пустой массив. Это позволяет обработке StandardEventLog успешно пройти проверку синтаксиса и открыться. Функции фильтрации в журнале регистрации, использующие регулярные выражения, работать не будут, но основной функционал просмотра событий станет доступен.

Вариант 3. Изменение режима совместимости

Проанализируем еще один способ, который иногда помогает без изменения программного кода. Опытным путем было установлено, что в некоторых случаях поднятие режима совместимости до версии 8.3.9 (даже если метод официально появился в 8.3.23) устраняет ошибку.

Это связано с тем, что в версии 8.3.9 были внесены значительные изменения в работу внутреннего компилятора и парсера модулей. Однако этот метод имеет ряд рисков:

Альтернативные инструменты анализа

Если ошибка блокирует доступ к журналу регистрации, а внести изменения в конфигурацию нельзя, проанализируем ситуацию с помощью внешних средств. Журнал регистрации в формате .lgp или .lgf можно прочитать сторонними утилитами или с помощью другой базы данных (пустой), запущенной на более стабильной версии платформы (например, 8.3.25), указав путь к файлам журнала проблемной базы.

Подведем итог. Мы рассмотрели критический баг платформы 8.3.26, который мешает работе технического персонала. Самым правильным решением является установка патча от 1С (версия 8.3.26.1610+), но в экстренных случаях создание глобального модуля с «пустыми» функциями СтрНайтиВсеПоРегулярномуВыражению и StrFindAllByRegularExpression полностью возвращает работоспособность интерфейсу системы.

← На главную