Почему не открывается консоль запросов и как исправить ошибку «Процедура или функция не определена (СтрНайти)»

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

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

Выясняем причину ошибки

Проанализируем ситуацию: пользователь запускает платформу версии 8.3.14, но получает ошибку, указывающую на отсутствие базовой функции СтрНайти. На первый взгляд это кажется парадоксальным, ведь данная функция является стандартной для платформы 8.3. Однако ключевой момент здесь кроется в версии конфигурации (в примере это 2.0.17.2) и настройке под названием «Режим совместимости».

Функция СтрНайти была добавлена в платформу «1С:Предприятие» начиная с версии 8.3.6. Если ваша конфигурация имеет режим совместимости «8.3.5», «8.2.16» или еще более ранний, компилятор встроенного языка блокирует использование всех функций, появившихся в более поздних версиях. Это делается для того, чтобы обеспечить идентичное поведение кода на разных версиях платформы и избежать логических ошибок при миграции данных. Таким образом, наличие физической версии платформы 8.3.14 не дает права использовать функционал этой версии, если конфигурация «застряла» в прошлом.

Решение №1: Ручная адаптация кода обработки

Если нам необходимо запустить конкретную консоль запросов именно в этой базе, самым надежным способом будет адаптация её исходного кода под ограничения текущего режима совместимости. Разберем, как это сделать самостоятельно.

  1. Откроем внешнюю обработку (файл .epf) через Конфигуратор (Меню Файл — Открыть).
  2. Перейдем в модуль формы, на который указывает сообщение об ошибке (в нашем случае это строка 1787).
  3. Найдем использование функции СтрНайти.

В большинстве случаев разработчики используют эту функцию для простого поиска подстроки. Посмотрим на типичный пример замены кода:


// Код, вызывающий ошибку в режиме совместимости ниже 8.3.6:
Позиция = СтрНайти(СтрокаИсточник, "Выбрать");

// Исправленный вариант, который будет работать везде:
Позиция = Найти(СтрокаИсточник, "Выбрать");

Важное замечание: функция СтрНайти отличается от старой функции Найти тем, что позволяет указывать направление поиска (с начала или с конца) и номер вхождения. Если в коде консоли используются эти дополнительные параметры, простая замена не поможет — придется переписывать логику с использованием функций Лев, Прав и Сред.

Решение №2: Исправление сопутствующих функций

Проанализируем программный код дальше. Как правило, использование СтрНайти — это лишь «верхушка айсберга». В современных консолях запросов часто встречаются и другие функции, недоступные в старых режимах совместимости. Чтобы обработка полностью заработала, выполните поиск и замену для следующих конструкций:

Пример реализации аналога СтрНачинаетсяС для старых платформ:


// Вместо: Если СтрНачинаетсяС(ТекстЗапроса, "ВЫБРАТЬ") Тогда
Если НРег(Лев(СокрЛП(ТекстЗапроса), 7)) = "выбрать" Тогда
    // Ваша логика
КонецЕсли;

Решение №3: Выбор правильной версии инструмента

Если вы не хотите заниматься правкой кода вручную, следует обратить внимание на тип приложения. Конфигурации версии 2.0 (как в примере пользователя) чаще всего построены на обычных формах. Современные консоли запросов с портала ИТС или из состава БСП (Библиотеки стандартных подсистем) ориентированы на управляемые формы.

Посмотрим, какие варианты инструментов существуют для разных условий:

  1. Консоль для обычных форм: Ищите версии консолей, выпущенные до 2014 года. Они изначально написаны без использования функций СтрНайти, СтрСоединить и других нововведений 8.3.6.
  2. Инструменты разработчика (автор Tormozit): Это один из самых мощных наборов инструментов. Автор поддерживает отдельные сборки для обычного и управляемого приложения, которые обладают колоссальной отказоустойчивостью и работают даже на очень старых конфигурациях.
  3. Универсальные консоли с проверкой версии: На профильных ресурсах можно найти «умные» консоли. В их коде прописаны условия:

Если СистемнаяИнформация.ВерсияПриложения > "8.3.6" Тогда
    Позиция = СтрНайти(Текст, Поиск);
Иначе
    Позиция = Найти(Текст, Поиск);
КонецЕсли;

Почему нельзя просто изменить режим совместимости?

Рассмотрим ситуацию, когда возникает соблазн просто зайти в свойства корня конфигурации и изменить «Режим совместимости» на «Не использовать» или «8.3.14». Делать это категорически не рекомендуется ради запуска одной внешней обработки.

Изменение режима совместимости влияет на:

Такое изменение требует полного регрессионного тестирования всей системы. Поэтому правильным путем всегда будет адаптация внешнего инструмента под требования системы, а не наоборот.

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

← На главную