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

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

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

Выясняем причину: дело в режиме совместимости

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

Функция СтрШаблон() (и ее англоязычный аналог StrTemplate()) — это удобный инструмент для форматирования строк, который появился в платформе 1С:Предприятие начиная с версии 8.3.6. Однако просто обновить платформу на сервере и у пользователей недостаточно. Чтобы новые возможности платформы стали доступны в коде, конфигурация должна "знать", что ей разрешено их использовать.

За это отвечает свойство конфигурации «Режим совместимости». Согласно официальной документации:

Функция СтрШаблон() доступна, начиная с версии платформы 8.3.6, но только в том случае, если режим совместимости конфигурации установлен на версию 8.3.5 или выше.

В рассматриваемом случае режим совместимости был установлен на 8.2.13. В этом режиме платформа эмулирует поведение старой версии, и все новые функции, такие как СтрШаблон(), СтрНачинаетсяС(), СтрЗаканчиваетсяНа() и другие, просто не существуют для исполняющей среды. Поэтому и возникает ошибка "Процедура или функция не определена".

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

Что делать? Два пути решения проблемы

Существует два основных подхода к решению этой задачи: кардинальный (правильный, но рискованный) и локальный (безопасный и быстрый).

Решение 1: Изменение режима совместимости (рекомендуется с осторожностью)

Этот способ позволяет разблокировать все новые возможности платформы. Но он требует большой ответственности и тщательного тестирования. Смена режима совместимости, особенно с такой старой версии, как 8.2.13, на современную — это серьезное изменение, которое может повлиять на многие механизмы в конфигурации.

Что может пойти не так?

  1. Изменение работы модальных окон. Это одно из самых известных изменений. Код, который раньше открывал окно и ждал ответа пользователя, блокируя дальнейшее выполнение (синхронный вызов), в новых режимах может начать работать асинхронно. Это ломает логику работы многих типовых и нетиповых механизмов.
  2. Устаревшие функции и свойства. Некоторые методы, которые вы использовали, могут быть объявлены устаревшими или вовсе удалены. При проверке конфигурации вы увидите множество предупреждений, которые нужно будет проанализировать и исправить.
  3. Изменения в языке запросов. Могут перестать работать или начать работать иначе некоторые запросы, которые опирались на специфическое поведение старых версий платформы.
  4. Поведение интерфейса. Могут измениться поведение и свойства элементов управляемых форм, если они используются в вашей конфигурации.

Как действовать:

  1. Создайте полную копию рабочей базы данных.
  2. В конфигураторе копии измените свойство «Режим совместимости» на актуальную версию (например, «Не использовать» или на конкретную версию платформы).
  3. Сохраните и обновите конфигурацию базы данных.
  4. Запустите полную синтаксическую проверку всех модулей и исправьте найденные ошибки и предупреждения.
  5. Проведите полное и всестороннее тестирование функциональности на копии. Привлеките ключевых пользователей для проверки всех критически важных бизнес-процессов: от создания документов до формирования отчетов.
  6. Только после успешного тестирования планируйте обновление на рабочей базе.

Решение 2: Используем альтернативы, не меняя режим совместимости

Если смена режима совместимости — слишком рискованный или трудозатратный процесс, можно обойтись без функции СтрШаблон(). Это безопасный путь, который не требует глобальных изменений.

Способ А: Последовательные вызовы СтрЗаменить()

Самый простой способ — использовать многократный вызов функции СтрЗаменить(). Это менее производительно, чем СтрШаблон(), так как каждый вызов заново "пробегает" по всей строке, но для большинства задач разница будет незаметна.

Посмотрим на пример:


// Вместо:
// ТекстСообщения = СтрШаблон("Пользователь %1 создал документ %2 от даты %3", 
//                            ИмяПользователя, 
//                            ПредставлениеДокумента, 
//                            Формат(ДатаДокумента, "ДФ=dd.MM.yyyy"));
//
// Используем:
ТекстШаблона = "Пользователь %1 создал документ %2 от даты %3";
ТекстСообщения = СтрЗаменить(ТекстШаблона, "%1", ИмяПользователя);
ТекстСообщения = СтрЗаменить(ТекстСообщения, "%2", ПредставлениеДокумента);
ТекстСообщения = СтрЗаменить(ТекстСообщения, "%3", Формат(ДатаДокумента, "ДФ=dd.MM.yyyy"));

Способ Б: Пишем собственную функцию

Чтобы не дублировать код с многократными заменами по всей конфигурации, лучше написать собственную общую функцию, имитирующую поведение СтрШаблон(), и поместить ее в общий модуль.

Вот простой пример такой функции:


&НаСервереБезКонтекста
Функция ФорматироватьСтроку(Знач Шаблон, Параметры) Экспорт

    Результат = Шаблон;
    
    // Параметры могут быть переданы как Массив
    Если ТипЗнч(Параметры) = Тип("Массив") Тогда
        Для Индекс = 0 По Параметры.ВГраница() Цикл
            НомерПараметра = Индекс + 1;
            ПодстрокаПоиска = "%" + Строка(НомерПараметра);
            ЗначениеПараметра = Параметры[Индекс];
            Результат = СтрЗаменить(Результат, ПодстрокаПоиска, ЗначениеПараметра);
        КонецЦикла;
    Иначе
        // Или как один параметр, если он всего один
        Результат = СтрЗаменить(Результат, "%1", Параметры);
    КонецЕсли;
    
    Возврат Результат;

КонецФункции

// Пример вызова:
ПараметрыСообщения = Новый Массив;
ПараметрыСообщения.Добавить(ИмяПользователя);
ПараметрыСообщения.Добавить(ПредставлениеДокумента);
ПараметрыСообщения.Добавить(Формат(ДатаДокумента, "ДФ=dd.MM.yyyy"));

ТекстШаблона = "Пользователь %1 создал документ %2 от даты %3";
ТекстСообщения = ОбщегоНазначения.ФорматироватьСтроку(ТекстШаблона, ПараметрыСообщения);

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

Подведем итоги

Ошибка «Процедура или функция с указанным именем не определена (СтрШаблон)» — это не сбой платформы, а прямое следствие настроек вашей конфигурации. Ключевая причина — устаревший режим совместимости.

Выбор решения зависит от ваших задач:

← На главную