Нередко разработчики сталкиваются с ситуацией, когда стандартная, встроенная в платформу 1С функция, внезапно перестает работать и вызывает ошибку. Классический пример — ошибка «Процедура или функция с указанным именем не определена (СтрШаблон)». При этом может возникнуть путаница: на одной базе (например, файловой копии) синтаксический контроль проходит успешно, а на другой (рабочей SQL) — выдает ошибку. Давайте детально разберемся, в чем причина такого поведения и как исправить ситуацию.
Основная и практически единственная причина этой ошибки — режим совместимости вашей конфигурации. Проанализируем ситуацию по шагам.
Функция СтрШаблон() (и ее англоязычный аналог StrTemplate()) — это удобный инструмент для форматирования строк, который появился в платформе 1С:Предприятие начиная с версии 8.3.6. Однако просто обновить платформу на сервере и у пользователей недостаточно. Чтобы новые возможности платформы стали доступны в коде, конфигурация должна "знать", что ей разрешено их использовать.
За это отвечает свойство конфигурации «Режим совместимости». Согласно официальной документации:
Функция
СтрШаблон()доступна, начиная с версии платформы 8.3.6, но только в том случае, если режим совместимости конфигурации установлен на версию 8.3.5 или выше.
В рассматриваемом случае режим совместимости был установлен на 8.2.13. В этом режиме платформа эмулирует поведение старой версии, и все новые функции, такие как СтрШаблон(), СтрНачинаетсяС(), СтрЗаканчиваетсяНа() и другие, просто не существуют для исполняющей среды. Поэтому и возникает ошибка "Процедура или функция не определена".
Важный нюанс: Почему же тогда в файловой копии проверка синтаксиса могла не выдавать ошибку? Это распространенная ловушка. Если вы в конфигураторе измените режим совместимости, но не сохраните конфигурацию и не обновите базу данных, синтакс-помощник и проверка модулей уже будут работать в контексте нового режима. Они увидят функцию СтрШаблон() и не сообщат об ошибке. Но при попытке выполнить этот код в режиме «Предприятие» реальная, не обновленная конфигурация, работающая в старом режиме совместимости, закономерно выдаст ошибку.
Существует два основных подхода к решению этой задачи: кардинальный (правильный, но рискованный) и локальный (безопасный и быстрый).
Этот способ позволяет разблокировать все новые возможности платформы. Но он требует большой ответственности и тщательного тестирования. Смена режима совместимости, особенно с такой старой версии, как 8.2.13, на современную — это серьезное изменение, которое может повлиять на многие механизмы в конфигурации.
Что может пойти не так?
Как действовать:
Если смена режима совместимости — слишком рискованный или трудозатратный процесс, можно обойтись без функции СтрШаблон(). Это безопасный путь, который не требует глобальных изменений.
Способ А: Последовательные вызовы СтрЗаменить()
Самый простой способ — использовать многократный вызов функции СтрЗаменить(). Это менее производительно, чем СтрШаблон(), так как каждый вызов заново "пробегает" по всей строке, но для большинства задач разница будет незаметна.
Посмотрим на пример:
// Вместо:
// ТекстСообщения = СтрШаблон("Пользователь %1 создал документ %2 от даты %3",
// ИмяПользователя,
// ПредставлениеДокумента,
// Формат(ДатаДокумента, "ДФ=dd.MM.yyyy"));
//
// Используем:
ТекстШаблона = "Пользователь %1 создал документ %2 от даты %3";
ТекстСообщения = СтрЗаменить(ТекстШаблона, "%1", ИмяПользователя);
ТекстСообщения = СтрЗаменить(ТекстСообщения, "%2", ПредставлениеДокумента);
ТекстСообщения = СтрЗаменить(ТекстСообщения, "%3", Формат(ДатаДокумента, "ДФ=dd.MM.yyyy"));
Способ Б: Пишем собственную функцию
Чтобы не дублировать код с многократными заменами по всей конфигурации, лучше написать собственную общую функцию, имитирующую поведение СтрШаблон(), и поместить ее в общий модуль.
Вот простой пример такой функции:
&НаСервереБезКонтекста
Функция ФорматироватьСтроку(Знач Шаблон, Параметры) Экспорт
Результат = Шаблон;
// Параметры могут быть переданы как Массив
Если ТипЗнч(Параметры) = Тип("Массив") Тогда
Для Индекс = 0 По Параметры.ВГраница() Цикл
НомерПараметра = Индекс + 1;
ПодстрокаПоиска = "%" + Строка(НомерПараметра);
ЗначениеПараметра = Параметры[Индекс];
Результат = СтрЗаменить(Результат, ПодстрокаПоиска, ЗначениеПараметра);
КонецЦикла;
Иначе
// Или как один параметр, если он всего один
Результат = СтрЗаменить(Результат, "%1", Параметры);
КонецЕсли;
Возврат Результат;
КонецФункции
// Пример вызова:
ПараметрыСообщения = Новый Массив;
ПараметрыСообщения.Добавить(ИмяПользователя);
ПараметрыСообщения.Добавить(ПредставлениеДокумента);
ПараметрыСообщения.Добавить(Формат(ДатаДокумента, "ДФ=dd.MM.yyyy"));
ТекстШаблона = "Пользователь %1 создал документ %2 от даты %3";
ТекстСообщения = ОбщегоНазначения.ФорматироватьСтроку(ТекстШаблона, ПараметрыСообщения);
Этот подход делает код чище и позволяет в будущем легко заменить вызов своей функции на стандартную СтрШаблон(), если вы все же решите обновить режим совместимости.
Ошибка «Процедура или функция с указанным именем не определена (СтрШаблон)» — это не сбой платформы, а прямое следствие настроек вашей конфигурации. Ключевая причина — устаревший режим совместимости.
Выбор решения зависит от ваших задач:
СтрЗаменить().